@@ -91,7 +91,7 @@ Encoding CharacterSetToEncoding(CharacterSet characterSet)
9191 return Encoding . GetEncoding ( codePageId ) ;
9292}
9393
94- float lastXOffset = 0 ;
94+ float lastDxOffset = 0 ;
9595
9696for ( var i = 0 ; i < wmfDocument . Records . Count ; i ++ )
9797{
@@ -129,7 +129,7 @@ Encoding CharacterSetToEncoding(CharacterSet characterSet)
129129 {
130130 currentX = moveToRecord . X ;
131131 currentY = moveToRecord . Y ;
132- lastXOffset = 0 ;
132+ lastDxOffset = 0 ;
133133 break ;
134134 }
135135 // - [12] {== WmfLineToRecord ==
@@ -212,6 +212,11 @@ Encoding CharacterSetToEncoding(CharacterSet characterSet)
212212 {
213213 case RecordType . META_EXTTEXTOUT :
214214 {
215+ // 关于字间距的规则:
216+ // 1. 如果两个 META_EXTTEXTOUT 相邻,中间没有 MoveTo 之类
217+ // 则第二个 META_EXTTEXTOUT 将需要使用前一个 META_EXTTEXTOUT 的 dx 末项
218+ // 2. 可选的 dx 是存放在字符串末尾的可选项,从文档 2.3.3.5 上可见 dx 是顶格写的,这就意味着这个值是一定对齐整数倍的。由于 dx 是放在数据末尾,可通过减法算出 dx 长度,即数据总长度减去所有已知字段的长度加上字符串长度,剩余的就是 dx 长度。如果计算返回的 dx 长度是奇数,则首个 byte 是需要跳过的,如此就能确保在 16bit 下的 wmf 格式里面,读取的 dx 是从整数倍开始读取
219+
215220 // 测试 17 项
216221 var memoryStream = new MemoryStream ( unknownRecord . Data ) ;
217222 var binaryReader = new BinaryReader ( memoryStream ) ;
@@ -242,7 +247,7 @@ Encoding CharacterSetToEncoding(CharacterSet characterSet)
242247 paint . Style = SKPaintStyle . Fill ;
243248 paint . Color = currentTextColor ;
244249
245- var currentXOffset = currentX + tx + lastXOffset ;
250+ var currentXOffset = currentX + tx + lastDxOffset ;
246251
247252 if ( dxLength == 0 )
248253 {
@@ -275,7 +280,7 @@ Encoding CharacterSetToEncoding(CharacterSet characterSet)
275280 currentXOffset += dxArray [ textIndex ] ;
276281 }
277282
278- lastXOffset = dxArray [ ^ 1 ] ;
283+ lastDxOffset = dxArray [ ^ 1 ] ;
279284 }
280285
281286 break ;
0 commit comments