DirectWrite: используйте разные шрифты для латиницы и сложных сценариев

Я использую CreateTextLayout и CreateTextFormat для рисования текста с помощью DirectWrite (C ++), текст смешанный иврит / английский, есть ли способ использовать другой шрифт / размер шрифта для латинских и еврейских символов?

Спасибо.


person BanK    schedule 24.04.2014    source источник


Ответы (2)


Когда вы создаете IDWriteTextFormat с помощью CreateTextFormat, вы можете передать имя семейства шрифтов в первом параметре и вы можете изменить размер шрифта в шестом параметре.

Параметры CreateTextFormat можно получить из MSDN.

Вот список семейств шрифтов Microsoft Windows, вы найдете там их на латинице и иврите.

person Caesar    schedule 24.04.2014
comment
Ну да, я знаю, проблема в том, что длинная текстовая строка, которую я передаю CreateTextLayout, содержит как латинские, так и сложные (иврит) символы, такие как Hello שלום Hello שלום, и мне нужен уникальный вызов textLayout- ›Draw для рисования латинских символов этой строки с одним шрифтом / размером шрифта и еврейскими символами с другим ... - person BanK; 25.04.2014
comment
@BanK Я не знаком ни с одним встроенным в direct2d, кроме того, что вы делаете это вручную. - person Caesar; 25.04.2014
comment
ОК, текст вводит пользователь, который может смешивать иврит и английский любым способом. Я думаю, что есть причуда запасного шрифта, шрифты, которые я хочу использовать, содержат только символы иврита (и другие, такие как 1234567890 и () [] 'и т. Д.) И намного меньше для того же размера шрифта, чем обычные шрифты. DirectWrite автоматически возвращается к стандартному шрифту для латинских символов, поэтому символы иврита крошечные и нечитабельные по сравнению с латинскими. Я хочу сказать DirectWrite использовать другой размер шрифта в случае отката. - person BanK; 25.04.2014

В итоге я позвонил IDWriteFont::HasCharacter, чтобы создать текстовые диапазоны, внутри которых все символы используют один и тот же шрифт (еврейский или латинский).

Если в этом текстовом диапазоне используется еврейский шрифт, я вызываю textLayout->SetFontSize, чтобы увеличить размер шрифта.

Это означает ожидание обратного вызова шрифта DirectWrite, который выполняется автоматически и не может быть изменен.

person BanK    schedule 25.04.2014
comment
Такой подход работает. Просто нужно рассматривать суррогатные пары как единый символ (и, возможно, пропускать селекторы вариантов, например, U + FE00..FE0F). Примечание. IDWriteTextLayout в Windows 8.1 поддерживает настройку резервного шрифта с помощью IDWriteFontFallback, создание IDWriteFontFallbackBuilder, вызов AddMapping с диапазонами иврита Unicode, AddMappings с коллекцией системных шрифтов в качестве единого слова, а затем SetFontFallback в макете. - person Dwayne Robinson; 21.05.2014