Получение таблицы сообщений шрифта TrueType из имени шрифта

Я пытаюсь извлечь таблицу «post» из установленного шрифта TrueType, который я знаю только по имени. Как я могу этого добиться?

Я видел функцию GetFontData , который, кажется, делает почти то, что я хочу, за исключением того, что он получает данные шрифта из текущего загруженного шрифта контекста устройства. В моем случае, хотя у меня нет контекста устройства, только имя шрифта.
Кроме того, я видел похожие запросы, такие как this для поиска и извлечения всего файла шрифта, но это кажется излишне неэффективным и многословным, учитывая, что Windows может уже загружать и анализировать данные шрифта (как мы видим для GetFontData). Кроме того, мне не нужен весь файл, а только таблица "post". Неужели нет другого способа, кроме как реализовать все это самому?


person MC ΔT    schedule 15.05.2019    source источник
comment
Я не уверен, что вы просите. Если GetFontData(...) дает вам то, что вы хотите, выберите шрифт в HDC и вызовите его.   -  person jwezorek    schedule 15.05.2019
comment
@jwezorek Но наличие HDC подразумевает настройку и/или привязку к какому-то контексту рендеринга, не так ли? Которого у меня нет и не нужно. Я ничего подобного не делаю, у меня даже окна нет.   -  person MC ΔT    schedule 15.05.2019
comment
Что именно вы подразумеваете под почтовым столом?   -  person Strive Sun    schedule 16.05.2019
comment
Это одна из таблиц в формате файла шрифта TrueType, обозначенная строкой post.   -  person MC ΔT    schedule 16.05.2019


Ответы (1)


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

#include <Windows.h>
#include <vector>

std::vector<unsigned char> GetFontDataByName(const wchar_t* font_name)
{
    HDC hdc = CreateCompatibleDC(NULL);

    auto font = CreateFont(0, 0, 0, 0,
        FW_NORMAL, FALSE, FALSE, FALSE,
        ANSI_CHARSET, OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
        DEFAULT_PITCH,
        font_name);
    SelectObject(hdc, font);
    auto num_bytes = GetFontData(hdc, 0, 0, NULL, 0);
    std::vector<unsigned char> font_data(num_bytes);
    auto result = GetFontData(hdc, 0, 0, &(font_data[0]), num_bytes);

    DeleteDC(hdc);

    return font_data;
}

int main()
{
    auto font_data = GetFontDataByName(L"Times New Roman");

    return 0;
}
person jwezorek    schedule 15.05.2019
comment
Из CreateFont: Поскольку доступные шрифты могут варьироваться от системы к системе, не думайте, что выбранный шрифт всегда совпадает с запрошенным шрифтом. Например, если вы запрашиваете шрифт с именем Palatino, но такой шрифт недоступен в системе, программа сопоставления шрифтов заменит шрифт с похожими атрибутами, но с другим именем. - person IInspectable; 15.05.2019
comment
ОП утверждает, что шрифт установлен и у него есть только его название. Учитывая, что он установлен, CreateFont гарантированно создаст какую-то его версию, однако, я думаю, может быть несколько версий. Вы должны различать их, уделяя больше внимания другим параметрам, которые вы предоставляете CreateFont помимо имени шрифта, потому что они будут влиять на логику сопоставления. - person jwezorek; 16.05.2019