Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Наборы векторов из символа шрифта [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]]));


Наверх

Титульная страница Поиск, карта сайта Написать письмо