Существует спецификация PANOSE. Винда имеет свою реализацию этой штуки со своими косяками. Задача следующая: воспользоваться виндовым механизмом подбора физического шрифта по логическому описанию и затем открыть подобранный шрифт сторонними средствами (например freetype). Т.е. найти местоположение этого файла на диске и если в этом файле несколько шрифтов, то и номер шрифта в файле.
Заранее спасибо.
Re: Получение имени файла и номера шрифта по HFONT
Здравствуйте, Leshyk, Вы писали:
L>Всем доброго времени суток!
L>Существует спецификация PANOSE. Винда имеет свою реализацию этой штуки со своими косяками. Задача следующая: воспользоваться виндовым механизмом подбора физического шрифта по логическому описанию и затем открыть подобранный шрифт сторонними средствами (например freetype). Т.е. найти местоположение этого файла на диске и если в этом файле несколько шрифтов, то и номер шрифта в файле.
L>Заранее спасибо.
Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.
Re[2]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, CEMb, Вы писали:
CEM>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.
Значит ли это что HFONT одного и того же шрифта всегда одинаков?
Re[3]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, CEMb, Вы писали:
CEM>>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.
L>Значит ли это что HFONT одного и того же шрифта всегда одинаков?
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, ASMelancholy, Вы писали:
ASM>>По HFONT нельзя узнать имя файла шрифта.
L>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
Можно попробовать следующее:
1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont);
2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
Re[6]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, ASMelancholy, Вы писали:
ASM>Здравствуйте, Leshyk, Вы писали:
L>>Здравствуйте, ASMelancholy, Вы писали:
ASM>>>По HFONT нельзя узнать имя файла шрифта.
L>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
ASM>Можно попробовать следующее: ASM>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont); ASM>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
Вместо п2 ищем имя файла по имени шрифта в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
Но это, похоже, работает только для TrueType шрифтов.
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, ASMelancholy, Вы писали:
ASM>>По HFONT нельзя узнать имя файла шрифта.
L>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
Выбранный шрифт в DC не гарантирует что именно им будут рисоваться все символы.
Я наблюдал вско разные варианты. В Uniscribe например алгоритм подбора шрифтов явно отличный от того что использует TextOut со товарищи.
Re[6]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, c-smile, Вы писали:
CS>Выбранный шрифт в DC не гарантирует что именно им будут рисоваться все символы.
Это смотря чем рисовать. DrawText или TextOut могут подменять шрифт. А если текст рисовать через low-level Uniscribe API (функции с префиксом Script, а не ScriptString) то никакой подмены шрифтов не происходит. Приходится это руками делать, когда требуется. Тот еще закат солнца вручную
Re[6]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, ASMelancholy, Вы писали:
ASM>Здравствуйте, Leshyk, Вы писали:
L>>Здравствуйте, ASMelancholy, Вы писали:
ASM>>>По HFONT нельзя узнать имя файла шрифта.
L>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
ASM>Можно попробовать следующее: ASM>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont); ASM>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
Есть один момент. Из хелпа:
"If hgdiobj is a handle to a font, the LOGFONT that is returned is the LOGFONT used to create the font."
Т.е. я получу не имя подобранного шрифта, а имя шрифта, который пытались создать.
Есть второй момент а если несколько шрифтов имеют одно имя?
Re[7]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, ASMelancholy, Вы писали:
ASM>>Здравствуйте, Leshyk, Вы писали:
L>>>Здравствуйте, ASMelancholy, Вы писали:
ASM>>>>По HFONT нельзя узнать имя файла шрифта.
L>>>Ок, а есть способ запустить виндовый алгоритм подбора шрифтов и получить найденный этим алгоритмом файл?
ASM>>Можно попробовать следующее: ASM>>1. Берем инфу нужного шрифта — GetObject(hFont, sizeof(LOGFONT), (LPSTR)&LogFont); ASM>>2. Перебираем все файлы шрифта и сравниваем LogFont.lfFaceName с именем шрифта из файла (не именем файла)
L>Есть один момент. Из хелпа: L>"If hgdiobj is a handle to a font, the LOGFONT that is returned is the LOGFONT used to create the font." L>Т.е. я получу не имя подобранного шрифта, а имя шрифта, который пытались создать.
Используй GetTextFace, получишь имя подобранного шрифта.
L>Есть второй момент а если несколько шрифтов имеют одно имя?
map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
Re[8]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, alsemm, Вы писали:
A>Используй GetTextFace, получишь имя подобранного шрифта.
Спасибо, не знал об этой функции!
A>map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts.
Здесь может лежать "мульти мап", никто не мешает мне установить шрифт с другим именем файла но тем же названием, и в реестре вроде будут две записи с одним именем?
Re[9]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, alsemm, Вы писали:
A>>Используй GetTextFace, получишь имя подобранного шрифта. L>Спасибо, не знал об этой функции!
A>>map<имя-шрифта,файл-шрифта> лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts. L>Здесь может лежать "мульти мап", никто не мешает мне установить шрифт с другим именем файла но тем же названием, и в реестре вроде будут две записи с одним именем?
Какая разница "мульти мап" в реестер или нет? Главное что он есть и не надо его руками строить. Ну начнешь ты его руками создавать, тот же мультимап и получится. Что делать будешь?
Не думаю что информация в реестре лежит "для красоты", скорее всего ей пользуется системный font mapper. Как он там конфликты (если он возможны, в принципе) разрешает — я не знаю. Поэкспериментируй.
Re: Получение имени файла и номера шрифта по HFONT
Решена. Для моих целей подходит взятие GetFontData для всего файла (тэг таблицы 0), и затем использование полученной информации как простого файла шрифта.
Выяснилась одна особенность, когда GetFontData получает шрифт из коллекции ttc, она просто обрезает первые несколько байтов, что приводит к ошибочности всех смещений внутри файла, ибо они отсчитываются от начала файла. Т.е. что бы это исправить нужно прочитать кол-во таблиц и в каждой из таблиц уменьшить смещение на разность размеров файлов (размер файла ttc можно получить передав в качестве тэга таблицы "ttcf" или 0x66637474). Документация по этим таблицам лежит тут http://www.microsoft.com/typography/otspec/otff.htm#otttables
Re[3]: Получение имени файла и номера шрифта по HFONT
От:
Аноним
Дата:
09.02.11 10:27
Оценка:
Здравствуйте, Leshyk, Вы писали:
L>Здравствуйте, CEMb, Вы писали:
CEM>>Может, гоню, но винды не идут в файл за фонтами при обращении, они уже все загружены, поэтому большой подозр, что соответсвующие имена файлов не держатся, потому что незачем.
L>Значит ли это что HFONT одного и того же шрифта всегда одинаков?
Простите, что апаю тему, искал нужную мне инфу по юнискрайбу и не смог сдержаться...
Канешно разные — ибо любой хендл созданый в приложение — это отображение системного объекта, посему даже если все время обращаться к одному и тому же объекту хэндлы будут разные.
Re[4]: Получение имени файла и номера шрифта по HFONT
От:
Аноним
Дата:
09.02.11 10:38
Оценка:
Здравствуйте, ASMelancholy, Вы писали:
ASM>Нет. Всегда разный. ASM>Простой пример: ASM>
Путем нехитрых манипуляций и изучения кода МФЦ оказываеться что можно
LOGFONT LogFont;
::GetObject(hFnt1, sizeof(LOGFONT), &LogFont);
LogFont.lfFaceName
Re[5]: Получение имени файла и номера шрифта по HFONT
Здравствуйте, Аноним, Вы писали:
ASM>>По HFONT нельзя узнать имя файла шрифта.
А>Путем нехитрых манипуляций и изучения кода МФЦ оказываеться что можно А>LOGFONT LogFont; А>::GetObject(hFnt1, sizeof(LOGFONT), &LogFont); А>LogFont.lfFaceName
Во-первых, для этого вовсе не нужны исходники MFC, а во-вторых, это имя шрифта , а не файла шрифта.