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, он будет работать отлично)

Какие-либо предложения?

Благодарю. Д.Ф.

0 ответов

Другие вопросы по тегам