中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS汉化世界 & 中文系统 (中文化室) » UCDOS 5.0 版本以上曲线字库汉字显示程序源代码
作者:
标题: UCDOS 5.0 版本以上曲线字库汉字显示程序源代码 上一主题 | 下一主题
lhsong
初级用户





积分 47
发帖 12
注册 2008-9-5
状态 离线
『楼 主』:  UCDOS 5.0 版本以上曲线字库汉字显示程序源代码

若字库为5.0版,应去掉下面一段代码
if(j==1){                    //若为汉字,调整地址偏移值
      hz.offset-=0x10000000;
  }
希望大家能够喜欢!!!!!!!
#include "d:\borland\user\src\graphics.h"
#include "d:\borland\user\src\graphics.c"

#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <mem.h>
#include <alloc.h>
#include <dir.h>
#include <dos.h>
#include <stdlib.h>
#define  baseSize 250    //此值越大,字体越小,原值为168
#define  portion  100     //100

FILE *fpfh,*fphz,*fpe,*fp;


int X0,Y0,xRange,yRange,curX,curY;
int newX0,newY0,newxRange,newyRange;
unsigned char *wordCont_0=NULL,*wordCont_8=NULL;
unsigned bytesNum_0,bytesNum_8;
unsigned char myread(void);
void control(int *xx,int *yy,unsigned char controlWord,int nowxRange,
             int nowyRange,int nowX0,int nowY0,int call_8_0);
void showhz(char *fontfileName,unsigned long col);
void b3_4(int *x,int *y,unsigned long col);
void b3_3(int *x,int *y,unsigned long col);

int readbyte(void);

int readcount;
static unsigned char next;    //用于读取字节高四位、低四位的标志,1读高位,0读低位

typedef struct _hz{
            unsigned long offset;    //4字节
            unsigned int length;     //2字节
         }hz_;
hz_ hz;

unsigned char hzdata[1024];  //用于读取字型数据



void main(void)
{
       
  unsigned char *hzstring="然字Mm骤啊H骤g9酆8G字,汉,然。!!戆";//戆您原回骤然燃";//"共有汉字个骤";原骤戆啊汉字

  long color;

  initgraph(VBE480_16M);

  X0=Y0=1;xRange=yRange=152;//原值为152
  showhz(hzstring,rgbcolor(255,0,0));
     
  getch();
  cleardevice();
  closegraph();
}

