在wine环境下运行希沃白板5,汉字卡无法正常显示:
这个模块是我之前开发的模块,过了5年还是有印象。
大概原理是获取字体库中字符的笔画路径GraphicsPath,根据里面的路径点集PathPoints,通过PathGeometry转化为Path,填充好颜色就可以放到界面显示了。
EN5里没有任何异常,只是显示不了。我单独写了个demo验证下:
demo在Wine上运行正常。
去看了下EN5的日志,找到了这个异常:
GraphicsPath.AddPath异常,推测大概是参数问题。参数一共有6个,应该是几个引用参数
另外,我们看看Wine里面对应的实现。这里有对参数的校验,并返回了Invalid结果,能对的上:
path是构造时初始化的,string、family等不可能为null值,layoutRect调用的位置已经初始化了。所以是我们尝试按照上面的异常看看format。果然,尝试将format置空就出现了异常
我们看下报啥异常:
确定是format空异常,后面就简单了,我们改改wine的gdiplus.dll下面实现。
取消对format空异常的校验,并赋值Format默认值。
而C#中我们设置默认值StringFormat.GenericDefault,其实调用的也是gdiplus下GdipStringFormatGetGenericDefault。默认是StringAlignmentNear
于是解决了:
细心的同学会出现,汉字往左偏了。。。
我记得之前维护这个模块时,要故意加偏移量。问了下前同事,发来了截图:
所以本来就是有偏移的。我们这里只需要处理下wine与windows之间的偏移差异就行了,具体代码graphics.c->gdip_format_string
对X添加偏移量-宽度*1/15,加的数值可能不太精确。是对比wine和windows图片差不多吻合。
有其它处理方案的,也可以发给我,谢谢。