2016-05-19 3 views
2

Alrighty, I обещание это самое близкое, что я когда-либо доберусь до вопроса «код для меня» :) Если это не отменяет никаких ответов, я укушу пулю и создаю парсер OTF, чтобы проверить наличие таблицы CFF.Как программно определить, является ли шрифт CFF?

Эта информация доступна в окне предварительного просмотра шрифтов Windows, («TrueType очерчивает» против «PostScript очерчивает»), так предположительно есть функция WinAPI для этого эффекта, но проклят, если я могу найти его.

Мысли кто-нибудь?

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

+1

Вопросы не должны содержать «решение», поэтому я вернулся к исходному вопросу. Если вы чувствуете, что в вашем добавлении добавлено что-то, о чем не упоминалось в существующих ответах, вы можете [добавить свой ответ] (http://stackoverflow.com/help/self-answer)! Если вы хотите: предыдущая версия вашего вопроса по-прежнему доступна в истории редактирования. – usr2564301

ответ

3

Вы можете сделать это, используя функцию GetFontData.

Создайте этот шрифт и выберите его в DC, затем позвоните GetFontData, чтобы узнать размер CFF table. Это будет выполнено только в том случае, если шрифт имеет контуры PostScript.

DWORD dwSize = GetFontData(hdc, ' FFC', 0, nullptr, 0); 
if (dwSize && dwSize != GDI_ERROR) 
{ 
    // has PostScript outlines 
} 
0

Ваш лучший выбор действительно состоит в том, чтобы непосредственно прочитать таблицы шрифтов из самого файла шрифта. Этот пример here даст начало, если вы уже знакомы с таблицами шрифтов. Если нет, прочитайте ссылки в разделе «Справка» в нижней части статьи.

1

The OpenType spec говорит:

OpenType шрифты, содержащие данные CFF должны использовать тег 'ОТТО' как номер версии sfnt.

Итак, если первые четыре байта файла «OTTO» используют контуры PostScript. Это может быть проще !? Протестировано &, работающее до сих пор, но в конце я, вероятно, воспользуюсь GetFontData.

0

Первые 4 байта файла OpenType, у которого есть блок CFF, являются «OTTO».