void showhz(char *hzstring,unsigned long col)
{
  unsigned long oldcolor;
  unsigned long wordOffset;
  unsigned char qm,wm;
  int bx,by;    //用于记录笔画的起始点坐标
  int xx[4],yy[4],controlWord,i,j,m=0;
  char ch,cha,chx,chy,chxx,chyy;
  char mark1_x,mark1_y,mark2_x,mark2_y,mark3_x,mark3_y;
  char *fontFileName="HZKPSKTJ";//HZKPSXKJ";//HZKPSST.GBK";//"HZKPSHTJ";//"HZKPSFSJ";//"HZKPSXBJ";HZKPSKTJ;HZKPSY3J;ASCPS;HZKPST;HZKPSDHJ,HZKPSYTJ
    oldcolor=getcolor();
    setcolor(col);
    if((fpfh=fopen("HZKPST","rb"))==NULL) { //打开中文符号曲线字库
    printf("Cannot open %s file\n","HZKPST");
    exit(0);
       }
    if((fphz=fopen(fontFileName,"rb"))==NULL) { //打开中文曲线字库,若为GBK字库,则打开的是GBK字库
    printf("Cannot open %s file\n",fontFileName);
    exit(0);
      }
    if((fpe=fopen("ASCPS","rb"))==NULL) {    //打开英文曲线字库
    printf("Cannot open %s file\n","ASCPS");
    exit(0);
       }
   i=0;
while(i<strlen(hzstring))
{
  readcount=0;
  next=0;
  if((hzstring[i]&0x80)==0x80){          //判断是否为汉字,相等,即最高位是1,则为汉字
        qm=hzstring[i]-0xa0;       //区码
        wm=hzstring[i+1]-0xa0;     //位码
        j=1;                //作为汉字的标志,用于调整地址偏移
              if(strcmp(strrchr(fontFileName, '.')+1,"GBK")==0){     //首先找到最后一个'.'的位置,加1使指针指向'.'后的第一个字符,然后进行比较,判断是否是GBK字库
               fp=fphz;                                  //GBK字库仍有部分汉字缺失,如“镕”字,在字库中不存在
                     wordOffset=(((long)qm-1)*94+(wm-1))*6;    //GBK字库已包含了16区以前的汉字符号字库,计算地址时,区码应减去1,而不是减去6   
           }
        else {   //不是GBK字库
            if(qm>=16){            //16区以后的汉字
                      fp=fphz;
                      wordOffset=(((long)qm-16)*94+(wm-1))*6;    //16区以后的汉字偏移   
                    }
                  else{                //16区以前的汉字符号
                            fp=fpfh;
                            wordOffset=(((long)qm-1)*94+(wm-1))*6;       //16区以前的汉字符号偏移
                         }
                    }
        i+=2;             //汉字为两字节
      }
    else{          //是英文字符
              fp=fpe;
              wordOffset=(0*94+(hzstring[i]-32)-1)*6;         //英文字体共有十种0~9,设字体号为N,字符ASCII码为CC,则英文字符偏移为(N*94+(CC-32)-1)*6,空格的ASCII码值为32,但在字库中不存在,字库的起始字符是'!'号,值为33,实际应减33,字库中每种字体字符数为94个
        i+=1;
          }
         
  fseek(fp,wordOffset,SEEK_SET);
  fread(&hz,sizeof(hz_),1,fp);
  if(j==1){                    //若为汉字,调整地址偏移值
      hz.offset-=0x10000000;
      j=0;
  }
  fseek(fp,hz.offset,SEEK_SET);
  fread(hzdata,1,hz.length,fp);
  while(readcount<hz.length) {
                     ch=myread();      //取控制码
                     switch(ch){
                             case 0:                //新起点          0000
                                     if(readcount>0)lineto(bx,by);     //整个字的第一个起点时不连接,将笔画的最后一个点与起始点相连,将笔画封闭
                             xx[0]=readbyte();
                             yy[0]=readbyte();
                             xx[0]=xRange*xx[0]/baseSize+0.5;
                             yy[0]=yRange*yy[0]/baseSize+0.5;
                             xx[0]+=X0;yy[0]+=Y0;
                             moveto(xx[0],yy[0]);         //笔画起点
                             curX=xx[0];curY=yy[0];
                             bx=xx[0];by=yy[0];          //记录笔画的起始点坐标
                             break;
                                    
                             case 1:
                                          xx[0]=readbyte();
                             xx[0]=xRange*xx[0]/baseSize+0.5;
                             xx[0]+=X0;
                             lineto(xx[0],curY);
                             curX=xx[0];
                             break;
                                          
                             case 2:       
                                    yy[0]=readbyte();
                                    yy[0]=yRange*yy[0]/baseSize+0.5;
                             yy[0]+=Y0;
                                    lineto(curX,yy[0]);
                             curY=yy[0];
                             break;
                                    
                             case 3:
                                          xx[0]=readbyte();
                             yy[0]=readbyte();
                             xx[0]=xRange*xx[0]/baseSize+0.5;
                             yy[0]=yRange*yy[0]/baseSize+0.5;
                             xx[0]+=X0;yy[0]+=Y0;
                             lineto(xx[0],yy[0]);
                             curX=xx[0];curY=yy[0];
                             break;
                                          
                             case 4:       
                                    xx[0]=curX;yy[0]=curY;
                             xx[1]=readbyte();
                             yy[1]=readbyte();
                             xx[2]=readbyte();
                             yy[2]=readbyte();
                             xx[1]=xRange*xx[1]/baseSize+0.5;
                             yy[1]=yRange*yy[1]/baseSize+0.5;
                             xx[2]=xRange*xx[2]/baseSize+0.5;
                             yy[2]=yRange*yy[2]/baseSize+0.5;
                             xx[1]+=X0;yy[1]+=Y0;
                             xx[2]+=X0;yy[2]+=Y0;
                             b3_3(xx,yy,COLOR);
                             curX=xx[2];curY=yy[2];
                             moveto(curX,curY);
                             break;
                                  
                             case 5:
                                          xx[0]=curX;yy[0]=curY;
                             xx[1]=readbyte();
                             yy[1]=readbyte();
                             xx[2]=readbyte();
                             yy[2]=readbyte();
                             xx[3]=readbyte();
                             yy[3]=readbyte();
                             xx[1]=xRange*xx[1]/baseSize+0.5;
                             yy[1]=yRange*yy[1]/baseSize+0.5;
                             xx[2]=xRange*xx[2]/baseSize+0.5;
                             yy[2]=yRange*yy[2]/baseSize+0.5;
                             xx[3]=xRange*xx[3]/baseSize+0.5;
                             yy[3]=yRange*yy[3]/baseSize+0.5;
                             for(m=1;m<4;m++) {
                                  xx[m]+=X0;yy[m]+=Y0;
                                }
                             b3_4(xx,yy,COLOR);
                             curX=xx[3];curY=yy[3];
                             moveto(curX,curY);
                             break;
                                         
                             case 6:       
                                    xx[0]=readbyte();
                             yy[0]=readbyte();
                             xx[1]=readbyte();
                             yy[1]=readbyte();
                             xx[0]=xRange*xx[0]/baseSize+0.5;
                             yy[0]=yRange*yy[0]/baseSize+0.5;
                             xx[1]=xRange*xx[1]/baseSize+0.5;
                             yy[1]=yRange*yy[1]/baseSize+0.5;
                             for(m=0;m<2;m++) {
                                  xx[m]+=X0;yy[m]+=Y0;
                              }
                             rectangle(xx[0],yy[0],xx[1],yy[1]);
                             break;
                               
                             case 7:
                                          mark1_x=1;
                                          ch=myread();
                                          if(ch&8)mark1_x=-1;
                                          ch&=7;
                                          xx[0]=curX+ch*mark1_x*xRange/baseSize+0.5;
                                          yy[0]=readbyte();
                                          yy[0]=yRange*yy[0]/baseSize+0.5;
                                          yy[0]+=Y0;
                                          lineto(xx[0],yy[0]);
                                          curX=xx[0];curY=yy[0];
                             break;
                                          
                             case 8:       
                                          mark1_y=1;
                                    xx[0]=readbyte();
                                    xx[0]=xRange*xx[0]/baseSize+0.5;
                                    xx[0]+=X0;
                                    ch=myread();
                                    if(ch&8)mark1_y=-1;
                                          ch&=7;
                                                 yy[0]=curY+ch*mark1_y*yRange/baseSize+0.5;
                             lineto(xx[0],yy[0]);
                                          curX=xx[0];curY=yy[0];
                             break;
                            
                             case 9:
                                          mark1_x=1;
                                          mark1_y=1;
                                          ch=myread();
                                          if(ch&8)mark1_x=-1;
                                          ch&=7;
                                          xx[0]=curX+ch*mark1_x*xRange/baseSize+0.5;
                                          ch=myread();
                                    if(ch&8)mark1_y=-1;
                                          ch&=7;
                                          yy[0]=curY+ch*mark1_y*yRange/baseSize+0.5;
                                   lineto(xx[0],yy[0]);
                                          curX=xx[0];curY=yy[0];
                             break;
                                          
                             case 10:       
                                          mark1_x=1;
                                          mark1_y=1;
                                          ch=myread();          //第一次读取的四位作为六位数据的高四位
                                          cha=myread();         //第二次读取的四位的高两位作为六位数据的低两位,低两位作为第二个六位数的高两位
                                          ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark1_x=-1;
                                          ch&=0x1f;
                                          xx[0]=curX+ch*mark1_x*xRange/baseSize+0.5;
                                         ch=myread();          //第三次读取的四位作为第二个六位数的低四位
                                          ch=((cha&0x03)<<4)+ch;
                                    if(ch&0x20)mark1_y=-1;
                                          ch&=0x1f;
                                          yy[0]=curY+ch*mark1_y*yRange/baseSize+0.5;
                                   lineto(xx[0],yy[0]);
                                          curX=xx[0];curY=yy[0];
                             break;
                                          
                             case 11:
                                          mark1_x=1;
                                          mark1_y=1;
                                          mark2_x=1;
                                          mark2_y=1;
                                          xx[0]=curX;yy[0]=curY;
                                          ch=myread();
                                          if(ch&8)mark1_x=-1;
                                          chx=ch=(ch&7)*mark1_x;
                                          xx[1]=curX+ch*xRange/baseSize+0.5;
                                          
                                          ch=myread();
                                          if(ch&8)mark1_y=-1;
                                          chy=ch=(ch&7)*mark1_y;
                                          yy[1]=curY+ch*yRange/baseSize+0.5;
                                         
                                         ch=myread();
                                    if(ch&8)mark2_x=-1;
                                    ch=(ch&7)*mark2_x;       
                                    xx[2]=curX+(chx+ch)*xRange/baseSize+0.5;   
                                             
                                         ch=myread();  
                             if(ch&8)mark2_y=-1;
                             ch=(ch&7)*mark2_y;
                             yy[2]=curY+(chy+ch)*yRange/baseSize+0.5;
                           
                             b3_3(xx,yy,COLOR);
                             curX=xx[2];curY=yy[2];
                             moveto(curX,curY);
                             break;
                                          
                             case 12:       
                                          mark1_x=1;
                                          mark1_y=1;
                                          mark2_x=1;
                                          mark2_y=1;
                                          
                                    xx[0]=curX;yy[0]=curY;
                             ch=myread();            //1
                             cha=myread();           //2
                                          ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark1_x=-1;
                                           chx=ch=(ch&0x1f)*mark1_x;
                                          xx[1]=curX+ch*xRange/baseSize+0.5;
                                                                                          
                                          ch=myread();           //3
                                          ch=((cha&0x03)<<4)+ch;
                                          
                                    if(ch&0x20)mark1_y=-1;
                                          chy=ch=(ch&0x1f)*mark1_y;
                                    yy[1]=curY+ch*yRange/baseSize+0.5;
                            
                             ch=myread();      //1
                             cha=myread();     //2
                             ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark2_x=-1;
                                           ch=(ch&0x1f)*mark2_x;
                                          xx[2]=curX+(chx+ch)*xRange/baseSize+0.5;                                                              
                                                
                                          ch=myread();         //3
                                          ch=((cha&0x3)<<4)+ch;
                                    if(ch&0x20)mark2_y=-1;
                                    ch=(ch&0x1f)*mark2_y;
                                          yy[2]=curY+(chy+ch)*yRange/baseSize+0.5;
                             b3_3(xx,yy,COLOR);
                             curX=xx[2];curY=yy[2];
                             moveto(curX,curY);
                             break;
                                    
                             case 13:
                                          mark1_x=1;
                                          mark1_y=1;
                                          mark2_x=1;
                                          mark2_y=1;
                                          mark3_x=1;
                                          mark3_y=1;
                                          xx[0]=curX;yy[0]=curY;
                                          ch=myread();
                             if(ch&8)mark1_x=-1;
                             chx=ch=(ch&7)*mark1_x;
                             xx[1]=curX+ch*xRange/baseSize+0.5;
                                                
                                          ch=myread();
                                    if(ch&8)mark1_y=-1;
                                          chy=ch=(ch&7)*mark1_y;
                                          yy[1]=curY+ch*yRange/baseSize+0.5;
                                                
                                         ch=myread();
                             if((ch)&8)mark2_x=-1;
                             chxx=ch=(ch&7)*mark2_x;
                                          xx[2]=curX+(chx+ch)*xRange/baseSize+0.5;
                                               
                                          ch=myread();
                                    if((ch)&8)mark2_y=-1;
                                    chyy=ch=(ch&7)*mark2_y;
                                          yy[2]=curY+(chy+ch)*yRange/baseSize+0.5;
                                                                
                             ch=myread();
                             if((ch)&8)mark3_x=-1;
                             ch=(ch&7)*mark3_x;
                                          xx[3]=curX+(chx+chxx+ch)*xRange/baseSize+0.5;
                             
                             ch=myread();
                                    if((ch)&8)mark3_y=-1;
                                    ch=(ch&7)*mark3_y;
                                          yy[3]=curY+(chy+chyy+ch)*yRange/baseSize+0.5;
                             b3_4(xx,yy,COLOR);
                             curX=xx[3];curY=yy[3];
                             moveto(curX,curY);
                             break;
                                          
                             case 14:       
                                          mark1_x=1;
                                          mark1_y=1;
                                          mark2_x=1;
                                          mark2_y=1;
                                          mark3_x=1;
                                          mark3_y=1;
                                          xx[0]=curX;yy[0]=curY;
                                          ch=myread();                         //1
                                          cha=myread();                        //2
                                          ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark1_x=-1;
                                         chx=ch=(ch&0x1f)*mark1_x;
                                          xx[1]=curX+ch*xRange/baseSize+0.5;
                                                          
                                          ch=myread();                          //3
                                          ch=((cha&0x03)<<4)+ch;
                                    if(ch&0x20)mark1_y=-1;
                                    chy=ch=(ch&0x1f)*mark1_y;
                                          yy[1]=curY+ch*yRange/baseSize+0.5;
                                                
                             ch=myread();                       //1
                             cha=myread();                      //2
                             ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark2_x=-1;
                                          chxx=ch=(ch&0x1f)*mark2_x;
                                          xx[2]=curX+(chx+ch)*xRange/baseSize+0.5;
                                          
                                          ch=myread();                         //3
                                          ch=((cha&0x03)<<4)+ch;
                                    if(ch&0x20)mark2_y=-1;
                                    chyy=ch=(ch&0x1f)*mark2_y;
                                          yy[2]=curY+(chy+ch)*yRange/baseSize+0.5;
                                          
                             ch=myread();             //1
                             cha=myread();            //2
                             ch=(ch<<2)+(cha>>2);
                                          if(ch&0x20)mark3_x=-1;
                                          ch=(ch&0x1f)*mark3_x;
                                          xx[3]=curX+(chx+chxx+ch)*xRange/baseSize+0.5;
                                             
                                          ch=myread();                //3
                                          ch=((cha&0x03)<<4)+ch;
                                    if(ch&0x20)mark3_y=-1;
                                    ch=(ch&0x1f)*mark3_y;
                                          yy[3]=curY+(chy+chyy+ch)*yRange/baseSize+0.5;
                                          b3_4(xx,yy,COLOR);
                             curX=xx[3];curY=yy[3];
                             moveto(curX,curY);
                             break;
                                          
                             case 15:    //仅读取两个字节,不作处理
                                          readbyte();
                                          readbyte();
                                          break;
                    
                   }
         }
         
         if((readcount<hz.length))lineto(bx,by);     //将最后一个笔画的最后一个点与起始点相连,将笔画封闭
         getch();
         X0+=xRange*168/baseSize+0.5;    //此处为168较合适,但未找到原因
               if(getmaxx()-X0<xRange*168/baseSize){
               X0=0;
               Y0+=yRange*168/baseSize+0.5;
            }
          if(getmaxy()-Y0<yRange*168/baseSize){
               Y0=0;
               X0=0;
               getch();
               cleardevice();
            }
     }
  setcolor(oldcolor);
  fp=0;
  fclose(fpe);
  fclose(fpfh);
  fclose(fphz);
  return;
}



