阅读:2797回复:16
关于如何在DrvTextOut中获取字体大小的问题。。
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont
段需要字体的size信息。我使用了多种方法,计算或从DrvTextOut中的FONTOBJ,STROBJ的参数中寻找,但都不理想,和实际大小最少有%6以上的差距。另外可能是我对参数理解有问题,所以找错了对象。hp 的驱动打出的结果大致如下12point=100size 10point = 88size,24point = 200size,48point = 400size. resolution =600dpi 请帮忙找出任何字体实例相关的pixel,point或em大小信息。 |
|
沙发#
发布于:2005-04-01 13:00
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); |
|
|
板凳#
发布于:2005-04-01 16:08
楼上的我既没有pointsize也没有找到其他任何单位的表达字体大小的值(DrvTextOut).
我不需要换算关系,公式我知道,但是我要从DrvTextOut中找出能表示size的值或用DrvtextOut的参数表达出来... DrvTextOut参数可以查到,我就不说了. 如果我理解错了你意思,请你用更详细的方式叙述一下 谢谢.. |
|
地板#
发布于:2005-04-01 16:15
另外补充一点,truetype font file 虽然提供了大量的如advancewidth之类的值,但是都是相对的.既同一字体,每个字不同.我要得是类似word里显示的字体大小的值.对同大小的同一字体是一样的.
|
|
地下室#
发布于:2005-04-01 18:48
可以参考一下FONTOBJ,STROBJ
或者PIFIMETRICS pifi = FONTOBJ_pifi(pfo); 看看IFIMETRICS里有没有 [编辑 - 4/1/05 by snowStart] |
|
|
5楼#
发布于:2005-04-04 07:12
这个我查过了,至少从打出的参数来看pointsize是肯定没有,另外有几个是em值或pixel的,换算后也不对。
头疼啊,觉得微软的文档总是说的不清楚,上次,找glyphindex,也找了好几天,完全是靠自己测,总算从一个句柄值里找到,不打出来根本看不出来。。 |
|
6楼#
发布于:2005-04-04 10:35
本人做的是truetype字体的打印,使用pclxl语言开发,其中setfont 我不知道你的10point = 88size都使用了什么单位, 正常字体,非斜体,PointSize的值可以这样计算: PointSize=pfo->cxMax*72/600=840*72/600=100; |
|
|
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... |
|
8楼#
发布于:2005-04-04 18:08
另外为了避免混淆,
我们约定。 pointsize指WORD中的10,12。。。72 PIXEL SIZE 指与上面对应的pixel值88,100,。。。。600 |
|
9楼#
发布于:2005-04-05 07:47
对了,关于字体的斜体粗体问题我犯了测试太草率的错误。
现在更正 pfo->flFontType是用于判断本身不包含粗体斜体需要进行的模拟的字体如century的粗体斜体状况。 pifi->fsSelection是用于判断本身包含粗体斜体文件的字体的如century gothic的粗斜体状况。 但是关于size的问题仍然没有完美解决。替代方法的误差还是太频繁。虽然误差本身不大。 |
|
10楼#
发布于:2005-04-05 08:21
哦,我以前只处理中文字体了,没处理英文字的,
而且也没用到PointSize值, 只是用它来标记是某一种不同大小的字体而已 希望以后多交流 |
|
|
11楼#
发布于:2005-04-05 10:40
俺比较惨要处理英文,中文还有该死的日文。。。。
中文字体最好使了,方方正正的,一样胖瘦。帮忙建议下Acorbat,Micsoft,Mac都只用中文吧。。。 |
|
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找的到阿。。 看着不能用郁闷阿。 |
|
13楼#
发布于:2005-04-06 08:50
DDK里面定义是错的
应该是这样子的 XFORMOBJ * FONTOBJ_pxoGetXform(IN FONTOBJ *pfo); |
|
|
14楼#
发布于:2005-04-06 10:45
是的我看了一下winddi.h,msdn确实错了。
可是我把结果打出来,还是对不上。。。 若若的问一句 FLOATL强转double没什么问题吧。 XFORML 里的几个参数打出来也很离谱。不知道是不是类型转换有问题。。 |
|
15楼#
发布于:2005-04-06 17:15
页面太长了,开新贴讨论
http://www.driverdevelop.com/forum/html_90116.html?1112778865 |
|
|
16楼#
发布于:2007-08-13 15:10
请问得到了glyphindex,怎么获得这个glyphindex对应的文字呢???谢谢谢谢!!
|
|