![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Наборы векторов из символа шрифта [D6, Win95/98, WinXP]
Dib@zol © (2007-06-19 12:11:00)УРА!!! СТАБИЛЬНЫЙ КОННЕКТ!!!!!!!!!
Как вынуть "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 принадлежит главному окну. Что я делаю неправильно?
Dib@zol (2007-07-03 11:16:00) [1]И вот ешшо текстурка, к-рую нада поместить в папку с прогой [хотя работать будет и без неё]:
http://webfile.ru/1458181
Dib@zol (2007-07-03 10:52:00) [2]Простите... :)
http://webfile.ru/1458150
Dib@zol (2007-07-03 10:51:00) [3]Кстати у меня тут уже готов на основе этих аутлайнов практически готовый скринсейвер! Прошу:
http:/www.webfile.ru/1458150
Dib@zol (2007-07-03 10:49:00) [4]Удалено модератором
Игорь Шевченко (2007-07-03 10:22:00) [5]Dib@zol (20.06.07 10:46) [8]
> Забивать область памяти нулями
Любите хелп - источник знаний.
Dib@zol (2007-06-20 10:46:00) [6]
> А как это - удалять??
Забивать область памяти нулями
MBo (2007-06-20 10:14:00) [7]>копировать, а затем удалять!
А как это - удалять??
Лучше прочитать хелп по CopyMemory и MoveMemory, а не заниматься домыслами.
Последняя функция копирует содержимое памяти из одного блока в другой, причем они могут перекрываться.
Dib@zol (2007-06-20 10:09:00) [8]Переноситьблок памяти из одной локации в другую. Сиречь копировать, а затем удалять!
MBo (2007-06-20 10:07:00) [9]>Дык это же MOVEmemory, а не COPYmemory !!! Пчм происходит копирование???
:)
А что, по-твоему, должна делать функция MoveMemory?
Dib@zol (2007-06-20 09:52:00) [10]
> копируете вы во все элементы массива
Дык это же MOVEmemory, а не COPYmemory !!! Пчм происходит копирование???
Однокамушкин (2007-06-19 16:09:00) [11]С GDI_ERROR удалось разобраться, просто 122 байт для шрифта Arial, который я выбрал, было мало, там 152 байта... вообще, делать надо так, как написал MBo - сначала вызывать функцию, чтобы узнать размер буфера, а потом вызыввать ещё раз, передавая буфер нужного размера...
Теперь посмотрите внимательно на этот цикл:
for i:=1 to tph.cb do
MoveMemory(@ttp[i], p, 12);
Во-первых, в динамических массивах индексация идёт от 0, а не от 1... Во-вторых, второй параметр у вас всегда одинаковый, так что копируете вы во все элементы массива данные из одного и того же места - неудивительно, что они получаются одинаковые... ну и в-третьих, как я уже сказал, массив здесь использовать вообще нельзя, т.к. на разные кривые отводится разные объёмы памяти из-за добавления неопределённого количества POINTFX
Однокамушкин (2007-06-19 12:57:00) [12]Хм... очень странно... GetGlyphOutline возвращает -1 (GDI_ERROR), а GetLastError - 0...
Кстати, массив TTPOLYCURVE - это явно неправильное решение, в структуре, возвращаемой GetGlyphOutline, после каждого элемента TTPOLYCURVE может быть ещё неопределённое количество POINTFX...
MBo (2007-06-19 12:57:00) [13]Сырые данные для символов '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]]));