|
广泛汉字矢量字库(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 <stdio.h>
#include <graphics.h>
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<c;i++)
{
if ((buffer&0x80)==0)
x1=x+(buffer>>4);
else
x1=x-((buffer&0x70)>>4);
if ((buffer&0x08)==0)
y1=y+(buffer&0x07);
else
y1=y-(buffer&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>>4);
y1=y+(buffer&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>>4);
y1=y+(buffer&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>>4);
y1=y-(buffer&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>>4);
y1=y-(buffer&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("<Hex:%X,Dec:%u,X=%u,Y=%u,V=%X,Vn=%X>\n",len,len,x,y,c,getc(fp));
break;
}
line(xs,ys,x,y);
getch();
closegraph();
/*printf("--<Hex:%X,Dec:%u,X=%u,Y=%u>\n",len,len,x,y);*/
fclose(fp);
} |
|