Почему GetGlyphIndicesW добавляет, казалось бы, несуществующие отображения для определенных диапазонов символов? - PullRequest
1 голос
/ 17 мая 2019

Поэтому я использую Windows GetGlyphIndiciesW, чтобы получить индексы глифов для некоторых символьных шрифтов, с которыми я экспериментирую.Эти шрифты обеспечивают сопоставления для символов в области частного использования Unicode (около 0xF000), и, насколько я знаю, это единственные сопоставления, которые у них есть.Тем не менее, GetGlyphIndicesW всегда, кажется, «добавляет» отображения из других кодов символов, особенно в диапазоне ASCII, в некоторые из глифов.Некоторые примеры кода, использующие шрифт Microsoft «Webdings»:

#include <cstdint>
#include <fstream>
#include <Windows.h>

int main()
{
    HDC device_context = CreateCompatibleDC(NULL);
    auto font = CreateFont(0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH, L"Webdings");
    auto old_font = SelectObject(device_context, font);

    std::ofstream file("mappings.txt");
    for (WCHAR i = 0; i < 0xF200; ++i) {
        WORD index;
        GetGlyphIndicesW(device_context, &i, 1, &index, GGI_MARK_NONEXISTING_GLYPHS);
        file << "0x" << std::hex << i << ' ';
        if (index == 0xFFFFu) {
            file << "N/A";
        }
        else {
            file << std::dec << index;
        }
        file << '\n';
    }

    SelectObject(device_context, old_font);
    DeleteObject(font);
    DeleteDC(device_context);
}

, который просто печатает для сохранения каждого символьного кода от 0 до 0xF1FF и его сопоставления глифа, если он существует.
Как и ожидалось, существует непрерывный диапазонот 0xF020 до 0xF0FF сопоставление каждому глифу.Но есть также несколько отображений вокруг 0x2015 (немного странно) и довольно много от 0 до 0xFF.От 0 до 0x1F отображается на глиф 0, затем от 0x20 до 0x7E отображается от 3 до 97, затем разрыв в основном не отображается, а затем от 0xA2 до 0xFF отображается от 132 до 225.
Тем не менее, если смотреть в различных редакторах шрифтов, таких отображений определенно нет.вне 0xF020 до 0xF0FF.И еще более странным является то, что различные различные символьные шрифты, такие как «Symbol» и «Wingdings», и даже некоторые сторонние проприетарные, которые я тестировал, имеют почти точно такие же шаблоны дополнительных сопоставлений, «добавленных» к GetGlyphIndicesW.

Так что же происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...