File: taguiconnectoraggpas.pas

package info (click to toggle)
lazarus 4.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 275,760 kB
  • sloc: pascal: 2,341,904; xml: 509,420; makefile: 348,726; cpp: 93,608; sh: 3,387; java: 609; perl: 297; sql: 222; ansic: 137
file content (156 lines) | stat: -rw-r--r-- 4,124 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
{

 *****************************************************************************
  See the file COPYING.modifiedLGPL.txt, included in this distribution,
  for details about the license.
 *****************************************************************************

  Authors: Alexander Klenin

}
unit TAGUIConnectorAggPas;

{$H+}

interface

uses
  Agg_FPImage,
  Classes,
  TAGUIConnector;

type
  TChartGUIConnectorAggPas = class(TChartGUIConnector)
  private
    FFontDir: String;
    FPixelFormat: TAggFPImgPixelFormat;
    procedure SetPixelFormat(AValue: TAggFPImgPixelFormat);
  public
    constructor Create(AOwner: TComponent); override;
    procedure CreateDrawer(var AData: TChartGUIConnectorData); override;
    procedure SetBounds(var AData: TChartGUIConnectorData); override;
    procedure Display(var AData: TChartGUIConnectorData); override;
  published
    property FontDir: String
      read FFontDir write FFontDir;
    property PixelFormat: TAggFPImgPixelFormat
      read FPixelFormat write SetPixelFormat default afpimRGBA32;
  end;

procedure Register;

implementation

{$R taaggpas.res}

uses
  Agg_LCL, Graphics, GraphType, SysUtils, fpImage, IntfGraphics,
  TAChartUtils, TADrawerAggPas, TADrawerCanvas, TAGeometry;

type
  TAggPasOwnerDrawer = class(TAggPasDrawer)
  strict protected
    FBitmap: TBitmap;
  public
    constructor Create(ACanvas: TAggLCLCanvas);
    destructor Destroy; override;
    procedure SetSize(ASize: TPoint);
    procedure PaintOnCanvas(ACanvas: TCanvas; const ARect: TRect);
    property Canvas: TAggLCLCanvas read FCanvas;
  end;

procedure Register;
begin
  RegisterComponents(CHART_COMPONENT_IDE_PAGE, [TChartGUIConnectorAggPas]);
end;

{ TChartGUIConnectorAggPas }

constructor TChartGUIConnectorAggPas.Create(AOwner: TComponent); 
begin
  inherited;
  FPixelFormat := afpimRGBA32;
end;

procedure TChartGUIConnectorAggPas.CreateDrawer(
  var AData: TChartGUIConnectorData);
begin
  AData.FDrawer := TAggPasOwnerDrawer.Create(TAggLCLCanvas.Create);
  AData.FDrawer.DoGetFontOrientation := @CanvasGetFontOrientationFunc;
  (AData.FDrawer as TAggPasOwnerDrawer).FontDir := FFontDir;
end;

procedure TChartGUIConnectorAggPas.Display(var AData: TChartGUIConnectorData);
begin
  (AData.FDrawer as TAggPasOwnerDrawer).PaintOnCanvas(AData.FCanvas, AData.FBounds);
end;

procedure TChartGUIConnectorAggPas.SetBounds(var AData: TChartGUIConnectorData);
begin
  AData.FDrawerBounds.TopLeft := Point(0, 0);
  AData.FDrawerBounds.BottomRight :=
    AData.FBounds.BottomRight - AData.FBounds.TopLeft;
  with AData.FDrawer as TAggPasOwnerDrawer do begin
    SetSize(AData.FDrawerBounds.BottomRight);
    Canvas.Image.PixelFormat := PixelFormat;
  end;
end;

procedure TChartGUIConnectorAggPas.SetPixelFormat(AValue: TAggFPImgPixelFormat);
begin
  if FPixelFormat = AValue then exit;
  FPixelFormat := AValue;
  Broadcaster.Broadcast(Self);
end;

{ TAggPasOwnerDrawer }

constructor TAggPasOwnerDrawer.Create(ACanvas: TAggLCLCanvas);
begin
  inherited Create(ACanvas);
  FBitmap := TBitmap.Create;
end;

destructor TAggPasOwnerDrawer.Destroy;
begin
  inherited;
  FreeAndNil(FBitmap);
  FreeAndNil(FCanvas);
end;

procedure TAggPasOwnerDrawer.PaintOnCanvas(
  ACanvas: TCanvas; const ARect: TRect);
{$IF DEFINED(LCLWin32) or DEFINED(LCLCocoa)}
begin
  FBitmap.LoadFromIntfImage(FCanvas.Image.IntfImg);
  ACanvas.Draw(ARect.Left, ARect.Top, FBitmap);
end;
{$ELSE}
{ The default pixel settings of AggPas are correct for Windows. 
  On Linux, however, the red and blue components are interchanged. 
  The following work-around creates an auxiliary image in which R and B are 
  swapped to be compatible with AggPas. }
var
  img: TLazIntfImage;
  raw: TRawImage;
begin
  FCanvas.Image.IntfImg.GetRawImage(raw, false);
  img := TLazIntfImage.Create(raw, false);
  try
    SwapRedBlue(img);
    FBitmap.LoadFromIntfImage(img);
  finally
    img.Free;
  end;
  ACanvas.Draw(ARect.Left, ARect.Top, FBitmap);
end;
{$ENDIF}

procedure TAggPasOwnerDrawer.SetSize(ASize: TPoint);
begin
  FBitmap.SetSize(ASize.X, ASize.Y);
  FCanvas.Width := ASize.X;
  FCanvas.Height := ASize.Y;
end;

end.