AggPas Delphi Рисование прозрачных пленок - PullRequest
2 голосов
/ 18 июля 2010

Что я пытаюсь сделать

У меня есть процедура рисования (она работает), она рисует в растровое изображение "OBJmap", а затем помещает OBJmap в Wholemap.Это все работает, но есть проблема.Кажется, что неопределенные части objmap обрабатываются как белые, хотя objmap и wholemap установлены как PF32Bit, и, следовательно, когда он помещает objmap во всю карту, за вставленным изображением появляется белое поле, которое должно быть прозрачным.Это происходит только на машинах ATI, но это для школ, и все они имеют 100% -ую ату, потому что они дешевые (я не предвзятый, честный), поэтому я рекомендовал использовать AggPas для решения этой проблемы.Мой код

procedure DrawScene();
var
  ObjLength,LineLength,Filllength,Obj,lin,angle,i,x1,y1,x2,y2:integer;
  Npoints : array[0..1] of Tpoint;
  WG,OG: Tagg2d;

  Objmap,wholemap:TBitmap;
begin
  //Set up WholeMap Bitmap
  wholemap := TBitmap.Create;
  wholemap.PixelFormat:=pf32bit;
  wholemap.Transparent:=false;
  wholemap.Width:=area;
  wholemap.height:=area;

  WG:= Tagg2d.create;
  BitmapAlphaTransparency(wholemap, 0);
  WG.attach(wholemap,False);
  WG.ClearAll(255,0,0,255);
  //BitmapAlphaTransparency(wholemap, 255);

  //WG.MasterAlpha(255);

  // itterate through each object drawing the object to OBJmap
  ObjLength:=length(Objects);
  for Obj:=0 to (ObjLength-1) do
  if objects[Obj].Visible then
  begin
    //Set up Object map Bitmap
    Objmap := TBitmap.Create;
    Objmap.PixelFormat:=pf32bit;

    Objmap.Transparent:=true;
    Objmap.Width:=Objects[obj].Boundright-objects[obj].Boundleft+3;
    Objmap.height:=Objects[obj].BoundTop-objects[obj].Boundbottom+3;

    OG:= Tagg2d.create;
    OG.attach(Objmap,False);

    {OG.ClearAll(0,0,255,255);  // Clears all bitmap to transparrent
    OG.MasterAlpha(255);
    OG.LineWidth(5);
    og.AntiAliasGamma(255);
    OG.
    OG.LineColor(0,255,0,255);
    OG.FillColor(0,255,0,255);
    //OG.
    OG.MoveTo(0,0);
    OG.LineTo(Objmap.width-1,Objmap.height-1); }

    //Draw the Lines to Objmap
    LineLength:=length(objects[Obj].Lines)-1;
    angle:=objects[Obj].Rotation;
    for lin:=0 to (LineLength) do
    begin
      //Transform points
      for i:=0 to 1 do
        Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),point(-objects[obj].boundleft,-Objects[obj].Boundbottom),false);
      //draw transformed points
      Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap,OG);
    end;
    //Draw the Fills to Objmap
    Filllength:=length(objects[Obj].Fills)-1;
    for i:=0 to Filllength do
    begin
      //transform points
      Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),point(-objects[obj].boundleft,-Objects[obj].Boundbottom),false);
      // fill points
      Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
    end;

    //draw objmap to wholemap
    x1:=objects[obj].Position.x+objects[obj].Boundleft-1;
    y1:=area-(objects[obj].Position.y+objects[obj].Boundtop)-2;
    x2:=x1+Objmap.Width;
    y2:=y1+Objmap.Height;

    WG.TransformImage(Objmap,x1,y1,x2,y2);  //this show border
    //WG.copyimage(Objmap,x1,y1);  //this draws the scene up but does not handle transparencies correctly
    //wholemap.Canvas.Draw(x1,y1,Objmap);//does not work in PF32bit or on ati machines


    //wg.Free; // this it does not like (crash) do i need it?
    Objmap.Free;
  end;


   // write wholemap to Visible Canvas
   mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
   wholemap.Free;
   mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;
end;

Примеры изображений

Не работает, Работает и, текущий соответственно

alt text alt text alt text

Я могу получить рабочий результат только на машинах Nvidia с методом по умолчанию

wholemap.Canvas.Draw

и хочу, чтобы он работал на всех машинах с использованием aggpass.

Что мне делать, как я рисую objmap на всю карту, но не рисую прозрачные биты?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2010

У меня была та же проблема, вам нужно установить BlendMode перед вызовом Transform Image

WG.BlendMode(AGG_BlendSrcTop);

Это сработало для меня, но вам, возможно, придется попробовать несколько режимов наложения, чтобы получить правильный ответ.

2 голосов
/ 19 июля 2010

Попробуйте BitmapAlphaTransparency (целая карта, 0); до WG.attach.

...