出 处: bbs.sjtu.edu.cn
【 在 gwh (天元) 的大作中提到: 】 : 我想直接读取ucdos下的矢量字库,请问有谁知道算法? : 急!急!急?/font> : ?/font>
/* 矢量汉字的读取和显示 */ #include <stdio.h> #include <graphics.h> #define HZNUM (0xf7-0xaf)*(0xfe-0xa0) /* 除前16区外的所有汉字 */ #define HZKSIZE 128 /* 汉字的大小 */ #define START_X 0 #define START_Y 0 #define VIEW_H 256 /* 显示汉字的高度 */ #define VIEW_W 256 /* 显示汉字的宽度 */ FILE *fp; struct hz_struct { unsigned long shift; /* 偏移量 */ unsigned int size; /* 大小 */ }HZ_Index[HZNUM]; /* 汉字索引 */ unsigned char buf[1024]; unsigned char dotbuf[1024]; main() { long ioffset; int i,j; char ch; int gdriver=DETECT; int gmode; if((fp=fopen("hzksly1j","rb"))==NULL){ printf("cano't open the HZlib!"); exit(1); } fread(HZ_Index,sizeof(struct hz_struct),HZNUM,fp); //if(registerbgidriver(EGAVGA_driver)<0) exit(1); initgraph(&gdriver,&gmode,""); cleardevice(); setcolor(LIGHTGRAY); for(i=0; i<HZNUM;i++){ Disp_HZ(HZ_Index[i].size,HZ_Index[i].shift); rectangle(START_X,START_Y,START_X+256,START_Y+256); ch=getch(); cleardevice(); if(ch=='q') break; } closegraph(); fclose(fp); }
/* 显示汉字 */ Disp_HZ(int length,long posi) { int i,j,k; int x0,y0,x1,y1; int hzsize; union utype{ unsigned short size; unsigned char str[2]; }BH; if((fseek(fp,posi,0))!=0){ printf("seek\"clib\"error!\n"); exit(0); } memset(buf,0,1024); fread(buf,length,1,fp); hzsize=decode(buf,length); k=0; for(i=0;i<hzsize;i++){ BH.str[0]=dotbuf[k++]; BH.str[1]=dotbuf[k++]; if(BH.size==0)break;/* 每个汉字以0结束 */ x0=START_X+(dotbuf[k++]*VIEW_W)/HZKSIZE; y0=START_Y+(dotbuf[k++]*VIEW_H)/HZKSIZE; // x0=START_X+dotbuf[k++]; // y0=START_Y+dotbuf[k++]; moveto(x0,y0); for(j=0;j<BH.size-1;j++){ x1=START_X+(dotbuf[k++]*VIEW_W)/HZKSIZE; y1=START_Y+(dotbuf[k++]*VIEW_W)/HZKSIZE; // x1=START_X+dotbuf[k++]; // y1=START_Y+dotbuf[k++]; lineto(x1,y1); } lineto(x0,y0); } }
/* 汉字字形还原 */ decode(p,length) unsigned char *p; int length; { int k; int i,count,lposi,xsum,ysum; unsigned char b60; char dxfh,dyfh; char x0,dx,dy; lposi=0; k=2; while((p-buf)<=length){ b60=*p&0xc0; switch(b60){ case 0xc0: if(k!=2){ dotbuf[lposi]=(k-lposi-2)/2; dotbuf[lposi+1]=0; lposi=k++; k++; } x0=(*p&0x3f)<<1; dx=(*(p+1)>>7)&0x01; dx=dx+x0; p++; dy=*p++&0x7f; dotbuf[k++]=xsum=dx; dotbuf[k++]=ysum=dy; break; case 0x80: dxfh=dyfh=1; switch(*p&0x30){ case 0x00: if(*p&0x08)dxfh=-1; dx=*p&0x07; p++; if(*p&0x80)dyfh=-1; dy=*p&0x7f; break; case 0x10: if(*p&0x08)dyfh=-1; dy=*p&0x07; p++; if(*p&0x80)dxfh=-1; dx=*p&0x7f; break; case 0x20: case 0x30: p++; if(*p&0x80)dxfh=-1; dx=*p&0x7f; p++; if(*p&0x80)dyfh=-1; dy=*p&0x7f; break; } p++; xsum+=dx*dxfh; ysum+=dy*dyfh; dotbuf[k++]=xsum; dotbuf[k++]=ysum; break; case 0x40: dxfh=*p&0x30; if(dxfh==0){ dxfh=1; dyfh=1; } else if(dxfh==0x10){ dxfh=-1; dyfh=1; } else if(dxfh==0x20){ dxfh=-1; dyfh=-1; } else if(dxfh==0x30){ dxfh=1; dyfh=-1; } count=*p++&0x0f; for(i=0;i<count;i++){ dx=*p>>4; dy=*p&0x0f; xsum+=dxfh*dx; ysum+=dyfh*dy; dotbuf[k++]=xsum; dotbuf[k++]=ysum; p++; } break; case 00: count=*p++&0x3f; for(i=0;i<count;i++){ if(*p&0x80) dxfh=-1; else dxfh=1; if(*p&0x08)dyfh=-1; else dyfh=1; dx=(*p&0x70)>>4; dy=(*p&0x07); xsum+=dx*dxfh; ysum+=dy*dyfh; dotbuf[k++]=xsum; dotbuf[k++]=ysum; p++; } } } dotbuf[k++]=0; dotbuf[k++]=0; dotbuf[lposi]=(k-lposi-2-2)/2; dotbuf[lposi+1]=0; return k; }
-- ┌————┐ │ 贝 贝 │ └————┘
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: dialup61-024.nj]
|
|