unsigned char myread(void)   //每调用一次,读出一个字节的四位数,先读低四位,后读高四位
{
        unsigned char a;
        if(!next){                    //next等于0时读取低四位,为1时读取高四位
                      a=hzdata[readcount]&0x0f;
                      next=1;
                }
         else{
                      a=(hzdata[readcount]&0xf0)>>4;
                      readcount++;
                       next=0;
                 }       
        return a;
}
       
int readbyte(void)
{
        int kk=0;
        unsigned char a,b;
        a=myread()<<4;
        b=myread();
        kk=(int)(b+a);
        return kk;
        }

void b3_4(int *x,int *y,unsigned long col)      //三次B样条曲线,n可以指定常数
{ int n,*bx,*by,sign=1,j=0,k,i;
  double a,b,c,d,dt,xx,f0_3,f_0,f_1,f_2;
  n=xx=sqrt(((double)(x[1]-x[0]))*((double)(x[1]-x[0]))+
       ((double)(y[1]-y[0]))*((double)(y[1]-y[0])))+
       sqrt(((double)(x[2]-x[1]))*((double)(x[2]-x[1]))+
       ((double)(y[2]-y[1]))*((double)(y[2]-y[1])))+
       sqrt(((double)(x[3]-x[2]))*((double)(x[3]-x[2]))+
       ((double)(y[3]-y[2]))*((double)(y[3]-y[2])));
   
  if(xx>n) n++;
  n*=2;
  if(n==0) n=20;
  do {
    bx=(int *)malloc(n*sizeof(int));
    by=(int *)malloc(n*sizeof(int));
    if((!bx)||(!by)) {
      /*printf("Memory Alloction Error!");*/
      return;
    }
    dt=(double)1/(double)n;
    a=((-1)*x[0]+3*x[1]-3*x[2]+x[3]);
    b=3*(x[0]-2*x[1]+x[2]);
    c=3*(x[1]-x[0]);
    d=x[0];
    f0_3=6*a*dt*dt*dt;
    f_2=f0_3+2*b*dt*dt;
    f_1=f0_3/6+b*dt*dt+c*dt;
    f_0=d;
    bx[0]=f_0+0.5;
    for(i=0;i<n;i++) {
      f_0+=f_1;
      bx[i]=f_0+0.5;
      f_1+=f_2;
      f_2+=f0_3;
    }
    a=((-1)*y[0]+3*y[1]-3*y[2]+y[3]);
    b=3*(y[0]-2*y[1]+y[2]);
    c=3*(y[1]-y[0]);
    d=y[0];
    f0_3=6*a*dt*dt*dt;
    f_2=f0_3+2*b*dt*dt;
    f_1=f0_3/6+b*dt*dt+c*dt;
    f_0=d;
    bx[0]=f_0+0.5;
    for(i=0;i<n;i++) {
      f_0+=f_1;
      by[i]=f_0+0.5;
      f_1+=f_2;
      f_2+=f0_3;
    }
    sign=1;j=0;k=n/100+1;
    for(i=1;i<n;i++) {
      if((abs(bx[i]-bx[i-1])>1)||(abs(by[i]-by[i-1])>1)) j++;
      if(j>k) {
        free(bx); free(by);
        if(n>3) n=n+n/3;
        else n=6;
        sign=0;
      } break;
    }
  } while(sign==0);
  for(i=1;i<n;i++)
    if((bx[i]!=bx[i-1])||(by[i]!=by[i-1])) putpixel(bx[i],by[i],col);
  free(bx); free(by);
}

