Определите, поддерживает ли шрифт варианты (например, верхний индекс и нижний индекс) - PullRequest
3 голосов
/ 10 августа 2009

WPF имеет вложенное свойство Typography.Variants , которое позволяет выполнять надстрочный и подстрочный индекс. Тем не менее, это работает только для некоторых шрифтов. Для других шрифтов вариант полностью игнорируется, и текст отображается нормально. (Пример кода и скриншот здесь )

Так как он молча возвращается к неработоспособности, я понятия не имею, что что-то пошло не так; но мой пользователь увидит паршивое поведение.

Есть ли способ, которым я могу программно определить, поддерживает ли данный шрифт Typography.Variants? Если это так, я мог бы обеспечить более осмысленное поведение, если пользователь выбрал шрифт, не поддерживающий вариант, для чего-то, что нужны верхние индексы / подписки.

Я посмотрел на GlyphTypeface , так как именно он используется для запроса возможности встраивания шрифта, но я ничего не видел там о вариантах. Я также не увидел ничего очевидного в FontFamily , и единственное, что я смог найти в Типографика , это само свойство присоединенного варианта (и его геттеры, и сеттеры).

1 Ответ

3 голосов
/ 11 августа 2009

Насколько я могу судить, WPF не предоставляет никакой информации о доступных таблицах GSUB (которые сообщают вам эту информацию). Все скрыто глубоко в частных классах PresentationCore.

Один из способов заключается в использовании расширенных текстовых сервисов WPF для создания TextFormatter , а затем извлечения GlyphRun s, созданных фрагментом текста с включенными вариантами, и одного с вариантами выключить, а затем сравнить используемые индексы глифов.

Другим способом было бы физически проверить данные шрифта через GlyphTypeFace.GetFontStream(). Формат шрифта TrueType не очень сложен, поэтому вы, вероятно, найдете в сети некоторую информацию о том, как анализировать двоичные данные шрифта для поиска информации в таблицах GSUB.

Заметьте, что просто спрашивать, поддерживается ли вариант, также немного двусмысленно. Шрифт может сказать , что он поддерживает вариант, но ничто не требует, чтобы он фактически обеспечивал какие-либо значимые замены. Большинство шрифтов Adobe предоставляют только несколько букв алфавита в нижнем регистре для таких вещей, как верхний и нижний индексы (даже не весь латинский алфавит, обратите внимание). Это довольно бесполезно, ИМХО, поскольку вы не можете попросить WPF подделать подписки или надстрочные индексы, как это делают Word и другие текстовые процессоры.

Тем не менее, было бы неплохо, если бы вы просто спросили TypeFace.GetSupportedOpenTypeFeatures().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...