truetype技术及矢量字库问题,大家请进,分数不是问题,急~~~~~~~~~!!!!!!! VC/MFC / 基础类

来源:百度文库 编辑:神马文学网 时间:2024/04/29 06:11:05
广泛汉字矢量字库(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);
}
truetype技术及矢量字库问题,大家请进,分数不是问题,急~~~~~~~~~!!!!!!! VC/MFC / 基础类 求助:软件加密方式! - VC/MFC / 基础类 MFC问题 如何将CString转换为char[] VC/MFC / 基础类 VC中, 为何每次都要重新编译? VC/MFC / 基础类 - CSDN社区 commu... vc中listbox控件为什么不能横滚动 VC/MFC / 基础类 - CSDN社区 co... 请问大虾门:我想IP包ip_tos及ip_ttl参数,这两个参数的详细解释是什么呢?设置时有什么限制吗? VC/MFC / 基础类 矢量字库相关研究 基础:VC调用JAVA方法的一个注意问题 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 接触VC之二:MFC类基础,C++程序编写规范介绍 dll中如何得到一个对话框的句柄 - VC/MFC / 基础类 windows下怎么开发c++守护进程? - VC/MFC / 基础类 【原创&交流】PE文件格式的一些研究 - VC/MFC / 基础类 财政预算信息公开 技术不是问题 [请问]如何使用矢量字库? 如何在程序执行比较长时间的处理时弹出一个等待对话框 VC/MFC / 基础类 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 - CSDN社区 community.csdn.net 编译成release版本与debug版本的程序有何执行上的区别? VC/MFC / 基础类... IT 技术联盟--VC++ MFC线程处理概述 IT 技术联盟--VC++ MFC线程处理概述 VC++ 的MFC 和ATL 及COM 是什么? 非常急的问题!关于VC操作OFFICE的!搞过这方面的进来帮下!先谢过! 第五讲 分数的拆分问题