Uniscribe ScriptShape персонаж не найден в упрощенном арабском Windows Svr 2012 или W10
У меня есть приложение, которое должно конвертировать строки из файлов RTF, которые будут отображаться в формате PDF. У меня проблема с упрощенным арабским полужирным шрифтом, он работает в Windows 7, но не работает в Windows 10 или W.Srv 2012.
Очень простое слово на арабском: غ، دهو
Я выбираю "упрощенный арабский" шрифт, возвращаемый методом GDI+ ToNative(). ScriptShape возвращает правильные идентификаторы глифов в Win7, но в Win10 возвращенные glyphIds отсутствуют в таблице CMAP. Например, GlyphId 678 не может быть найден, поэтому я не могу добавить символ при рендеринге PDF.
Более подробное объяснение:
Вот RTF, приведенный к минимальному выражению, чтобы воспроизвести проблему:
{\rtf1\fbidis\ansi\ansicpg1252\deff0\nouicompat\deflang1033
{\fonttbl{\f0\froman\fprq2\fcharset178 Simplified Arabic;}{\f1\fnil Source Sans Pro;}}
\pard\ltrpar\cf1\b\f0\rtlch\fs32\lang1025\'db\'a1 \'cf\'e5\'e6 \cf0\b0\f1\ltrch\fs18\lang1033\par
}
Чтобы сгенерировать атомы для PDF, я сначала получаю System.Drawing.Font("Упрощенный арабский", 16, жирный).
Тогда я звоню GetFontData(hDC, 0,0, buffer, length)
и получим данные таблицы TagGlyf, построив dictionary <ushort, chart>
из GlyphIdArray[] tableCMap.Win (я могу предоставить свой код, если вам это нужно)
Тогда я звоню
Uniscribe.ScriptItemize(text, text.Length, items.Length, ref scriptControl, ref scriptState, items, ref itemsCount);
После получения предметов я звоню Uniscribe.ScriptLayout()
заказать пробеги в соответствии с уровнями BiDi.
Затем я выбираю шрифт в текущем HDC и для каждого запуска вызова ScriptShape()
которые возвращают GlyphIds трасс.
Используя упрощенный арабский язык Win7 (даже в Win10), я получаю следующие глифы: глифы
{ushort[9]}
[0]: 3
[1]: 194
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
и все они правильно соответствуют символу, который я могу отправить в PDF. Однако, когда я заменяю и использую Simplified Arabic Bold из W10 или WinSvr 2012, я получаю
глифы {
ushort[9]}
[0]: 3
**[1]: 678**
[2]: 395
[3]: 174
[4]: 3
[5]: 157
[6]: 185
[7]: 0
[8]: 0
Вы можете видеть, что глифы [1] в шрифте Win10 - 678, но я не могу найти этот идентификатор в своем словаре из таблицы CMap.
Если я вручную установлю глифы [1] на 194, он будет работать нормально, отображая правильный символ. Так что я не знаю, почему ScriptShape запутывается в том, какой GlyphId использовать с новым шрифтом.
(Конечно, если я вручную установлю старый шрифт Win7 в коробке Win10, он будет работать отлично)
Какие-либо предложения?
Благодарю. Д.Ф.