views:

140

answers:

1

What im trying to do

I have a drawing procedure (it works) it draws to a bitmap "OBJmap" it then puts OBJmap into Wholemap,, this all works but there is a issue,, it seems to treat the undefined parts of objmap as white even though objmap and wholemap is set as PF32Bit. and hence when it puts objmap into wholemap i get a white box behind the pasted image that should be transparent. this only happens on ATI machines. but this is for schools and they all have 100% ati because there cheep,(im not biased honest) so i was recommended to use AggPas to solve this issue.

My code

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;

Image examples

Not working ,Working and ,current respectivly

alt text alt text alt text

I am only able to get working result on Nvidia machines with the default

wholemap.Canvas.Draw

Method and I wish to get it to work on all machines using aggpass.

What do I do how do I draw objmap onto wholemap but not draw the transparent bits?

A: 

Try BitmapAlphaTransparency(wholemap, 0); before WG.attach.

Milan
If I Use TransformImage now with setting bitmapalpha it get the outline of the image, the background being alpha 255 and the object being alpha 0,,, is there a way just to simply flip the alpha channel?,,, it looks like this at the moment,http://i44.photobucket.com/albums/f14/keahicheveyo/outside.jpg
Arthur
AggPas doesn't provide a functionality of drawing one TBitmap over another TBitmap, it can only Attach to TBitmap and render content over there. Either Attach directly to the wholemap and render there or use a bitmap oriented library such as Gr32 to deal with blending one TBitmap over another. If you want to flip Alpha, have a look at BitmapAlphaTransparency function and make a new based on that with Alpha flip functionality, its almost trivial.
Milan