BaiduFMX

Форк
0
/
FMX.Graphics.INativeCanvas.pas 
244 строки · 12.1 Кб
1
unit FMX.Graphics.INativeCanvas;
2

3
interface
4

5
uses
6
  System.Types,
7
  System.UITypes,
8
  System.Math.Vectors,
9
  FMX.Types,
10
  FMX.Graphics;
11

12
type
13
  TDrawProc = reference to procedure;
14

15
  TDrawMethod = (Native, Firemonkey);
16

17
  INativeCanvas = interface
18
    function GetCanvas: TCanvas;
19

20
    procedure NativeDraw(const ARect: TRectF; const ADrawProc: TDrawProc);
21
    procedure BeginNativeDraw(const ARect: TRectF);
22
    procedure EndNativeDraw;
23

24
    procedure SetMatrix(const M: TMatrix);
25

26
    { aligning }
27
    function AlignToPixel(const Value: TPointF): TPointF; overload;
28
    function AlignToPixel(const Rect: TRectF): TRectF; overload;
29
    function AlignToPixelVertically(const Value: Single): Single;
30
    function AlignToPixelHorizontally(const Value: Single): Single;
31

32
    // 涂色 + 线色一次完成
33
    procedure 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;
34
    procedure DrawPath(const APath: TPathData; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload;
35
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload;
36
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload;
37
    procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload;
38

39
    // 下列为 Canvas 原有函数
40
    procedure DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean = False);
41
    procedure 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

43
    procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single); overload;
44
    procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
45

46
    procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload;
47
    procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TBrush; const ACornerType: TCornerType = TCornerType.Round); overload;
48
    procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload;
49
    procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ABrush: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round); overload;
50

51
    procedure FillPath(const APath: TPathData; const AOpacity: Single); overload;
52
    procedure FillPath(const APath: TPathData; const AOpacity: Single; const ABrush: TBrush); overload;
53
    procedure DrawPath(const APath: TPathData; const AOpacity: Single); overload;
54
    procedure DrawPath(const APath: TPathData; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
55

56
    procedure FillEllipse(const ARect: TRectF; const AOpacity: Single); overload;
57
    procedure FillEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TBrush); overload;
58
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single); overload;
59
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
60

61
    procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload;
62
    procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TBrush); overload;
63
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload;
64
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TStrokeBrush); overload;
65

66
    procedure FillPolygon(const Points: TPolygon; const AOpacity: Single); overload;
67
    procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single); overload;
68

69
    procedure IntersectClipRect(const ARect: TRectF); overload;
70
    procedure ExcludeClipRect(const ARect: TRectF); overload;
71

72
    function GetScale: Single;
73
    function GetMatrix: TMatrix;
74
    function GetStroke: TStrokeBrush;
75
    function GetFill: TBrush;
76
    function GetFont: TFont;
77
    procedure SetFill(const Value: TBrush);
78
    property Scale: Single read GetScale;
79
    property Matrix: TMatrix read GetMatrix;
80
    property Stroke: TStrokeBrush read GetStroke;
81
    property Fill: TBrush read GetFill write SetFill;
82
    property Font: TFont read GetFont;
83
  end;
84

85
  TAbstractCanvas = class(TInterfacedObject, INativeCanvas)
86
  protected
87
    FCanvas: TCanvas;
88
  public
89
    constructor Create(ACanvas: TCanvas); virtual;
90
    function GetCanvas: TCanvas;
91
    procedure NativeDraw(const ARect: TRectF; const ADrawProc: TDrawProc); virtual; abstract;
92
    procedure BeginNativeDraw(const ARect: TRectF); virtual;
93
    procedure EndNativeDraw; virtual;
94

95
    procedure SetMatrix(const M: TMatrix); virtual; abstract;
96

97
    procedure DrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean = False); virtual; abstract;
98
    procedure 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
    // 涂色 + 线色一次完成
101
    procedure 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;
102
    procedure DrawPath(const APath: TPathData; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload; virtual; abstract;
103
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload; virtual; abstract;
104
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush; const Inside: Boolean = False); overload; virtual; abstract;
105
    procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single; const AFill: TBrush; const AStroke: TStrokeBrush); overload; virtual; abstract;
106

107
    // 下列为 Canvas 原有函数
108
    { aligning }
109
    function AlignToPixel(const Value: TPointF): TPointF; overload; inline;
110
    function AlignToPixel(const Rect: TRectF): TRectF; overload; inline;
111
    function AlignToPixelVertically(const Value: Single): Single; inline;
112
    function AlignToPixelHorizontally(const Value: Single): Single; inline;
113

