Помогите с функцией GetGlyphOutline (WinAPI) - PullRequest
0 голосов
/ 10 июня 2010

Я хочу использовать эту функцию для получения контуров, а внутри этих контуров я хочу получить кубический Безье.Я думаю, что я должен позвонить с GGO_BEZIER.Что меня удивляет, так это то, как работает буфер возврата.

"Контур глифа возвращается в виде серии из одного или нескольких контуров, определенных структурой TTPOLYGONHEADER, за которыми следуют одна или несколько кривых. Каждая кривая в контуреопределяется структурой TTPOLYCURVE, за которой следует ряд точек данных POINTFX. Точки POINTFX являются абсолютными позициями, а не относительными перемещениями. Начальная точка контура задается элементом pfxStart структуры TTPOLYGONHEADER. Начальная точка каждой кривой - этопоследняя точка предыдущей кривой или начальная точка контура. Количество точек данных в кривой хранится в элементе cpfx структуры TTPOLYCURVE. Размер каждого контура в буфере в байтах сохраняется в элементе cbструктуры TTPOLYGONHEADER. Дополнительные определения кривой упаковываются в буфер после предыдущих кривых, а дополнительные контуры упаковываются в буфер после предыдущих контуров. Буфер содержит столько контуров, сколько умещается в буфереfer возвращен GetGlyphOutline. "

Я действительно не уверен, как получить доступ к контурам.Я знаю, что могу изменить указатель другого типа, но я не уверен, как мне получить контуры на основе этой документации.

Спасибо

1 Ответ

1 голос
/ 10 июня 2010

Я никогда не использовал этот API сам, но после прочтения документации MSDN я подумал, что он работает так:

Сначала вам нужно вызвать GetGlyphOutline с параметром lpvBuffer, установленным на NULL,Затем функция вернет необходимый размер буфера.Затем вам нужно будет выделить буфер с таким размером, а затем снова вызвать функцию с lpvBuffer, установленным в только что созданный вами буфер.
Если вы посмотрите на документацию для TTPOLYGONHEADER, там написано:

За каждой структурой TTPOLYGONHEADER следует одна или несколько структур TTPOLYCURVE.

Итак,в основном вы должны сделать что-то вроде этого:

BYTE*              pMyBuffer   = NULL;
...
TTPOLYGONHEADER*    pPolyHdr    = reinterpret_cast<TTPOLYGONHEADER*>(pMyBuffer);
TTPOLYCURVE*        pPolyCurve  = reinterpret_cast<TTPOLYCURVE*>(pMyBuffer + sizeof(TTPOLYGONHEADER));

Затем проверьте элемент pPolyCurve->cpfx, который содержит количество структур POINTFX.Затем вы можете перебрать все точки, выполнив что-то вроде этого:

for (WORD i = 0; i < pPolyCurve->cpfx: ++i)
{
    pCurve->apfx[i].x;
    pCurve->apfx[i].y;
}

Поскольку TTPOLYGONHEADER не сообщает вам, сколько TTPOLYCURVE структур находится в буфере, я думаю, вам придетсяследите за этим самостоятельно, вычитая размер отдельных структур из размера вашего буфера и продолжайте, пока не достигнете 0.

Пожалуйста, извините за любые потенциальные ошибки, поскольку я сам не проверял это:)

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