Windows: получение контуров глифов для символов подстановки из других шрифтов - PullRequest
2 голосов
/ 01 декабря 2009

Мне нужно визуализировать шрифты в трехмерном игровом мире, поэтому я использую функцию контура GetGlyphOutline, чтобы преобразовать формы глифов в текстуру. Тем не менее, я хочу иметь возможность обрабатывать случай, когда символы не присутствуют в данном шрифте (как это часто случается для другого азиатского другого международного текста). Рендеринг текста в Windows автоматически заменяет шрифты, содержащие нужные символы. Но GetGlyphOutline не будет. Как я могу обнаружить этот случай и получить схемы для замещенных глифов? В Mac OS X Core Text есть функция, позволяющая получить соответствующий шрифт замещения для данного шрифта и строки - есть ли что-нибудь похожее в Windows?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Выяснил, что мне нужно было знать самому: интерфейс IMLangFontLink , особенно метод MapFont, содержит необходимую функциональность для определения того, какие шрифты замещения следует использовать в окнах.

1 голос
/ 06 января 2011

Я тоже озадачился GetGlyphOutline. Я не уверен, что вы смогли сделать то же самое, но мне удалось получить наброски со смешанным текстом, используя TextOut() в сочетании с BeginPath(), EndPath() и GetPath().

Например, даже с помощью шрифта Arial я могу получить путь к тексту на японском языке using テ ス ト 」(используя C ++, но также легко можно сделать и на C):

SelectObject(hdc, hArialFont);
BeginPath(hdc);
TextOut(hdc, 100, 100, L"\u30c6\u30b9\u30c8"); // auto font subbing
EndPath(hdc);

// get number of points in path
int pc = GetPath(hdc, NULL, NULL, 0);

if (pc > 0)
{
    std::vector<POINT> points(pc);
    std::vector<BYTE> types(pc); // PT_MOVETO, PT_LINETO, PT_BEZIERTO

    GetPath(hdc, &points[0], &types[0], pc);

    // it seems the first four points are the bounding rect
    // subsequent points match up to their types

    for (int i = 4; i < pc; i++)
    {
        if (types[i] == PT_LINETO)
            LineTo(hdc, points[i].x, points[i].y); // etc
    }
}
...