[Lazarus] TAChart with transparent background

2014-09-16 Thread Werner Pamler
I see. If you can keep the chart size unchanged then it is certainly a 
good idea to stretch the image to the requested size immediately after 
loading and use a simple Draw of the obtained image while charting. If 
you know the range of your data in advance it may also help to freeze 
the chart extent to avoid unnecessary repaints when data arrive. And you 
could also enclose the AddXY calls by calls to Begin/EndUpdate of the 
ChartSource. Avoiding unnecessary repainting can have a dramatic effect 
on speed.


--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


Re: [Lazarus] TAChart with transparent background

2014-09-15 Thread Roberto P.
Though really late, I can confirm that the solution is working fine.
I still have to add some profiling code to measure it, though with added
background it seems perceivably slower even on a recent PC (core i5 vpro).
Are BGRA or other backends known to be faster?

thanks anyway for the help!

R#

2014-09-04 1:08 GMT+02:00 Roberto P. padovan...@gmail.com:

 Thank  you very much.
 I need a background image, therefore as soon as I am back at the office
 I'll try your code.
 Thank you again!

 R#


 2014-09-02 18:18 GMT+02:00 Werner Pamler werner.pam...@freenet.de:

 It is not fully clear to me what you mean by a chart with transparent
 background. Do you want to see the form underneath the chart? I fear this
 is not easily possible. Or do you want to have a background image in the
 chart? For the latter case this code is working fine with me:

 type
   TForm1 = class(TForm)
 Chart1: TChart;
 procedure Chart1BeforeDrawBackground(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 procedure Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 procedure FormCreate(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
   private
 { private declarations }
 FBackImage: TPicture;
   public
 { public declarations }
   end;
 
 procedure TForm1.Chart1BeforeDrawBackWall(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 begin
   ADoDefaultDrawing := false;
   ACanvas.StretchDraw(ARect, FBackImage.Graphic);
 end;

 procedure TForm1.Chart1BeforeDrawBackground(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 begin
   ACanvas.GradientFill(ARect, clSkyBlue, clWhite, gdVertical);
   ADoDefaultDrawing := false;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 begin
   FBackImage := TPicture.Create;
   FBackImage.LoadFromFile('C:\lazarus-svn\images\splash_logo.png');
   // please adapt this path to your lazarus installation
 end;

 procedure TForm1.FormDestroy(Sender: TObject);
 begin
   FBackImage.Free;
 end;

 The basic idea is to assign a handler to the chart events
 OnBeforeDrawBackWall or OnBeforeDrawBackground and disable the default
 background painting by setting ADoDefaultDrawing to false. The first event
 replaces painting of the area enclosed by the chart's frame (Back wall),
 the other one replaces painting of the entire chart background. Above
 example paints the Lazarus splash-logo as BackWall and a gradient as
 background.

 Maybe I'll once write a tutorial on this topic...


 --
 ___
 Lazarus mailing list
 Lazarus@lists.lazarus.freepascal.org
 http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus



--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


[Lazarus] TAChart with transparent background

2014-09-15 Thread Werner Pamler
I added some simple time measuring code (using GetTickCount) to the 
background image tutorial to see the speed loss that you mention: 
Without the backgrounds (Lazarus logo and gradient) the GetTickCount 
reports 0 ms between the OnBeforeDrawBackground and OnAfterPaint events, 
while with the backgrounds it reports 16 ms, sometimes 0 ms. Replacing 
the StretchDraw by a simple Draw in the painting of the logo,  brings 
down the time also to 0. Therefore I'd guess that the background 
painting is not perceivable unless you squeeze a 20 mega-pixel photo 
into the chart area or load the image during the painting event.


What exactly are you doing?


--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


Re: [Lazarus] TAChart with transparent background

2014-09-15 Thread Roberto P.
The image is a 30KB png, not much.
It is smaller than the area, so it gets actually stretched.
Can I use Draw instead of StretchDraw if I make the image exactly the size
I need?
I can force the form size.

I think that tens of milliseconds can be actually relevant, because I am
plotting data received (and processed) every 50ms from a serial port.

R#

2014-09-16 0:07 GMT+02:00 Werner Pamler werner.pam...@freenet.de:

 I added some simple time measuring code (using GetTickCount) to the
 background image tutorial to see the speed loss that you mention: Without
 the backgrounds (Lazarus logo and gradient) the GetTickCount reports 0 ms
 between the OnBeforeDrawBackground and OnAfterPaint events, while with the
 backgrounds it reports 16 ms, sometimes 0 ms. Replacing the StretchDraw by
 a simple Draw in the painting of the logo,  brings down the time also to 0.
 Therefore I'd guess that the background painting is not perceivable unless
 you squeeze a 20 mega-pixel photo into the chart area or load the image
 during the painting event.

 What exactly are you doing?


 --
 ___
 Lazarus mailing list
 Lazarus@lists.lazarus.freepascal.org
 http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


Re: [Lazarus] TAChart with transparent background

2014-09-03 Thread Roberto P.
Thank  you very much.
I need a background image, therefore as soon as I am back at the office
I'll try your code.
Thank you again!

R#


2014-09-02 18:18 GMT+02:00 Werner Pamler werner.pam...@freenet.de:

 It is not fully clear to me what you mean by a chart with transparent
 background. Do you want to see the form underneath the chart? I fear this
 is not easily possible. Or do you want to have a background image in the
 chart? For the latter case this code is working fine with me:

 type
   TForm1 = class(TForm)
 Chart1: TChart;
 procedure Chart1BeforeDrawBackground(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 procedure Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 procedure FormCreate(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
   private
 { private declarations }
 FBackImage: TPicture;
   public
 { public declarations }
   end;
 
 procedure TForm1.Chart1BeforeDrawBackWall(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 begin
   ADoDefaultDrawing := false;
   ACanvas.StretchDraw(ARect, FBackImage.Graphic);
 end;

 procedure TForm1.Chart1BeforeDrawBackground(ASender: TChart; ACanvas:
 TCanvas;
   const ARect: TRect; var ADoDefaultDrawing: Boolean);
 begin
   ACanvas.GradientFill(ARect, clSkyBlue, clWhite, gdVertical);
   ADoDefaultDrawing := false;
 end;

 procedure TForm1.FormCreate(Sender: TObject);
 begin
   FBackImage := TPicture.Create;
   FBackImage.LoadFromFile('C:\lazarus-svn\images\splash_logo.png');
   // please adapt this path to your lazarus installation
 end;

 procedure TForm1.FormDestroy(Sender: TObject);
 begin
   FBackImage.Free;
 end;

 The basic idea is to assign a handler to the chart events
 OnBeforeDrawBackWall or OnBeforeDrawBackground and disable the default
 background painting by setting ADoDefaultDrawing to false. The first event
 replaces painting of the area enclosed by the chart's frame (Back wall),
 the other one replaces painting of the entire chart background. Above
 example paints the Lazarus splash-logo as BackWall and a gradient as
 background.

 Maybe I'll once write a tutorial on this topic...


 --
 ___
 Lazarus mailing list
 Lazarus@lists.lazarus.freepascal.org
 http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


[Lazarus] TAChart with transparent background

2014-09-02 Thread Roberto P.
Dear List,

is it possible to have a chart with transparent background, so that a
picture behind the plot is visible?

From the wiki I understand that TAChart does not support BackImage property
as in Delphi, which would fit the purpouse.
However I read thay using BGRAbitmap as a back-end it is possible to use
transparency. I managed to install the required packages and activate the
back-end, but I did not understand from the tutorial (
http://wiki.freepascal.org/BGRABitmap_tutorial_TAChart) how to go on.

Does anyone has an example?

Thanks a lot,

  R#
--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


[Lazarus] TAChart with transparent background

2014-09-02 Thread Werner Pamler
It is not fully clear to me what you mean by a chart with transparent 
background. Do you want to see the form underneath the chart? I fear 
this is not easily possible. Or do you want to have a background image 
in the chart? For the latter case this code is working fine with me:


type
  TForm1 = class(TForm)
Chart1: TChart;
procedure Chart1BeforeDrawBackground(ASender: TChart; ACanvas: TCanvas;
  const ARect: TRect; var ADoDefaultDrawing: Boolean);
procedure Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
  const ARect: TRect; var ADoDefaultDrawing: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
  private
{ private declarations }
FBackImage: TPicture;
  public
{ public declarations }
  end;

procedure TForm1.Chart1BeforeDrawBackWall(ASender: TChart; ACanvas: TCanvas;
  const ARect: TRect; var ADoDefaultDrawing: Boolean);
begin
  ADoDefaultDrawing := false;
  ACanvas.StretchDraw(ARect, FBackImage.Graphic);
end;

procedure TForm1.Chart1BeforeDrawBackground(ASender: TChart; ACanvas: 
TCanvas;

  const ARect: TRect; var ADoDefaultDrawing: Boolean);
begin
  ACanvas.GradientFill(ARect, clSkyBlue, clWhite, gdVertical);
  ADoDefaultDrawing := false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FBackImage := TPicture.Create;
  FBackImage.LoadFromFile('C:\lazarus-svn\images\splash_logo.png');
  // please adapt this path to your lazarus installation
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FBackImage.Free;
end;

The basic idea is to assign a handler to the chart events 
OnBeforeDrawBackWall or OnBeforeDrawBackground and disable the default 
background painting by setting ADoDefaultDrawing to false. The first 
event replaces painting of the area enclosed by the chart's frame (Back 
wall), the other one replaces painting of the entire chart background. 
Above example paints the Lazarus splash-logo as BackWall and a gradient 
as background.


Maybe I'll once write a tutorial on this topic...


--
___
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus