Модератор: Модераторы
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, их нет нет под линуксом.
 (Там же просто запись команд в формате WMF вместо реального рисования )
 (Там же просто запись команд в формате WMF вместо реального рисования ) (Там же просто запись команд в формате WMF вместо реального рисования )
 (Там же просто запись команд в формате WMF вместо реального рисования )Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1