tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2797回复:16

关于如何在DrvTextOut中获取字体大小的问题。。

楼主#
更多 发布于:2005-04-01 09:37
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont
段需要字体的size信息。我使用了多种方法,计算或从DrvTextOut中的FONTOBJ,STROBJ的参数中寻找,但都不理想,和实际大小最少有%6以上的差距。另外可能是我对参数理解有问题,所以找错了对象。hp
的驱动打出的结果大致如下12point=100size
10point = 88size,24point = 200size,48point = 400size.
resolution =600dpi
请帮忙找出任何字体实例相关的pixel,point或em大小信息。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-01 13:00
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont
段需要字体的size信息。我使用了多种方法,计算或从DrvTextOut中的FONTOBJ,STROBJ的参数中寻找,但都不理想,和实际大小最少有%6以上的差距。另外可能是我对参数理解有问题,所以找错了对象。hp
的驱动打出的结果大致如下12point=100size
10point = 88size,24point = 200size,48point = 400size.
resolution =600dpi
请帮忙找出任何字体实例相关的pixel,point或em大小信息。


lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-01 16:08
楼上的我既没有pointsize也没有找到其他任何单位的表达字体大小的值(DrvTextOut).
我不需要换算关系,公式我知道,但是我要从DrvTextOut中找出能表示size的值或用DrvtextOut的参数表达出来...
DrvTextOut参数可以查到,我就不说了.
如果我理解错了你意思,请你用更详细的方式叙述一下
谢谢..
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-01 16:15
另外补充一点,truetype font file 虽然提供了大量的如advancewidth之类的值,但是都是相对的.既同一字体,每个字不同.我要得是类似word里显示的字体大小的值.对同大小的同一字体是一样的.
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-04-01 18:48
可以参考一下FONTOBJ,STROBJ
或者PIFIMETRICS pifi = FONTOBJ_pifi(pfo);
看看IFIMETRICS里有没有



[编辑 -  4/1/05 by  snowStart]
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-04 07:12
这个我查过了,至少从打出的参数来看pointsize是肯定没有,另外有几个是em值或pixel的,换算后也不对。

头疼啊,觉得微软的文档总是说的不清楚,上次,找glyphindex,也找了好几天,完全是靠自己测,总算从一个句柄值里找到,不打出来根本看不出来。。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-04 10:35
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont
段需要字体的size信息。我使用了多种方法,计算或从DrvTextOut中的FONTOBJ,STROBJ的参数中寻找,但都不理想,和实际大小最少有%6以上的差距。另外可能是我对参数理解有问题,所以找错了对象。hp
的驱动打出的结果大致如下12point=100size
10point = 88size,24point = 200size,48point = 400size.
resolution =600dpi
请帮忙找出任何字体实例相关的pixel,point或em大小信息。

我不知道你的10point = 88size都使用了什么单位,

正常字体,非斜体,PointSize的值可以这样计算:

PointSize=pfo->cxMax*72/600=840*72/600=100;
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-04-04 18:03
你的这个算法是不准确地。。并不是所有字体的pfo->cxMax值都是这个比例当然是同样的dpi。相当多的象century之类的都不行。。。
它的12point = 120(pfo->cxMax).
我现在用了一种近似算法
(((FLOAT)pifi->fwdUnitsPerEm)/((FLOAT)pifi->fwdMaxCharInc))*pfo->cxMax
这样结果大概有%1到%6的差距。


另外说到斜体和粗体,也是一样,你能在pfo,pstro或者通过其服务获得的参数中,找到能代表其意义的参数马。。。
pfo->flFontType ,pifi->fsSelection 我都拭过了,它们只代表当TRUETYPE文件本身包含粗体类型和斜体类型的情况。具体的你可以参考century和century Gothic Bold/Italic...前者文件本身不包含粗体和斜体,是通过setcharshear等方法来实现的。后者包含则直接读取数据就好。另外更复杂的情况也有,但讨论起来太长了。建议你只研究下century类MS Mincho类,的字体就好。
简单的说怎么判断word将century变成了Italic bold?
当然是在驱动中。。。DrvTextOut...
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-04 18:08
另外为了避免混淆,
我们约定。
pointsize指WORD中的10,12。。。72
PIXEL SIZE 指与上面对应的pixel值88,100,。。。。600
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-04-05 07:47
对了,关于字体的斜体粗体问题我犯了测试太草率的错误。
现在更正
pfo->flFontType是用于判断本身不包含粗体斜体需要进行的模拟的字体如century的粗体斜体状况。
pifi->fsSelection是用于判断本身包含粗体斜体文件的字体的如century gothic的粗斜体状况。

但是关于size的问题仍然没有完美解决。替代方法的误差还是太频繁。虽然误差本身不大。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-04-05 08:21
哦,我以前只处理中文字体了,没处理英文字的,
而且也没用到PointSize值,
只是用它来标记是某一种不同大小的字体而已

希望以后多交流
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-04-05 10:40
俺比较惨要处理英文,中文还有该死的日文。。。。
中文字体最好使了,方方正正的,一样胖瘦。帮忙建议下Acorbat,Micsoft,Mac都只用中文吧。。。
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-04-05 13:16
正确方法总算找到了
double eXScale,eYScale;
XFORMOBJ  xo;
XFORML *pxform;
INT iPointSize,iPixelSize;
xo = FONTOBJ_pxoGetXform(pfo);
XFORMOBJ_iGetXform(&xo,pxform);
eXScale = sqrt(pxform->eM11 * pxform->eM11 + pxform->eM12 * pxform->eM12);
eYScale = sqrt(pxform->eM22 * pxform->eM22 + pxform->eM21 * pxform->eM21);
iPixelSize = (int)(0.5 + eYScale * pifi->fwdUnitsPerEm * 72) /72;
iPointSize = (int)(0.5 + eYScale * pifi->fwdUnitsPerEm * 72) / pfo->sizLogResPpi;

XL_DbgMsgInfo(TEXT(\"iPixelSize = %d\"),iPixelSize);

但是老大,我的winddk2000不知道为什么不支持FONTOBJ_pxoGetXform这个服务,明明在winddi.h找的到阿。。
看着不能用郁闷阿。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-04-06 08:50
DDK里面定义是错的
应该是这样子的
XFORMOBJ *  FONTOBJ_pxoGetXform(IN FONTOBJ  *pfo);
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
tyoutyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-04
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-04-06 10:45
是的我看了一下winddi.h,msdn确实错了。
可是我把结果打出来,还是对不上。。。
若若的问一句
FLOATL强转double没什么问题吧。
XFORML 里的几个参数打出来也很离谱。不知道是不是类型转换有问题。。
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-04-06 17:15
页面太长了,开新贴讨论
http://www.driverdevelop.com/forum/html_90116.html?1112778865
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
herolove
驱动牛犊
驱动牛犊
  • 注册日期2007-07-18
  • 最后登录2008-04-04
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-08-13 15:10
请问得到了glyphindex,怎么获得这个glyphindex对应的文字呢???谢谢谢谢!!
游客

返回顶部