中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: UCDOS 5.0 曲线字库格式的文档 上一主题 | 下一主题
lhsong
初级用户





积分 47
发帖 12
注册 2008-9-5
状态 离线
『楼 主』:  UCDOS 5.0 曲线字库格式的文档

UCDOS 5.0 曲线字库格式的文档

  UCDOS,DOS下功能最强、兼容性最佳的外挂汉字系统,现在有人一直在寻找显示UCDOS 5.0曲线字库的格式,我通过在网上搜寻,终于找到了几篇此类文档,但算法的实现中发现存在几个错误,现在进行了更正,发到网上供大家参考。

  说明:更正了英文字符地址计算公式,应是乘94,而不是乘100,原文已更正

UCDOS曲线轮廓字库结构分析

  UCDOS 是国产的具有许多优异性能的汉字操作系统, 尤其是其丰富的PostScript 曲线轮廓字体给广大用户留下了深刻的印象。如何充分利用 UCDOS 已有的曲线字库, 如制作漂亮的软件界面, 作为自己系统的曲线小字库或向其它类型的字库转换等, 都有必要首先了解 UCDOS 曲线轮廓字库的结构。

1、曲线轮廊字库的结构及地址计算
UCDOS 中各种曲线轮廊字库都存放在 UCDOS 的特定的目录中(如 C:\UCDOS\FNT ) , 并用各自特殊的文件名加以区别, 如:
ASCPS     英文字体曲线轮廓字库
HZKPST    图形符号曲线轮廓字库
HZKPSKTJ   简体楷体曲线轮廓字库
HZKPSSTJ   简体宋体曲线轮廓字库
HZKPSHTJ   简体黑体曲线轮廓字库
HZKPSFSJ   简体仿宋曲线轮廓字库
另外, 还提供了其他三十余种扩充的简繁体曲线轮廓字库供用户选择。
每个曲线轮廓字库都两部分组成: 汉字索引区、字型数据区。汉字索引区由许多索引项组成。每个索引项由六个字节组成, 其中字型数据的偏移地址4 个字节, 字型数据的长度占2 个字节。由汉字的索引提供的字型数据偏移地址及字型数据的长度即可得到该汉字的字型数据。为了确定一个汉字在字库汉字索引区的偏移量, 必须通过汉字区位码或汉字机内码来获得。根据GB2312-80 的规定, 一般的汉字库都收集了7445 个汉字及非汉字的图形字符,其中汉字有6763 个, 非汉字的图形字符682 个。并且为了便于编码与管理, 将它们分为94个区, 每区分为94 个位。同时, 为了使汉字与英文相区别, 规定在计算机内, 汉字的编码用机内码来表示, 一个机内码占2 个字节。每个汉字或非汉字图形字符都唯一地对应一个区位码和机内码。汉字机内码与汉字区位码之间的转换公式如下:
机内码= 区位码+ 0xA0A0
由汉字机内码或区位码即可求得汉字在曲线轮廊字库索引区中的偏移量, 计算方法如下:
OFFSET=((机内码高位字节-0XA0-16)×94+(机内码低位字节-0XA0-1))×6
=((区码-16)×94+(位码-1))×6
例如: 汉字“啊”的区位码1601 (第16 区第1 位) , 可求得“啊”字对应的机内码在曲线轮廓字库索引区中的偏移量如下:
机内码= 区位码+0xA0A0=1601+0xA0A0=0x1001+0xA0A0=0xB0A1
偏移量OFFSET=((0XB0-0XA0-16)×94+(0XA1-0XA0-1))×6
或OFFSET =((16-16)×94+(1-1))×6
汉字的符号库同汉字库是分开的,16区以前的图形符号偏移:
offset=((机内码高位字节-OxaO -1)*94+(机内码低位字节-Oxa0-1))*6=((区码-1)×94+(位码-1))×6
而英文字体的偏移量比较特殊,它共有lO种字体,每种字体有1O0个英文字符,可以这样确定偏移量(设字体号为N ,英文字符的ASCII码为CC):
offset=(N*94-F(CC-32))*6
在UCDOS 5.0 中从此偏移量连续读取4 个字节转换成长整型数, 即为字型数据地址(Address ) , 紧接着2 个字节转换成整型数便为字型数据的长度(Length )。
在UCDOS 6.0 中从此偏移量地址连续读取4 个字节转换成长整型数后, 还需将此长整型数减去十六进制0x10000000 后才为字型数据地址, 紧接着2 个字节转换成整型数便为字型数据的长度(Length ),包括符号库。但英文字符不需要调整。

2、字型数据的格式
三次曲线字库的字形数据需要解释和重组。读取三次曲线字库的字形数据时每次只能读取四位,方法是当某一字节第一次被读取时, 读取低四位,当该字节再次被读取时, 读取高四位。当读取的数据不需要被当做坐标量时, 读取的四位数据就会被当做命令,并进行解释。如果当前命令需要坐标量, 坐标量分为绝对坐标值和坐标增量。绝对坐标值为一个字节, 为读取的两个四位数据的重组, 重组方法为先读取的四位数据作为高四位, 后读取的四位数据作为低四位。坐标增量为四位或六位的二进制数, 其中最高位为符号位。四位坐标增量为当前读取的四位数据。坐标增量为六位二进制数时同样是通过重组得到的, 方法是将第一次读取的四位数据作为六位数据的高四位, 第二次读取的四位数据的高两位作为六位数据的低两位, 得到第一个坐标增量,然后将第二次读取的四位数据的低两位作为六位数据的高两位, 第三次读取的四位数据作为六位数据的低四位, 得到第二个坐标增量。

