Форум: "WinAPI";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
ВнизНаборы векторов из символа шрифта Найти похожие ветки
← →
Dib@zol (2007-06-19 12:11) [0]УРА!!! СТАБИЛЬНЫЙ КОННЕКТ!!!!!!!!!
Как вынуть "outline" из символа определённого шрифта? Пробовал GetGlyphOutline, но вышла какаято фигня:
procedure ExtractLetter(DC:HDC);
var
GM : GLYPHMETRICS;
M2 : MAT2;
i : Cardinal;
p : pointer;
tph : TTPOLYGONHEADER;
ttp : array of TTPOLYCURVE;
begin
SelectObject(DC, F);
GM.gmBlackBoxX:=24;
GM.gmBlackBoxY:=25;
GM.gmptGlyphOrigin.X:=-1;
GM.gmptGlyphOrigin.Y:=25;
GM.gmCellIncX:=25;
GM.gmCellIncY:=0;
M2.eM11.value:=1; M2.eM11.fract:=0; M2.eM12.value:=0; M2.eM12.fract:=0;
M2.eM21.value:=0; M2.eM21.fract:=0; M2.eM22.value:=1; M2.eM22.fract:=0;
GetMem(p, 112);
GetGlyphOutline(DC, Ord("A"), GGO_NATIVE, GM, 112, p, M2);
MoveMemory(@tph, p, 16);
SetLength(ttp, tph.cb);
for i:=1 to tph.cb do
MoveMemory(@ttp[i], p, 12);
{Какие-нить действия}
Finalize(ttp);
exit;
end;
Но в итоге во всех ячейках массива ttp - одинаковые значения.
шрифт в DC я задаю гарантированно верно. Сам DC принадлежит главному окну. Что я делаю неправильно?
← →
Однокамушкин (2007-06-19 12:57) [1]Хм... очень странно... GetGlyphOutline возвращает -1 (GDI_ERROR), а GetLastError - 0...
Кстати, массив TTPOLYCURVE - это явно неправильное решение, в структуре, возвращаемой GetGlyphOutline, после каждого элемента TTPOLYCURVE может быть ещё неопределённое количество POINTFX...
← →
MBo © (2007-06-19 12:57) [2]Сырые данные для символов "T" и "O" различаются, подробнее я не анализировал.
procedure TForm3.Button1Click(Sender: TObject);
var
gm: TGlyphMetrics;
pbT, pbO: PByteArray;
Mat: TMat2;
i, LenT, LenO : Integer;
begin
FillChar(Mat, SizeOf(Mat), 0);
Mat.eM11.value := 1;
Mat.eM22.value := 1;
Canvas.Font.Name := "Arial";
Canvas.Font.Size := 36;
LenT :=GetGlyphOutline(Canvas.Handle, Ord("T"), GGO_NATIVE, gm, 0, Nil, Mat);
GetMem(pbT, LenT);
GetGlyphOutline(Canvas.Handle, Ord("T"), GGO_NATIVE, gm, LenT, pbT, Mat);
LenO :=GetGlyphOutline(Canvas.Handle, Ord("O"), GGO_NATIVE, gm, 0, Nil, Mat);
GetMem(pbO, LenO);
GetGlyphOutline(Canvas.Handle, Ord("O"), GGO_NATIVE, gm, LenO, pbO, Mat);
for i := 0 to Min(LenT, LenO) - 1 do
Memo1.Lines.Add(Format("%d %d",[pbT[i], pbO[i]]));
← →
Однокамушкин (2007-06-19 16:09) [3]С GDI_ERROR удалось разобраться, просто 122 байт для шрифта Arial, который я выбрал, было мало, там 152 байта... вообще, делать надо так, как написал MBo - сначала вызывать функцию, чтобы узнать размер буфера, а потом вызыввать ещё раз, передавая буфер нужного размера...
Теперь посмотрите внимательно на этот цикл:for i:=1 to tph.cb do
MoveMemory(@ttp[i], p, 12);
Во-первых, в динамических массивах индексация идёт от 0, а не от 1... Во-вторых, второй параметр у вас всегда одинаковый, так что копируете вы во все элементы массива данные из одного и того же места - неудивительно, что они получаются одинаковые... ну и в-третьих, как я уже сказал, массив здесь использовать вообще нельзя, т.к. на разные кривые отводится разные объёмы памяти из-за добавления неопределённого количества POINTFX
← →
Dib@zol (2007-06-20 09:52) [4]
> копируете вы во все элементы массива
Дык это же MOVEmemory, а не COPYmemory !!! Пчм происходит копирование???
← →
MBo © (2007-06-20 10:07) [5]>Дык это же MOVEmemory, а не COPYmemory !!! Пчм происходит копирование???
:)
А что, по-твоему, должна делать функция MoveMemory?
← →
Dib@zol (2007-06-20 10:09) [6]Переносить блок памяти из одной локации в другую. Сиречь копировать, а затем удалять!
← →
MBo © (2007-06-20 10:14) [7]>копировать, а затем удалять!
А как это - удалять??
Лучше прочитать хелп по CopyMemory и MoveMemory, а не заниматься домыслами.
Последняя функция копирует содержимое памяти из одного блока в другой, причем они могут перекрываться.
← →
Dib@zol (2007-06-20 10:46) [8]
> А как это - удалять??
Забивать область памяти нулями
← →
Игорь Шевченко © (2007-07-03 10:22) [9]Dib@zol (20.06.07 10:46) [8]
> Забивать область памяти нулями
Любите хелп - источник знаний.
← →
Dib@zol (2007-07-03 10:49) [10]Удалено модератором
← →
Dib@zol (2007-07-03 10:51) [11]Кстати у меня тут уже готов на основе этих аутлайнов практически готовый скринсейвер! Прошу:
http:/www.webfile.ru/1458150
← →
Dib@zol (2007-07-03 10:52) [12]Простите... :)
http://webfile.ru/1458150
← →
Dib@zol (2007-07-03 11:16) [13]И вот ешшо текстурка, к-рую нада поместить в папку с прогой [хотя работать будет и без неё]:
http://webfile.ru/1458181
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c