我最近在尝试修复 VSFilter 系字幕滤镜中部分 Opentype 字体横排竖排相同字号大小不同的问题,下面是问题的示意图
横排的正常情况
竖排的情况
同样的问题在思源黑体,思源宋体等 Opentype 字体上也可以复现
之前群友聊过,推测是一些语言的连字导致了字高和字宽比例出现了问题
在 VSFilter 系滤镜中,字体是通过如下方式渲染的
- 创建 LOGFONT 结构
- CreateFontIndirect 创建逻辑字体
- SelectFont 选择字体
- TextOutW 渲染字体
考虑到群友的推论,我将创建 LOGFONT 结构中
lf.lfHeight = (LONG)(style.fontSize + 0.5);
改为了
lf.lfHeight = -MulDiv((int)(style.fontSize + 0.5), GetDeviceCaps(hDC, LOGPIXELSY), 72);
横排竖排的大小一致了,但大小是原来的 1.93~1.94 倍
我之前也尝试过用设置 LOGFONT 的 lfOrientation 字段来强行旋转每一个字符,但最后效果和竖排字体还是有一定的不一致
想问下各位有什么修复这个问题的思路吗
探索这个问题的时候我主要查阅了GDI 的文档,项目仓库的地址是:VSFilterMod