void b3_3(int *x,int *y,unsigned long col)        //二次B样条曲线,n可以指定常数
{ int n,*bx,*by,sign=1,j=0,k,i;
  double a,b,c,d,dt,xx,f0_3,f_0,f_1,f_2;
  n=xx=sqrt(((double)(x[1]-x[0]))*((double)(x[1]-x[0]))+
       ((double)(y[1]-y[0]))*((double)(y[1]-y[0])))+
       sqrt(((double)(x[2]-x[1]))*((double)(x[2]-x[1]))+
       ((double)(y[2]-y[1]))*((double)(y[2]-y[1])));
      
  if(xx>n) n++;
  n*=4;
  if(n==0) n=20;
  do {
    bx=(int *)malloc(n*sizeof(int));
    by=(int *)malloc(n*sizeof(int));
    if((!bx)||(!by)) {
      /*printf("Memory Alloction Error!");*/
      return;
    }
    dt=(double)1/(double)n;
    b=x[0]-2*x[1]+x[2];
    c=2*(x[1]-x[0]);
    d=x[0];
    f_2=2*b*dt*dt;
    f_1=b*dt*dt+c*dt;
    f_0=d;
    bx[0]=f_0+0.5;
    for(i=0;i<n;i++) {
      f_0+=f_1;
      bx[i]=f_0+0.5;
      f_1+=f_2;
    }
    b=y[0]-2*y[1]+y[2];
    c=2*(y[1]-y[0]);
    d=y[0];
    f_2=2*b*dt*dt;
    f_1=b*dt*dt+c*dt;
    f_0=d;
    by[0]=f_0+0.5;
    for(i=0;i<n;i++) {
      f_0+=f_1;
      by[i]=f_0+0.5;
      f_1+=f_2;
    }
    sign=1;j=0;k=n/100+1;
    for(i=1;i<n;i++) {
      if((abs(bx[i]-bx[i-1])>1)||(abs(by[i]-by[i-1])>1)) j++;
      if(j>k) {
        free(bx); free(by);
        if(n>3) n=n+n/3;
        else n=6;
        sign=0;
      } break;
    }
  } while(sign==0);
  for(i=1;i<n;i++)
    if((bx[i]!=bx[i-1])||(by[i]!=by[i-1]))
                {
                putpixel(bx[i],by[i],col);
              
              }
  free(bx); free(by);
}


   此帖被 +6 点积分     点击查看详情   
