truetype技術(shù)及矢量字庫問(wèn)題,大家請進(jìn),分數不是問(wèn)題,急~~~~~~~~~!!!!!!! VC/MFC / 基礎類(lèi)
廣泛漢字矢量字庫(HZKSLxxJ)格式
在矢量字庫中,每個(gè)漢字都是以128 X 128點(diǎn)陣制成矢量數據。每個(gè)漢字
的矢量數據都由一指針指向, 指針區在每個(gè)漢字字庫文件的開(kāi)頭0xBB3E字節。
每個(gè)漢字矢量數據指針占6個(gè)字節, 其格式為:前4個(gè)字節為漢字的矢量數據在
文件中的偏移, 后2個(gè)字節為漢字的矢量數據的長(cháng)度。
漢字指針在指針區的偏移由公式計算:pos=((qu-16)*94+wei-1)*6。
注:qu--區號。wei--位號。
漢字的矢量數據格式為:控制碼+坐標值。共有十種控制碼,以下是控制碼的 含義:
(1)若控制碼第7,6位為11,清除碼,結束當前筆劃,將第一個(gè)坐標與當前坐
標連線(xiàn);建立新筆劃,(X,Y)各占7位,由控制碼的第5位開(kāi)始,即:11XXXXXX XYYYYYYY。
注:一個(gè)字節的位:
7 6 5 4 3 2 1 0
X X X X X X X X
(2)若控制碼小于等于0x40,之后控制碼大小個(gè)字節為坐標值,每個(gè)坐標占 一個(gè)字節,
共有控制碼大小個(gè)坐標,(X,Y)坐標各占4位,其自的最高位為符號位, 即:FXXXFYYY。
(3)若控制碼的高4位等于4,之后控制碼的低4位大小個(gè)字節為坐標值,每個(gè)
坐標占一個(gè)字節,共有控制碼大小個(gè)坐標,(X,Y)坐標各占4位,X為正,Y為正,
即:+XXXX+YYYY。
(4)若控制碼的高4位等于5,之后控制碼的低4位大小個(gè)字節為坐標值,每個(gè)
坐標占一個(gè)字節,共有控制碼大小個(gè)坐標,(X,Y)坐標各占4位,X為負,Y為正,
即:-XXXX+YYYY。
(5)若控制碼的高4位等于6,之后控制碼的低4位大小個(gè)字節為坐標值,每個(gè)
坐標占一個(gè)字節,共有控制碼大小個(gè)坐標,(X,Y)坐標各占4位,X為負,Y為負,
即:-XXXX-YYYY。
(6)若控制碼的高4位等于7,之后控制碼的低4位大小個(gè)字節為坐標值,每個(gè)
坐標占一個(gè)字節,共有控制碼大小個(gè)坐標,(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[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("<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);
}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。