[fpc-pascal] AggPas / PTCGraph dynamic memory allocation

James Richters james at productionautomation.net
Sat Nov 11 02:48:43 CET 2017


I've been trying to figure out how to dynamically allocate memory to be used as a screen buffer to display AggPas generated images with PTCGraph.     I don't want it hard coded because I do not know what resolution monitor is going to be used.   Here is where I am at:  

I can define a static variable like this:
Const
   RGB_Width = 2;
   Buffer_Width=1920;
   Buffer_Height=1280;
Type
TGraphBitmapBuffer=packed record
  width,
  height,
  reserved:  LongInt; 
  data: 	array[0.. (Buffer_Width+1) * (Buffer_Height+1)] of word;   // I don't know why I need the +1's but it won't work without them
End;

Var
   graph_buffer: TGraphBitmapBuffer;

Then I attach it to AggPas with:
  agg^.attach(@graph_buffer.data, graph_buffer.width, graph_buffer.height, - graph_buffer.width * RGB_Width);

Then I put it on the screen with:
PutImage(0,0,graph_buffer,NormalPut); 

I should point out that I like to do  this:
Original_screen:=graph_buffer;  to save my screen then put new stuff on it,  then just copy back the original and putimage it back when I'm done.  So I need a solution that will allow me to do this.  I also don't always use the whole screen,  sometimes I just want to getimage a little area, and putimage that back... but I don't know the size of these areas... they are calculated based on the resolution of the monitor and various settings and configurations.

Here is where I am at with my attempt to make the memory dynamically allocated:

I can use a dynamic method with PTCGraph with getimage and putimage
But if I allocate memory this way, while it works fine with getimage and putimage, I can't figure out how to use it with AggPas because the first 3 words are not part of the bitmap data...  It seems like there should be a way to make this work but the solution eludes me.
I've been trying to come up with a way to do *something* like this:

Var
   graph_buffer: Pointer;
  Max_X, Max_Y: Word;

Max_X:=1920;  //these will be detected by PTCGraph... 
Max_Y:=1280;
Size := ImageSize(0, 0, Max_X-1, Max_Y-1);
GetMem(graph_buffer, Size);   
GetImage(0, 0, Max_X-1, Max_Y-1, graph_buffer^);

agg^.attach(@graph_buffer[12], Max_X-1,Max_Y-1, -(Max_X-1) * RGB_Width);  //graph_buffer[12] is to skip over the 3 longints 4 bytes each

PutImage(0,0,graph_buffer^,NormalPut);

The problem is with Agg^.attac()  of course now graph_buffer isn't an array anymore...  so what I have won't work and I haven' figured out how to attach AggPas  at a position where the bitmap data is so I can use PutImage and still have the Longints that were put in by GetImage.

Any advice is greatly appreciated

James






More information about the fpc-pascal mailing list