114
    procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single); overload; virtual; abstract;
115
    procedure DrawLine(const APt1, APt2: TPointF; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
116

117
    procedure FillRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
118
    procedure 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;
119
    procedure DrawRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners; const AOpacity: Single; const ACornerType: TCornerType = TCornerType.Round); overload; virtual; abstract;
120
    procedure 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

122
    procedure FillPath(const APath: TPathData; const AOpacity: Single); overload; virtual; abstract;
123
    procedure FillPath(const APath: TPathData; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
124
    procedure DrawPath(const APath: TPathData; const AOpacity: Single); overload; virtual; abstract;
125
    procedure DrawPath(const APath: TPathData; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
126

127
    procedure FillEllipse(const ARect: TRectF; const AOpacity: Single); overload; virtual; abstract;
128
    procedure FillEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
129
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single); overload; virtual; abstract;
130
    procedure DrawEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
131

132
    procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload; virtual; abstract;
133
    procedure FillArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TBrush); overload; virtual; abstract;
134
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single); overload; virtual; abstract;
135
    procedure DrawArc(const Center, Radius: TPointF; StartAngle, SweepAngle: Single; const AOpacity: Single; const ABrush: TStrokeBrush); overload; virtual; abstract;
136

137
    procedure FillPolygon(const Points: TPolygon; const AOpacity: Single); virtual; abstract;
138
    procedure DrawPolygon(const Points: TPolygon; const AOpacity: Single); overload; virtual; abstract;
139

140
    procedure IntersectClipRect(const ARect: TRectF); virtual; abstract;
141
    procedure ExcludeClipRect(const ARect: TRectF); virtual; abstract;
142

143
    function GetScale: Single; inline;
144
    function GetMatrix: TMatrix; inline;
145
    function GetStroke: TStrokeBrush; inline;
146
    function GetFill: TBrush; inline;
147
    procedure SetFill(const Value: TBrush); inline;
148
    function GetFont: TFont; inline;
149
    function GetWidth: Integer; inline;
150
    function GetHeight: Integer; inline;
151
    property Scale: Single read GetScale;
152
    property Matrix: TMatrix read GetMatrix;
153
    property Stroke: TStrokeBrush read GetStroke;
154
    property Fill: TBrush read GetFill write SetFill;
155
    property Font: TFont read GetFont;
156
    property Width: Integer read GetWidth;
157
    property Height: Integer read GetHeight;
158
  end;
159

160
implementation
161

162
{ TAbstractCanvas }
163

164
function TAbstractCanvas.AlignToPixel(const Value: TPointF): TPointF;
165
begin
166
  Result := FCanvas.AlignToPixel(Value);
167
end;
168

169
function TAbstractCanvas.AlignToPixel(const Rect: TRectF): TRectF;
170
begin
171

172
end;
173

174
function TAbstractCanvas.AlignToPixelHorizontally(const Value: Single): Single;
175
begin
176

177
end;
178

179
function TAbstractCanvas.AlignToPixelVertically(const Value: Single): Single;
180
begin
181

182
end;
183

184
procedure TAbstractCanvas.BeginNativeDraw(const ARect: TRectF);
185
begin
186

187
end;
188

189
constructor TAbstractCanvas.Create(ACanvas: TCanvas);
190
begin
191
  FCanvas := ACanvas;
192
end;
193

194
procedure TAbstractCanvas.EndNativeDraw;
195
begin
196

197
end;
198

199
function TAbstractCanvas.GetCanvas: TCanvas;
200
begin
201
  Result := FCanvas;
202
end;
203

204
function TAbstractCanvas.GetFill: TBrush;
205
begin
206
  Result := FCanvas.Fill;
207
end;
208

209
function TAbstractCanvas.GetFont: TFont;
210
begin
211
  Result := FCanvas.Font;
212
end;
213

214
function TAbstractCanvas.GetHeight: Integer;
215
begin
216
  Result := FCanvas.Height;
217
end;
218

219
function TAbstractCanvas.GetMatrix: TMatrix;
220
begin
221
  Result := FCanvas.Matrix;
222
end;
223

224
function TAbstractCanvas.GetScale: Single;
225
begin
226
  Result := FCanvas.Scale;
227
end;
228

229
function TAbstractCanvas.GetStroke: TStrokeBrush;
230
begin
231
  Result := FCanvas.Stroke;
232
end;
233

234
function TAbstractCanvas.GetWidth: Integer;
235
begin
236
  Result := FCanvas.Width;
237
end;
238

239
procedure TAbstractCanvas.SetFill(const Value: TBrush);
240
begin
241
  FCanvas.Fill := Value;
242
end;
243

244
end.
245

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.