Документация для CreateTextFormat ничего не говорит о выборе резервного шрифта, но если выбрана коллекция по умолчанию (NULL = system), то DirectWrite явно реализует резервный шрифт. Например, если я добавлю два глифа, которых нет в шрифте Gabriola, в тестовую строку, используемую демонстрационным приложением DirectWrite SDK, тогда DirectWrite выберет недостающие глифы из шрифта Segoe UI Symbol. Это происходит с базовым вызовом DrawText
, а также с настраиваемым средством визуализации (которое не делает ничего настраиваемого для резервного копирования шрифта), как показано ниже (единственная модификация - это тестовая строка):
Галочка и белая звездочка взяты из Segoe UI Symbol, а не от Габриолы, хотя в демонстрационном приложении указана только Габриола. Итак, кто-нибудь знает, как DirectWrite (CreateTextFormat) выбирает резервные шрифты?
Обновить. Я вижу, что есть GetSystemFontFallback, который может перечислять резервные шрифты, но он доступен только в Windows 8.1 (потому что он находится в IDWriteFactory2). Думаю, они заметили пробел в API в отношении перечисления резервных шрифтов. Итак, я предполагаю, что до Windows 8.1 это невозможно сделать, но если кто-нибудь знает способ взлома / обходной путь ...
Обновление2. Цитата сотрудника MSFT:
DirectWrite имеет резервные данные, которые не считываются из реестра и не подлежат настройке. Однако в Windows 8.1 были введены API-интерфейсы, которые позволяют приложению указывать собственный откат. (Это похоже на API WPF для создания определения составного шрифта.)
Что до сих пор не объясняет точно, что такое жестко запрограммированный алгоритм / схема замены.