BaiduFMX
244 строки · 12.1 Кб
1unit FMX.Graphics.INativeCanvas;
2
3interface
4
5uses
6System.Types,
7System.UITypes,
8System.Math.Vectors,
9FMX.Types,
10FMX.Graphics;
11
12type
13TDrawProc = reference to procedure;
14
15TDrawMethod = (Native, Firemonkey);
16
17INativeCanvas = interface
18function GetCanvas: TCanvas;
19
20procedure NativeDraw(const ARect: TRectF; const ADrawProc: TDrawProc);
21procedure BeginNativeDraw(const ARect: TRectF);
22procedure EndNativeDraw;
23
24procedure SetMatrix(const M: TMatrix);
25
26{ aligning }
27function AlignToPixel(const Value: TPointF): TPointF; overload;
28function AlignToPixel(const Rect: TRectF): TRectF; overload;
29function AlignToPixelVertically(const Value: Single): Single;
30function AlignToPixelHorizontally(const Value: Single): Single;
31
32// 涂色 + 线色一次完成
33procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round; const Inside: Boolean = False); overload;
34procedure DrawPath(const APath: TPathData; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload;
35procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload;
36procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload;
37procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload;
38
39// 下列为 Canvas 原有函数
40procedure DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean = False);
41procedure FillText(const ARect: TRectF; const AText: string; const WordWrap: Boolean; const AOpacity: Single; const Flags: TFillTextFlags; const ATextAlign: TTextAlign; const AVTextAlign: TTextAlign = TTextAlign.Center);
42
43procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single); overload;
44procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
45
46procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload;
47procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TBrush; const ACornerType: TCornerType = TCornerType.Round); overload;
48procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload;
49procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round); overload;
50
51procedure FillPath(const APath: TPathData; const AOpacity: Single); overload;
52procedure FillPath(const APath: TPathData; const AOpacity: Single; const ABrush: TBrush); overload;
53procedure DrawPath(const APath: TPathData; const AOpacity: Single); overload;
54procedure DrawPath(const APath: TPathData; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
55
56procedure FillEllipse(const ARect: TRectF; const AOpacity: Single); overload;
57procedure FillEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TBrush); overload;
58procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single); overload;
59procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
60
61procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload;
62procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TBrush); overload;
63procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload;
64procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
65
66procedure FillPolygon(const Points: TPolygon; const AOpacity: Single); overload;
67procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single); overload;
68
69procedure IntersectClipRect(const ARect: TRectF); overload;
70procedure ExcludeClipRect(const ARect: TRectF); overload;
71
72function GetScale: Single;
73function GetMatrix: TMatrix;
74function GetStroke: TStrokeBrush;
75function GetFill: TBrush;
76function GetFont: TFont;
77procedure SetFill(const Value: TBrush);
78property Scale: Single read GetScale;
79property Matrix: TMatrix read GetMatrix;
80property Stroke: TStrokeBrush read GetStroke;
81property Fill: TBrush read GetFill write SetFill;
82property Font: TFont read GetFont;
83end;
84
85TAbstractCanvas = class(TInterfacedObject, INativeCanvas)
86protected
87FCanvas: TCanvas;
88public
89constructor Create(ACanvas: TCanvas); virtual;
90function GetCanvas: TCanvas;
91procedure NativeDraw(const ARect: TRectF; const ADrawProc: TDrawProc); virtual; abstract;
92procedure BeginNativeDraw(const ARect: TRectF); virtual;
93procedure EndNativeDraw; virtual;
94
95procedure SetMatrix(const M: TMatrix); virtual; abstract;
96
97procedure DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean = False); virtual; abstract;
98procedure FillText(const ARect: TRectF; const AText: string; const WordWrap: Boolean; const AOpacity: Single; const Flags: TFillTextFlags; const ATextAlign: TTextAlign; const AVTextAlign: TTextAlign = TTextAlign.Center); virtual; abstract;
99
100// 涂色 + 线色一次完成
101procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round; const Inside: Boolean = False); overload; virtual; abstract;
102procedure DrawPath(const APath: TPathData; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload; virtual; abstract;
103procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload; virtual; abstract;
104procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload; virtual; abstract;
105procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload; virtual; abstract;
106
107// 下列为 Canvas 原有函数
108{ aligning }
109function AlignToPixel(const Value: TPointF): TPointF; overload; inline;
110function AlignToPixel(const Rect: TRectF): TRectF; overload; inline;
111function AlignToPixelVertically(const Value: Single): Single; inline;
112function AlignToPixelHorizontally(const Value: Single): Single; inline;
113
114procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single); overload; virtual; abstract;
115procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
116
117procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
118procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TBrush; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
119procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
120procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
121
122procedure FillPath(const APath: TPathData; const AOpacity: Single); overload; virtual; abstract;
123procedure FillPath(const APath: TPathData; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
124procedure DrawPath(const APath: TPathData; const AOpacity: Single); overload; virtual; abstract;
125procedure DrawPath(const APath: TPathData; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
126
127procedure FillEllipse(const ARect: TRectF; const AOpacity: Single); overload; virtual; abstract;
128procedure FillEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
129procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single); overload; virtual; abstract;
130procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
131
132procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload; virtual; abstract;
133procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
134procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload; virtual; abstract;
135procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
136
137procedure FillPolygon(const Points: TPolygon; const AOpacity: Single); virtual; abstract;
138procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single); overload; virtual; abstract;
139
140procedure IntersectClipRect(const ARect: TRectF); virtual; abstract;
141procedure ExcludeClipRect(const ARect: TRectF); virtual; abstract;
142
143function GetScale: Single; inline;
144function GetMatrix: TMatrix; inline;
145function GetStroke: TStrokeBrush; inline;
146function GetFill: TBrush; inline;
147procedure SetFill(const Value: TBrush); inline;
148function GetFont: TFont; inline;
149function GetWidth: Integer; inline;
150function GetHeight: Integer; inline;
151property Scale: Single read GetScale;
152property Matrix: TMatrix read GetMatrix;
153property Stroke: TStrokeBrush read GetStroke;
154property Fill: TBrush read GetFill write SetFill;
155property Font: TFont read GetFont;
156property Width: Integer read GetWidth;
157property Height: Integer read GetHeight;
158end;
159
160implementation
161
162{ TAbstractCanvas }
163
164function TAbstractCanvas.AlignToPixel(const Value: TPointF): TPointF;
165begin
166Result := FCanvas.AlignToPixel(Value);
167end;
168
169function TAbstractCanvas.AlignToPixel(const Rect: TRectF): TRectF;
170begin
171
172end;
173
174function TAbstractCanvas.AlignToPixelHorizontally(const Value: Single): Single;
175begin
176
177end;
178
179function TAbstractCanvas.AlignToPixelVertically(const Value: Single): Single;
180begin
181
182end;
183
184procedure TAbstractCanvas.BeginNativeDraw(const ARect: TRectF);
185begin
186
187end;
188
189constructor TAbstractCanvas.Create(ACanvas: TCanvas);
190begin
191FCanvas := ACanvas;
192end;
193
194procedure TAbstractCanvas.EndNativeDraw;
195begin
196
197end;
198
199function TAbstractCanvas.GetCanvas: TCanvas;
200begin
201Result := FCanvas;
202end;
203
204function TAbstractCanvas.GetFill: TBrush;
205begin
206Result := FCanvas.Fill;
207end;
208
209function TAbstractCanvas.GetFont: TFont;
210begin
211Result := FCanvas.Font;
212end;
213
214function TAbstractCanvas.GetHeight: Integer;
215begin
216Result := FCanvas.Height;
217end;
218
219function TAbstractCanvas.GetMatrix: TMatrix;
220begin
221Result := FCanvas.Matrix;
222end;
223
224function TAbstractCanvas.GetScale: Single;
225begin
226Result := FCanvas.Scale;
227end;
228
229function TAbstractCanvas.GetStroke: TStrokeBrush;
230begin
231Result := FCanvas.Stroke;
232end;
233
234function TAbstractCanvas.GetWidth: Integer;
235begin
236Result := FCanvas.Width;
237end;
238
239procedure TAbstractCanvas.SetFill(const Value: TBrush);
240begin
241FCanvas.Fill := Value;
242end;
243
244end.
245