Получить имя файла шрифта на основе имени шрифта и стиля (полужирный/курсив)
Это сводило меня с ума весь день.
Мне нужно получить имя файла шрифта (например, Arial.ttf) на основе его имени (Arial в этом случае) и выделено ли оно полужирным шрифтом, курсивом или обоими. Используя эти части информации, мне нужно найти файл шрифта, чтобы я мог использовать его для рендеринга.
Еще несколько примеров:
- Calibri, Bold разрешит calibrib.ttf.
- Calibri, Italic разрешит calibrii.ttf.
Любые идеи о том, как я мог добиться этого в С++ (Win32)
Ответы
Ответ 1
Во-первых, насколько мне известно, надежного способа сделать это не существует.
API Windows имеет дело с семействами шрифтов и сопоставлениями, а не с файлами шрифтов, которые рассматриваются на более низком уровне. Также обратите внимание, что даже если вам удастся получить имя файла шрифта, никакая функция рендеринга (что я знаю) не примет его, так что вы будете с ней делать?
Тем не менее, вы можете посмотреть в разделе реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts
, чтобы получить имя файла шрифта из его логического имени. Реализация этого решения можно найти здесь.
Ответ 2
Этот Проект проекта кода делает то, что вы хотите. As-it не работает в Windows 7, потому что функция GetWinVer останавливается на XP. Тривиально добавить корпус для Windows 7.
Ответ 3
Обычно вы делаете это, вызывая CreateFontIndirect, а затем получая визуализацию системы. Возможно, вы могли бы объяснить, почему вы не можете использовать этот стандартный подход.
Ответ 4
Относительно ранних сообщений это кажется надежным способом:
1) Прочитайте зарегистрированный список шрифтов Windows из
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts \
Здесь вы получите имена файлов и альтернативные пути к файлам.
Имена шрифтов не являются полезными, поскольку они могут меняться с помощью локали пользователя.
2) Загрузите файлы TrueType (.ttf,.ttc,.otf):
Используйте FreeType https://www.freetype.org/). Просто инициализируйте библиотеку freetype и загрузите ее с помощью FT_New_Face (библиотека, путь, 0, и лицо).
3) Получите фамилию шрифта, используя FreeType.
Используйте FT_Get_Sfnt_Name_Count() и FT_Get_Sfnt_Name(), чтобы получить таблицу строк.
Вам нужно будет проверить, является ли кодировка Ansi, UTF16 или другим, так как некоторые строки будут на разных языках и кодировках.
4) Получите свойства TrueType OS2.
Используйте (TT_OS2 *) FT_Get_Sfnt_Table (лицо, ft_sfnt_os2), чтобы получить структуру OS2.
Интерпретируйте структуру, используя документы, такие как https://www.microsoft.com/typography/otspec/os2.htm#fc
5) Теперь у вас есть путь к файлу шрифта, имя семейства, свойства стиля и другая информация. Создайте список этих и функций для поиска файла на основе семейства шрифтов и стиля.
Ответ 5
Одним из решений было бы получить доступ к файлам шрифтов и извлечь имя из таблицы имен, чтобы создать собственный поиск (карта STL была бы простым способом сделать это). Подробную информацию о формате файла TTF можно найти здесь.