邱佩宁个人资料:truetype技术及矢量字库问题,大家请进,分数不是问题,急~~~~~~~~~!!!!!!! VC/MFC / 基础类

来源:百度文库 编辑:九乡新闻网 时间:2024/05/02 23:49:46
                  广泛汉字矢量字库(HZKSLxxJ)格式  
          在矢量字库中,每个汉字都是以128   X   128点阵制成矢量数据。每个汉字  
  的矢量数据都由一指针指向,   指针区在每个汉字字库文件的开头0xBB3E字节。  
  每个汉字矢量数据指针占6个字节,   其格式为:前4个字节为汉字的矢量数据在  
  文件中的偏移,   后2个字节为汉字的矢量数据的长度。  
   
          汉字指针在指针区的偏移由公式计算:pos=((qu-16)*94+wei-1)*6。  
                          注:qu--区号。wei--位号。  
   
          汉字的矢量数据格式为:控制码+坐标值。共有十种控制码,以下是控制码的   含义:  
          (1)若控制码第7,6位为11,清除码,结束当前笔划,将第一个坐标与当前坐  
  标连线;建立新笔划,(X,Y)各占7位,由控制码的第5位开始,即:11XXXXXX   XYYYYYYY。  
                  注:一个字节的位:  
                        7   6   5   4   3   2   1   0  
                        X   X   X   X   X   X   X   X  
          (2)若控制码小于等于0x40,之后控制码大小个字节为坐标值,每个坐标占   一个字节,  
  共有控制码大小个坐标,(X,Y)坐标各占4位,其自的最高位为符号位,   即:FXXXFYYY。  
          (3)若控制码的高4位等于4,之后控制码的低4位大小个字节为坐标值,每个  
  坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为正,Y为正,  
  即:+XXXX+YYYY。  
          (4)若控制码的高4位等于5,之后控制码的低4位大小个字节为坐标值,每个  
  坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为负,Y为正,  
  即:-XXXX+YYYY。  
          (5)若控制码的高4位等于6,之后控制码的低4位大小个字节为坐标值,每个  
  坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为负,Y为负,  
  即:-XXXX-YYYY。  
          (6)若控制码的高4位等于7,之后控制码的低4位大小个字节为坐标值,每个  
  坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为正,Y为负,  
  即:+XXXX-YYYY。  
          (7)若控制码等于0x80,   其后1字节为Y坐标值,   最高位为符号位,   X坐标不   变,   即:  
  10000000   FYYYYYYY。  
          (8)   若控制码等于0x90,   其后1字节为X坐标值,   最高位为符号位,   Y坐标不   变,即:  
  10000001   FXXXXXXX。  
          (9)   若控制码的高4位等于8,其后1字节为Y坐标值,控制码的低4位值为X坐  
  标值,X坐标各占4位,最高位为符号位,Y坐标各占8位,最高位为符号位,   即:1000FXXX  
  FYYYYYYY。  
          (10)若控制码的高4位等于9,其后1字节为X坐标值,控制码的低4位值为Y坐  
  标值,Y坐标各占4位,最高位为符号位,X坐标各占8位,最高位为符号位,   即:1000FYYY  
  FXXXXXXX。  
  -------------------------------------------------------------------------  
  用Turbo   C   2.0编译以下程序:  
  #include    
  #include    
  main()  
  {  
    unsigned   long   int   pos;  
    unsigned   int   i,j,k,len,q,w;  
    unsigned   char   c,a,x=0,y=0,x1,y1,xs=0,ys=0,buffer[100];  
    FILE   *fp;  
    int   d=DETECT,m=VGAHI;  
    if((fp=fopen("hzkslt","rb"))==NULL)   return;  
  /*                           ^^^^^^汉字字库的文件名                           */  
    printf("Input   Qu   :");scanf("%u",&q);  
    printf("Input   Wei:");scanf("%u",&w);  
    printf("\n");  
    pos=((q-1l)*94l+w-1l)*6l;  
    fseek(fp,pos,0);  
    fread(&pos,4,1,fp);  
  /*   printf("%lX   :   ",pos);*/  
    fread(&len,2,1,fp);  
    fseek(fp,pos,0);  
    initgraph(&d,&m,"   ");  
    while   (len!=0)  
    {  
      c=getc(fp);  
      len--;  
      if   ((c&0xf0)>=0xc0)  
      {  
        if   (q==0)  
          line(xs,ys,x,y);  
        x=c;  
        fread(&y,1,1,fp);  
        len--;  
        a=y;  
        y>>=7;  
        x=x&0x3f;  
        x<<=1;  
        x=x+y;  
        y=a&0x7f;  
        x1=x;y1=y;  
        xs=x;ys=y;  
        q=0;  
        continue;  
      }  
      /*if   ((c&0xf0)==0x00   &&   (c&0x0f)!=0)*/  
      if   (c<0x40   &&   c!=0)  
      {  
        fread(buffer,1,c,fp);  
        len-=c;  
        for(i=0;i         {  
          if   ((buffer[i]&0x80)==0)  
            x1=x+(buffer[i]>>4);  
          else  
            x1=x-((buffer[i]&0x70)>>4);  
          if   ((buffer[i]&0x08)==0)  
            y1=y+(buffer[i]&0x07);  
          else  
            y1=y-(buffer[i]&0x07);  
          line(x,y,x1,y1);  
          x=x1;  
          y=y1;  
        }  
        continue;  
      }  
      if   ((c&0xf0)==0x40   &&   (c&0x0f)!=0)  
      {  
        fread(buffer,1,(c&0x0f),fp);  
        len-=(c&0x0f);  
        for(i=0;i<(c&0x0f);i++)  
        {  
          x1=x+(buffer[i]>>4);  
          y1=y+(buffer[i]&0x0f);  
          line(x,y,x1,y1);  
          x=x1;  
          y=y1;  
        }  
        continue;  
      }  
      if   ((c&0xf0)==0x50   &&   (c&0x0f)!=0)  
      {  
        fread(buffer,1,(c&0x0f),fp);  
        len-=(c&0x0f);  
        for(i=0;i<(c&0x0f);i++)  
        {  
          x1=x-(buffer[i]>>4);  
          y1=y+(buffer[i]&0x0f);  
          line(x,y,x1,y1);  
          x=x1;  
          y=y1;  
        }  
        continue;  
      }  
      if   ((c&0xf0)==0x60   &&   (c&0x0f)!=0)  
      {  
        fread(buffer,1,(c&0x0f),fp);  
        len-=(c&0x0f);  
        for(i=0;i<(c&0x0f);i++)  
        {  
          x1=x-(buffer[i]>>4);  
          y1=y-(buffer[i]&0x0f);  
          line(x,y,x1,y1);  
          x=x1;  
          y=y1;  
        }  
        continue;  
      }  
      if   ((c&0xf0)==0x70   &&   (c&0x0f)!=0)  
      {  
        fread(buffer,1,(c&0x0f),fp);  
        len-=(c&0x0f);  
        for(i=0;i<(c&0x0f);i++)  
        {  
          x1=x+(buffer[i]>>4);  
          y1=y-(buffer[i]&0x0f);  
          line(x,y,x1,y1);  
          x=x1;  
          y=y1;  
        }  
        continue;  
      }  
      if   ((c&0xf0)==0x80   &&   (c&0x0f)==0x00)  
      {  
        buffer[0]=getc(fp);  
        len--;  
        if   ((buffer[0]&0x80)==0x80)  
          y1=y-(buffer[0]&0x7f);  
        else  
          y1=y+buffer[0];  
        line(x,y,x,y1);  
        y=y1;  
        continue;  
      }  
      if   ((c&0xf0)==0x80   &&   (c&0x0f)!=0x00)  
      {  
        buffer[0]=getc(fp);  
        len--;  
        if   ((c&0x08)==0x08)  
          x1=x-(c&0x07);  
        else  
          x1=x+(c&0x07);  
        if   ((buffer[0]&0x80)==0x80)  
          y1=y-(buffer[0]&0x7f);  
        else  
          y1=y+buffer[0];  
        line(x,y,x1,y1);  
        x=x1;  
        y=y1;  
        continue;  
      }  
      if   ((c&0xf0)==0x90   &&   (c&0x0f)==0x00)  
      {  
        buffer[0]=getc(fp);  
        len--;  
        if   ((buffer[0]&0x80)==0x80)  
          x1=x-(buffer[0]&0x7f);  
        else  
          x1=x+buffer[0];  
        line(x,y,x1,y);  
        x=x1;  
        continue;  
      }  
      if   ((c&0xf0)==0x90   &&   (c&0x0f)!=0x00)  
      {  
        buffer[0]=getc(fp);  
        len--;  
        if   ((buffer[0]&0x80)==0x80)  
          x1=x-(buffer[0]&0x7f);  
        else  
          x1=x+buffer[0];  
        if   ((c&0x08)==0x08)  
          y1=y-(c&0x07);  
        else  
          y1=y+(c&0x07);  
        line(x,y,x1,y1);  
        x=x1;  
        y=y1;  
        continue;  
      }  
      if   (c==0xb0)  
      {  
        buffer[0]=getc(fp);  
        buffer[1]=getc(fp);  
        len-=2;  
        if   ((buffer[0]&0x80)==0)  
          x1=x+(buffer[0]&0x7f);  
        else  
          x1=x-(buffer[0]&0x7f);  
        if   ((buffer[1]&0x80)==0)  
          y1=y+(buffer[1]&0x7f);  
        else  
          y1=y-(buffer[1]&0x7f);  
        line(x,y,x1,y1);  
        x=x1;  
        y=y1;  
        continue;  
      }  
      getch();  
      closegraph();  
      printf("\n",len,len,x,y,c,getc(fp));  
      break;  
    }  
    line(xs,ys,x,y);  
    getch();  
    closegraph();  
    /*printf("--\n",len,len,x,y);*/  
    fclose(fp);  
  }