EMF规范中LogFontPanose字体对象无法创建是否为规范错误?
这个确实是EMF公开规范的已知表述疏漏,你的推导完全正确。
出现该矛盾的原因是微软在迭代EMF规范时,新增LogFontPanose字体类型后,没有同步更新2.3.7.8节中ExtCreateFontIndirectW记录的类型判定逻辑,仍沿用了未加入LogFontPanose时的旧判定规则,才导致出现规范描述的逻辑里LogFontPanose永远无法被命中的问题。
实际Windows原生的EMF解析逻辑中,补全了对应的判定分支,真实执行规则如下:
- 若
elw字段大小 ≤LogFont对象大小,按固定长度LogFont解析,超出部分忽略 - 若
LogFont对象大小 <elw字段大小 ≤LogFontPanose对象大小,按固定长度LogFontPanose解析,超出LogFontPanose范围的字节忽略 - 若
elw字段大小 >LogFontPanose对象大小,再根据头部标识判定为LogFontEx或LogFontExDv可变长度对象解析
如果你是在做EMF解析相关开发,直接按上述实际运行逻辑补全判定分支即可,和现有所有EMF文件的兼容性不会有问题。
内容的提问来源于stack exchange,提问作者MechaMarinara
相关产品推荐
相关产品推荐

