Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Наборы векторов из символа шрифта   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
4-1183566201
RAndrey
2007-07-04 20:23
2008.02.10
не работает ShellExecute


2-1200297002
asdf
2008-01-14 10:50
2008.02.10
Как переключить среду разработки на использование CLX?


15-1199936235
Slider007
2008-01-10 06:37
2008.02.10
С днем рождения ! 10 января 2008 четверг


10-1138801820
Вопрошающий
2006-02-01 16:50
2008.02.10
Не работает удалённо клиент


2-1200801804
ply
2008-01-20 07:03
2008.02.10
глобальная переменная - доступ из всех форм