2010-06-14 4 views
1

Я перечисляя шрифты Windows, как это:Почему FONTSIGNATURE не отражает lfCharSet?

LOGFONTW lf = {0}; 
lf.lfCharSet = DEFAULT_CHARSET; 
lf.lfFaceName[0] = L'\0'; 
lf.lfPitchAndFamily = 0; 
::EnumFontFamiliesEx(hdc, &lf, 
        reinterpret_cast<FONTENUMPROCW>(FontEnumCallback), 
        reinterpret_cast<LPARAM>(this), 0); 

Моя функция обратного вызова имеет эту подпись:

int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf, 
               const NEWTEXTMETRICEX *pMetrics, 
               DWORD font_type, 
               LPARAM context); 

Для TrueType шрифтов, я обычно получают каждое имя FACE несколько раз. Например, для нескольких вызовов я получу pelf->elfFullName и pelf->elfLogFont.lfFaceName, установленный как "Arial". Если посмотреть более внимательно на другие поля, я вижу, что каждый вызов для другого скрипта. Например, при первом вызове pelf->elfScript будет "Western", а pelf->elfLogFont.lfCharSet будет численным эквивалентом ANSI_CHARSET. Во втором звонке я получаю "Hebrew" и HEBREW_CHARSET. Третий вызов "Arabic" и ARABIC_CHARSET. И так далее. Все идет нормально.

Но поле font signature (pMetrics->ntmFontSig) для всех версий Arial идентично. Фактически, подпись шрифта утверждает, что все эти версии поддержки Arial Latin-1, иврит, арабский и другие.

Я знаю набор символов строк, которые я пытаюсь нарисовать, поэтому я пытаюсь создать соответствующий шрифт на основе подписи шрифта. Поскольку подписи шрифтов всегда совпадают, я всегда выбираю «западный» шрифт, даже при отображении текста на иврите или арабском языке. Я использую низкоуровневые API-интерфейсы Uniscribe, поэтому я не получаю преимущества связывания шрифтов Windows, и, тем не менее, мой код работает.

Действительно ли имеет значение lfCharSet или является ли оно устаревшим артефактом? Должен ли я просто установить lfCharSet на DEFAULT_CHARSET и перестать беспокоиться обо всех вариантах скриптов каждого лица?

Для моих целей мне нужны только шрифты TrueType и OpenType.

ответ

1

Я думаю, что нашел ответ. Шрифты, которые перечисляются несколько раз, равны "big" fonts. Большие шрифты - это одиночные шрифты, содержащие глифы для нескольких сценариев или кодовых страниц.

Юникодная часть FONTSIGNATURE (fsUsb) представляет все поддиапазоны Юникода, которые может обрабатывать шрифт. Это не зависит от набора символов. Если вы используете широкоформатные API-интерфейсы, вы можете использовать все включенные глифы в шрифте, независимо от того, какой набор символов был указан при создании шрифта.

Код страницы FONTSIGNATURE (fsCsb) представляет собой страницы кода, которые может обрабатывать шрифт. Я считаю, что это имеет значение только тогда, когда шрифт не является «большим» шрифтом. В этом случае маски fsUsb будут всех нулей, а fsCsb укажет соответствующий набор символов. В этих случаях важно правильно установить lfCharSet в LOGFONT.

При создании «большого» шрифта и использовании широкоформатных API-интерфейсов, по-видимому, не имеет значения, какой из указанных вами lfCharSet вы указываете.

Смежные вопросы