评分人:【 DOSroot 分数: +6  时间:2009-4-17 04:07


2009-2-5 22:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lidawei
新手上路





积分 6
发帖 3
注册 2008-2-14
状态 离线
『第 2 楼』:  感谢lhsong的无私奉献

  近日心血来潮,看起了UCDOS的rdfnt.com,虽然DOS的知识已荒废多年,当年的资料也因束之高阁而基本上无法查阅(好象当年手头也没UCDOS的什么资料,现在想找UCDOS系统调用规范之类的东西,google几天都找不到),还是凭兴趣看了好几日,主要看了点阵字库,PS只看了控制码转为坐标部分。虽未看完,但还是再次感叹汇编程序的精致,30来K的程序,其中还有10多K是工作存储区、4-5K是各字库参数定义,指令部分估计也就10多K,如此一小段程序即可完成包括点阵、矢量、PS字库的检索、匹配、解码、变换等操作,真是令人佩服。
  偶见楼主的文章,想谈谈一点自己的看法。
  文章开头部分有

  Quote:
 若字库为5.0版,应去掉下面一段代码
 if(j==1){                    //若为汉字,调整地址偏移值
       hz.offset-=0x10000000;
   }

的说明,按我的理解,汉字数据的偏移不应是减去0x10000000,此偏移应该实际只有24bit即3字节,第4字节定义的不是偏移,而是此汉字数据的附加格式。从int 7eh进入rdfnt的获得汉字点阵功能后不远处的一个过程有如下的操作:
 mov   ax,es:[di]        刚才读入的6字节 PS或矢量数据的偏移低字
 mov   dx,es:[di+2] PS或矢量数据的偏移高字
 mov   cx,es:[di+4] 长度
 jcxz   ...
 or     zk_type,dh
 mov   dh,0     清0数据指针的最高字节,剩下3字节
