Модератор: Модераторы
Alex2013 писал(а):Просто TMetafile (+ Еще и скрипты) неизбежное зло с которым более мене понятно что делать (или не делать если все более или менее но утраивает )... Вот явно непропорциональные тормоза при увеличении разрешения рабочего поля напрягают. (Тем боле что ничего похожего во многих программах нет )
прорисовка элементов в TMetafile и из TMetafile в общий TMetafile, А это зачем ?У меня цикл сразу выводит отдельные "Metafile" на теневой битмап который потом копируется на канвас ПаинтБокса ... Хотя если подумать возможно будет реально быстрее ( за счет того, что Metafile может не иметь заранее заданных границ и не передает лишних "пустых "данных) . Но мне показалась, что если я буду рисовать метофайлы на прямую то будет видно как и куда "процесс пошел " что не есть хорошо .
zub писал(а):Данная схема либо требует от графической системы поддержки трансформаций, либо подходит только для статичных "картинок". Соглашусь с Alex2013 в векторном редакторе, где всё постоянно зумится и панится общий метафайл лишний - очень большая вероятность того что при следующей отрисовке он будет неактуален, например в кадр попадет чтото что раньше было невидимо и наоборот, ранее видимые примитивы уйдут за преджелы экрана
// Быстрая прорисовка призвольного фрагмента DrawList
// на CurCanvas
procedure TRF1.FastDrawFig(PosInList,FigCount:LongInt);
var I:Integer;
MC:TMetafileCanvas;
MyMetafile: TMetafile;
SaveCanvas:TCanvas;
FADD:Boolean;// Флаг для наглядого представления условий
Const
FMD:Boolean=True; // Флаг первого запуска
begin
// Ограничения
if DrawList=NIL then exit;
if DrawList.Count = 0 then exit;
If FigCount < 0 then exit;
If PosInList < 0 then exit;
If PosInList > DrawList.Count-1 then exit;
If PosInList+FigCount > DrawList.Count then
FigCount:= DrawList.Count-PosInList;
//Если список не пуст ...
SaveCanvas:=CurCanvas;
// проверка и создание MetaDrawList и ShadowDrawList ;
If MetaDrawList = Nil Then MetaDrawList:=Tlist.Create ;
If ShadowDrawList = Nil Then Begin ShadowDrawList:=TStringlist.Create ;
ShadowDrawList.Text:=DrawList.Text;
end;
// Главный цикл
For I:=PosInList TO PosInList+FigCount -1 DO
Begin
FADD :=FmD Or (I > ShadowDrawList.Count-1);
FADD := FADD Or (I > MetaDrawList.Count-1);
FADD := FADD Or (ShadowDrawList[I] <> DrawList[I]);
If FADD Then
begin
// Инициализирую метафайл ...
MyMetafile := TMetafile.Create;
MC:= TMetafileCanvas.CreateWithComment(MyMetafile, BufBMP.Canvas.handle,
'Author', 'Made This');
CurCanvas:=MC;//Перенаправляю Canvas
DrawFig(-1,DrawList[i]);//Рисую фигуру
MC.Free; //! Обязательно очищать MetafileCanvas преред "клонированием" ...
CurCanvas:=SaveCanvas;// Востанавливаю Canvas...
// Доплнение изменение списка MetaDrawList
//----------------------------------------
If FmD then MetaDrawList.Add(MyMetafile)
// Первый раз безусловное добавление
else
if I<=MetaDrawList.Count-1 then
// Простая замена в границах списка
begin
TMetafile(MetaDrawList[i]).Free;
MetaDrawList[i]:=MyMetafile;
end
else
if I=MetaDrawList.Count then
// Добавить в конец списка если на единцу бльше
MetaDrawList.Add(MyMetafile);
//=================================================
CurCanvas.Draw(0,0,TMetafile(MetaDrawList[i])); //draw
end else
begin
CurCanvas.Draw(0,0,TMetafile(MetaDrawList[i])); //fast draw
end
end ;
FMD:=False ;// Сброс флага
ShadowDrawList.Text:=DrawList.Text; // Сбросить различия
Listbox1.Items.Text:=DrawList.Text; //? Освежить видимый список комманд
end;
// Защита от мерцания
If b1=nil then B1:=TBitmap.Create;
B1.Assign(BufBMP);// сохраняю теневой битмап
//кстати это еще один способ быстрого копирования между битмапами
CurCanvas :=BufBmp.Canvas;
FastDrawFig(DrawList.Count-1,1);// рисую на нем ...
ReStoreBuf; // "Восстанавливаю" картинку ( то есть рисую в месте с фигурой )
CurCanvas:=PaintBox1.Canvas;
CurCanvas.Refresh;
BufBMP.Assign(B1); // ...и командую "тень знай свое место "... :wink:
b1.FreeImage;
//--------------------------------------
zub писал(а):Ок пусть будет общий метафайл. Но это только технический момент - способ скармливания большого числа примитивов в GDI, причем не везде он присутствует.
Отталкиваться надо от алгоритмов, а не от деталей реализации
zub писал(а):>>На TBitmap-е рисуете графику, потом BitBlt обновляете.
Кстати GDI в LCL кроссплатформенно, а вот метафайлы емнип нет, Alex2013 чтоб потом для тебя сюрпризом небыло, когда под линь компильнуть решишь))
zub писал(а):Ты собираешся постить на форуме каждый чих? Для этого есть комменты к комитам системы контроля версий.
Фигово ты както выделил - какието глобальные переменные остались
метафайлы - часть GDI, их нет нет под линуксом.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6