3、控制字的含义
UCDOS 的控制字为4 位(半字节) , 共有16 种不同功能的控制字, 分别控制产生曲线轮廊字型的不同曲线段。具体含义如下:
表1 控制字的含义及功能
控制字        参数含义        长度        功能        当前点
0000                X1,Y1        16位        笔画起始点, 将当前点移至此点        X1,Y1
0001                X1        8位        从当前点画横线至X1点        X1,CY
0010                Y1        8位        从当前点画竖线至Y1点        CX,Y1
0011                X1,Y1        16位        从当前点画线至(X1,Y1)点        X1,Y1
0100        X1,Y1,X2,Y2        32位        以当前点、(X1,Y1)和(X2,Y2)为控制点画二次Bezier曲线        X2,Y2
0101                X1,Y1,X2,Y2,X3,Y3        48位        以当前点、(X1,Y1),(X2,Y2)和(X3,Y3)为控制点画三次Bezier曲线        X3,Y3
0110                X1,Y1,X2,Y2        32位        以(X1,Y1)为左上角,(X2,Y2)为右下点画矩形        不变
0111                #X1,Y1        12位        从当前点画线至(CX+#X1,Y1)点        CX+#X1,Y1
1000                X1,#Y1        12位        从当前点画线至(X1+CY+#Y1)点        X1+CY+#Y1
1001                #X1,#Y1        8位        从当前点画线至(CX+#X1,CY+#Y1)点        CX+#X1,CY+#Y1
1010                &X1,&Y1        12位        从当前点画线至(CX+&X1,CY+&Y1)点        CX+&X1,CY+&Y1
1011                #X1,#Y1,#X2,#Y2        16位        从当前点、(CX+#X1,CY+#Y1)和(CX+#X1+#X2,CY+#Y1+#Y2)为控制点画二次Bezier曲线        CX+#X1+#X2,CY+#Y1+#Y2
1100                &X1,&Y1,&X2,&Y2        24位        从当前点、(CX+&X1,CY+&Y1)和(CX+&X1+&X2,CY+&Y1+&Y2)为控制点画二次Bezier曲线        CX+&X1+&X2,CY+&Y1+&Y2
1101                #X1,#Y1,#X2,#Y2,#X3,#Y3        24位        从当前点、(CX+#X1,CY+#Y1),(CX+#X1+#X2,CY+#Y1+#Y2)和(CX+#X1+#X2+#X3,CY+#Y1+#Y2+#Y3)为控制点画三次Bezier曲线        CX+#X1+#X2+#X3,CY+#Y1+#Y2+#Y3
1110                &X1,&Y1,&X2,&Y2,&X3,&Y3        36位        从当前点、(CX+ &X1, CY + &Y1) , (CX+ &X1+&X2, CY + &Y1+ &Y2) 和(CX + &X1+ &X2+&X3, CY + &Y1+ &Y2+ &Y3) 为控制点画三次Bezier 曲线        CX+&X1+&X2+&X3,CY+&Y1+&Y2+&Y3
1111                X1,Y1        16位        仅读取两个绝对坐标, 不作其它操作        不变

说明:
①参数X1, Y1, X2, Y2, X3, Y3 均表示8 位长度的坐标值, 且为正数, 表示范围为0 至255;
②参数# X1,# Y1,# X2,# Y2,# X3,# Y3 均表示长度相对当前点的增量, 最高位是符号位,0 表示正数,1 表示负数, 表示范围为-7 至+7;
③参数&X1, &Y1, &X2, &Y2, &X3, &Y3 均表示6 位长度相对当前点的增量, 最高位是符号位,0 表示正数,1 表示负数, 表示范围为-31 至+31;
④CX, CY 均表示当前点的坐标值

   此帖被 +8 点积分     点击查看详情   
评分人:【 sanchuan 分数: +2  时间:2009-1-2 23:07
评分人:【 DOSroot 分数: +6  时间:2009-4-17 04:07


2009-1-2 22:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sanchuan
初级用户





积分 113
发帖 51
注册 2008-11-16
来自 武汉
状态 离线
『第 2 楼』:  

难得的资料。楼主辛苦了。



三川一笑
2009-1-2 23:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lhsong
初级用户





积分 47
发帖 12
注册 2008-9-5
状态 离线
『第 3 楼』:  

大家光看不顶,也太不厚到了〉〉〉〉〉〉〉〉〉〉〉〉

2009-1-10 10:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lhsong
初级用户





积分 47
发帖 12
注册 2008-9-5
状态 离线
『第 4 楼』:  

过一段时间我将把自己的现实程序贴上来,同大家分享


希望大家顶

2009-1-10 10:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
oookkk2008
新手上路





积分 5
发帖 2
注册 2009-4-16
状态 离线
『第 5 楼』:  顶

学习了,谢谢

2009-4-17 01:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
283868130
新手上路





积分 19
发帖 11
注册 2008-12-30
状态 离线
『第 6 楼』:  

正是需要这个,收藏了

2010-5-29 02:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ypcok2011
新手上路





积分 7
发帖 4
注册 2011-1-22
状态 离线
『第 7 楼』:  

多谢!

2011-1-23 18:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: