truetype技术及矢量字库问题,大家请进,分数不是问题,急~~~~~~~~~!!!!!!! 各位大虾:小弟近来正在研究truetype技术和矢量字库的技术原理及实现的程序源代码,可是苦于没有相关资料及相应指导,请大虾指点相关的书籍,网站或相关资料,也请高手留名,大家共同研究,送分不是问题.小弟刚刚接触这个领域,请大家多多指教!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ... 广泛汉字矢量字库(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位,最高位为符号位, 即:1000FXXXFYYYYYYY。 (10)若控制码的高4位等于9,其后1字节为X坐标值,控制码的低4位值为Y坐标值,Y坐标各占4位,最高位为符号位,X坐标各占8位,最高位为符号位, 即:1000FYYYFXXXXXXX。-------------------------------------------------------------------------用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);} 到Linux中找一个名为chpower的软件的源代码,里面有如何读取ttf字库的函数,我曾经看过,但没有认真研究。在Linux中的其它软件也会有关于ttf字库的内容,多找找吧!Good Luck!!! 这几天有事,对不起各位热心的大侠啦。小弟真的是很笨,误以为矢量字库就是truetype技术,其实不是的!!所以我的问题要修正一下:各位大虾:小弟近来正在研究truetype技术及实现的程序源代码,可是苦于没有相关资料及相应指导,请大虾指点相关的书籍,网站或相关资料,也请高手留名,大家共同研究,送分不是问题.小弟刚刚接触这个领域,请大家多多指教!!!但我还是真心感谢one_add_one,呵呵,会给你分的~!!请大家多多指教!!!!!!!! 多谢大家支持~!希望感兴趣的同仁一起努力亚~!!!!truetype技术也叫字体轮廓技术,是apple与microsoft一起开发的,谁有中文资料呀!!!!!!!!!!求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ to one_add_one:你好,我用了你给的代码,把字库文件改成了\winnt\fonts下的一个字库文件(这是字库文件吗?),编译运行没有错误,可是输入区位之后不写字阿,有时是几个直线,有时是点)请问这是怎么回事啊?谢谢!还有,您能提供一些这方面的资料或者网站吗?不胜感激! to one_add_one:能不能将你在程序中引用的字库发给我![email protected] 高手进来帮忙解释看一下下这个宏啥意思的呀?? (送分贴) 回调函数问题 怎么给vc6的picture控件添加右键消息? 编程把cmd.exe替换遇到了XP的文件保护对话框,怎么能让这个对话框不出现呢? 求异步模式下,多客户端,单服务器端的文件传输源代码 进程间通讯问题,为何发送完后,接受方没有反应? 请问在DOCUMNENT里面来刷新VIEW的最有效方法是什么?能给点具体的码么? 需要代码大全中文版的请进来! 如何实现一个履历表式样的界面呢? 帮帮我,急急急!!! 为什么我的API HOOK只能HOOK本进程,无法HOOK其它进程? 像WM_NOTIFY这类型的消息是怎样路由的?
在矢量字库中,每个汉字都是以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[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);
}
truetype技术也叫字体轮廓技术,是apple与microsoft一起开发的,谁有中文资料呀!!!!!!!!!!求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~