Получение таблицы «post» шрифтов TrueType из имени шрифта - PullRequest
2 голосов
/ 15 мая 2019

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

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

1 Ответ

2 голосов
/ 15 мая 2019

Вы можете вызвать 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;
}
...