...
 call   read_hz    移动文件指针,dx,ax=偏移,读文件,读cx字节于ds:di中
可见其4字节的最高字节不是用于寻址的,而是定义信息。rdfnt除了可读点阵字库、解码PS字库外,尚可解码矢量字库,对于不同的PS、矢量字库,有可能某些字库该字节不是0x10(未各字库逐个汉字检查过,无法证实),如果都减去此一固定值,有可能会出错。
  有一篇文章叫“UCDOS的曲线轮廓字库的分析”,里面也说到ucdos6中偏移应减去0x10000000的事,不知楼主这里的减去0x10000000是否源自该处?

2009-2-18 12:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lhsong
初级用户





积分 47
发帖 12
注册 2008-9-5
状态 离线
『第 3 楼』:  

谢谢楼上的指点,

“0x10000000”值确实是来自“UCDOS的曲线轮廓字库的分析”一文,不过,我察看了5.0字库和6.0字库,确实是在6.0曲线字库的第四个字节增加了定义,但不知其实际用途。

还希望高手能给予指点。

2009-2-21 21:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
oookkk2008
新手上路





积分 5
发帖 2
注册 2009-4-16
状态 离线
『第 4 楼』:  

好,学习了,谢谢

2009-4-17 01:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenyucheng
初级用户

我是新人



积分 146
发帖 68
注册 2023-7-21
来自 浙江省台州市
状态 离线
『第 5 楼』:  


unsigned char *hzstring="然字Mm骤啊H骤g9酆8G字,汉,然。!!戆";//戆您原回骤然燃";//"共有汉字个骤";原骤戆啊汉字
这是什么啊



新手上路!
现在的我来研究研究,我小时没用过的操作系统--DOS。古老的DOS资源比较稀缺,现在新开发的DOS软件也很少,还需要大家的努力,让DOS重焕新生。
2023-8-1 10:16
查看资料  发送邮件  发短消息 网志  OICQ (744766348)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: