[fpc-pascal] Implementing AggPas with PtcGraph
Stefan V. Pantazi
svpantazi at gmail.com
Sat Jun 3 02:56:51 CEST 2017
An interesting challenge. It works now. I updated your test program,
made it as minimal as possible (see attached). The key to solving the
problem was the info available here:
http://pascal.net.ru/PutImage+(en)
[...]
"BitMap is an untyped parameter that contains the height and width of
the region, and the bit image that will be put onto the screen."
[...]
Enjoy,
Stefan
On 06/02/2017 07:40 AM, James Richters wrote:
> Thanks for the help. I was able to make a little progress.
>
>> There is another agg unit agg_pixfmt_rgb_packed that seem to have the
>> 565 format that you need. Add it to the uses list and try to replace the
>> pixfmt_rgba32 calls with pixfmt_rgb565. That will make agg use that format.
>> The pixfmt_custom_blend_rgba calls may need further hacking too to make things work, however, Agg2D should use a 16 bit format if you use
>> pixfmt_rgb565 callse instead of pixfmt_rgba32. You should also set RGBA_Width =2; in your program to reflect the change.
>
> I did as you suggest here and changed my buffer to be an array of words, and I am able to get a representation of the image to screen by reading elements of the array and using putpixel() to put them on the screen, however the colors are all wrong. I am wondering if this m_pixformat variable that shows up everywhere needs to be set also? The pixfmt_custom_blend_rgba calls may also be the problem with the colors. There are no corresponding custom blend procedures in agg_pixfmt_rgb_packed.
>
>> Anyway, this will probably still not make
>> ptcgraph.putimage(0,0,buf[0],0);
> No this still does not work, I am able to use a nested loop and putpixel() but that is very slow. I still think something is missing with putimage because I don't see how it knows the shape of the image, maybe I need to actually do a getimage() at some point to set the shape of before putimage will work.. I'll do some experiments with it.
>
> James
>
> -----Original Message-----
> From: fpc-pascal [mailto:fpc-pascal-bounces at lists.freepascal.org] On Behalf Of Stefan V. Pantazi
> Sent: Thursday, June 01, 2017 9:47 AM
> To: FPC-Pascal users discussions <fpc-pascal at lists.freepascal.org>
> Subject: Re: [fpc-pascal] Implementing AggPas with PtcGraph
>
> Have a look at the agg_2D unit. The agg_2D uses ..
> agg_pixfmt ,
> agg_pixfmt_rgba ,
> ..
>
> Therefore, the rgba format is pretty much baked in. That is to say that the constructor of the main object Agg2D uses the pixfmt_rgba32 to set the pixel format.
>
> ...
> { CONSTRUCT }
> constructor Agg2D.Construct;
> begin
> m_rbuf.Construct;
>
> pixfmt_rgba32 (m_pixFormat , at m_rbuf );
> pixfmt_custom_blend_rgba(m_pixFormatComp , at m_rbuf , at comp_op_adaptor_rgba ,rgba_order );
> pixfmt_rgba32 (m_pixFormatPre , at m_rbuf );
> pixfmt_custom_blend_rgba(m_pixFormatCompPre , at m_rbuf , at comp_op_adaptor_rgba ,rgba_order ); ...
>
> There is another agg unit agg_pixfmt_rgb_packed that seem to have the
> 565 format that you need. Add it to the uses list and try to replace the
> pixfmt_rgba32 calls with pixfmt_rgb565. That will make agg use that format.
>
> The pixfmt_custom_blend_rgba calls may need further hacking too to make things work, however, Agg2D should use a 16 bit format if you use
> pixfmt_rgb565 callse instead of pixfmt_rgba32. You should also set RGBA_Width =2; in your program to reflect the change.
>
> Anyway, this will probably still not make
>
> ptcgraph.putimage(0,0,buf[0],0);
> work, but that may be a ptcgraph problem.
>
>
> Hope this helps,
>
> Stefan
>
> On 05/31/2017 02:57 PM, James Richters wrote:
>>> And AggPas already has support for that pixel format
>>
>> How do I define that as the format I want? I've been looking all through the example and do not see how this is defined. I've attached a test program, it's basically Graeme's sample but going to screen instead of a file. I just don't see where the pixel format is defined. I have it kind of working in a funny way by just forcing the existing pixels to conform to the required format.
>>
>> -----Original Message-----
>> From: fpc-pascal [mailto:fpc-pascal-bounces at lists.freepascal.org] On
>> Behalf Of Graeme Geldenhuys
>> Sent: Wednesday, May 31, 2017 1:17 PM
>> To: fpc-pascal at lists.freepascal.org
>> Subject: Re: [fpc-pascal] Implementing AggPas with PtcGraph
>>
>> On 2017-05-31 18:03, Reimar Grabowski wrote:
>>>> I'm not sure what that's called
>>> RGB565, maybe?
>>
>> And AggPas already has support for that pixel format.
>>
>> Regards,
>> Graeme
>>
>> _______________________________________________
>> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>
>>
>>
>> _______________________________________________
>> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
-------------- next part --------------
{
This is a console application demo. It uses the Agg2D object,
which has a much friendlier API, to do all the drawing.
The drawing buffer is then displayed in a window using ptcgraph and 16 bit 656 RGB color format.
Requires modification of Agg2D object to use the 16 bit color format.
Uses a GraphBitmapBuffer type that includes contains the width and height of the image per the info at this URL:
http://pascal.net.ru/PutImage+(en)
[...]
"BitMap is an untyped parameter that contains the height and width of the region, and the bit image that will be put onto the screen."
[...]
}
program console_aggpas_2;
{$mode objfpc}{$H+}
uses
ptcgraph,
ptccrt,
agg_2D,
agg_basics;
const
IMAGE_WIDTH = 800;
IMAGE_HEIGHT = 600;
RGBA_WIDTH =2; //16bit 656 format
LINE_COUNT = 30;
{$IFDEF Unix}
FontFile = '../../arial.ttf';
{$ENDIF}
{$IFDEF Windows}
FontFile = 'Arial';
{$ENDIF}
type
TGraphBitmapBuffer=packed record
width,
height: longint;
data: array[0..2*600*800-1] of Byte;
end;
var
gd,gm : smallint;
graph_buffer: TGraphBitmapBuffer;
procedure DrawStuff(agg: Agg2D_ptr);
var
i: Integer;
x, y, px, py, d: Double;
c1, c2: Color;
begin
// draw a full screen graph with grid
agg^.clearAll(0, 0, 0);
agg^.lineColor(0, 0, 0, 255);
agg^.lineWidth(3);
agg^.rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
agg^.lineWidth(1);
agg^.lineColor(0, 155, 0, 255);
agg^.rectangle(10, 10, 50, 50);
// agg^.font(fontfile, 16);
d := IMAGE_WIDTH / LINE_COUNT;
agg^.lineColor(0, 0, 0, 100);
agg^.lineWidth(1);
for i := 1 to LINE_COUNT - 1 do
begin
x := i * d;
agg^.line(x, 0, x, IMAGE_HEIGHT);
end;
for i := 1 to trunc(IMAGE_HEIGHT / d) do
begin
y := i * d;
agg^.line(0, y, IMAGE_WIDTH, y);
end;
x := 0;
y := IMAGE_HEIGHT / 2;
px := x;
py := y;
agg^.lineColor(255, 0, 0, 200);
agg^.fillColor(0, 0, 0, 200);
agg^.lineWidth(1);
for i := 0 to LINE_COUNT - 1 do
begin
x := x + d;
y := y + Random(Round(IMAGE_HEIGHT / 3)) - IMAGE_HEIGHT / 6;
if y < 0 then
y := IMAGE_HEIGHT / 6;
if y >= IMAGE_HEIGHT then
y := IMAGE_HEIGHT - IMAGE_HEIGHT / 6;
agg^.line(px, py, x, y);
// agg^.text(x, y, char_ptr(IntToStr(i) + ' point'));
px := x;
py := y;
end;
// Star shape
agg^.LineCap(CapRound);
agg^.LineWidth(5);
agg^.LineColor($32 ,$cd ,$32 );
c1.Construct(0, 0 , 255, 200);
c2.Construct(0, 0, 255, 50);
agg^.FillLinearGradient(100, 100, 150, 150, c1, c2);
agg^.Star(100 ,150 ,30 ,70 ,55 ,5 );
// Draw Arc from 45 degrees to 270 degrees
agg^.LineColor($4C, $6C, $9C);
agg^.LineWidth(5 );
agg^.Arc(300 ,320 ,80 ,50 ,Deg2Rad(45 ) ,Deg2Rad(270 ) );
end;
procedure HandlePlug;
var
agg: Agg2D_ptr;
begin
graph_buffer.width:=IMAGE_WIDTH;
graph_buffer.height:=IMAGE_HEIGHT;
New(agg, Construct);
agg^.attach(@graph_buffer.data, IMAGE_WIDTH, IMAGE_HEIGHT, -(IMAGE_WIDTH * RGBA_WIDTH));
DrawStuff(agg);
Dispose(agg, Destruct); // not necessary to keep it after rendering is finished
//display on ptc surface
ptcgraph.putimage(0,0,graph_buffer,NormalPut);
ptcgraph.Rectangle(10,10,100,100);
ptcgraph.PieSlice(100,100,0,25,30);
ptcgraph.OutTextXY(80,80,'It works!');
end;
begin
gd:=d16Bit;
gm:=m800x600;
//Windowtitle:='ptcgraph';
ptcgraph.Initgraph(gd,gm,'');
Randomize;
HandlePlug;
readkey;
end.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Screenshot from 2017-06-02 20-49-50.png
Type: image/png
Size: 36301 bytes
Desc: not available
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20170602/12951327/attachment.png>
More information about the fpc-pascal
mailing list