Skip to content

Commit 24c48a3

Browse files
[FMX Render] Add DoDrawRoundRect to improve performance
Co-Authored-By: Paulo César Botelho Barbosa <16469061+paulocesarbot@users.noreply.github.com>
1 parent 896d53d commit 24c48a3

File tree

1 file changed

+48
-11
lines changed

1 file changed

+48
-11
lines changed

Source/FMX/FMX.Skia.Canvas.pas

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ TBrushData = record
8888
strict private
8989
FCanvas: ISkCanvas;
9090
FContextHandle: THandle;
91-
FRoundRect: ISkRoundRect;
92-
FRoundRectRadii: TSkRoundRectRadii;
9391
procedure BeginPaint(const ARect: TRectF; const AOpacity: Single; var ABrushData: TBrushData);
9492
strict protected
9593
FAntiAlias: Boolean;
@@ -113,6 +111,8 @@ TBrushData = record
113111
procedure DoDrawLine(const APoint1, APoint2: TPointF; const AOpacity: Single; const ABrush: TStrokeBrush); override;
114112
procedure DoDrawPath(const APath: TPathData; const AOpacity: Single; const ABrush: TStrokeBrush); override;
115113
procedure DoDrawRect(const ARect: TRectF; const AOpacity: Single; const ABrush: TStrokeBrush); override;
114+
procedure DoDrawRoundRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners;
115+
const AOpacity: Single; const ABrush: TStrokeBrush; const ACornerType: TCornerType = TCornerType.Round); override;
116116
procedure DoEndScene; override; final;
117117
procedure DoFillEllipse(const ARect: TRectF; const AOpacity: Single; const ABrush: TBrush); override;
118118
procedure DoFillPath(const APath: TPathData; const AOpacity: Single; const ABrush: TBrush); override;
@@ -1650,7 +1650,6 @@ procedure TSkCanvasCustom.AfterConstruction;
16501650
// Skia m107 shows better performance with anti-aliasing enabled. Therefore,
16511651
// we'll enforce it to always be true, regardless of the Quality property.
16521652
FAntiAlias := True;
1653-
FRoundRect := TSkRoundRect.Create;
16541653
SkInitialize;
16551654
inherited;
16561655
end;
@@ -1870,7 +1869,6 @@ function TSkCanvasCustom.CreateSaveState: TCanvasSaveState;
18701869

18711870
destructor TSkCanvasCustom.Destroy;
18721871
begin
1873-
FRoundRect := nil;
18741872
FWrapper := nil;
18751873
SkFinalize;
18761874
inherited;
@@ -2021,6 +2019,43 @@ procedure TSkCanvasCustom.DoDrawRect(const ARect: TRectF;
20212019
end;
20222020
end;
20232021

2022+
procedure TSkCanvasCustom.DoDrawRoundRect(const ARect: TRectF; const XRadius, YRadius: Single; const ACorners: TCorners;
2023+
const AOpacity: Single; const ABrush: TStrokeBrush; const ACornerType: TCornerType);
2024+
var
2025+
LBrushData: TBrushData;
2026+
LPaint: TSkPaint;
2027+
LRoundRect: ISkRoundRect;
2028+
LRoundRectRadii: TSkRoundRectRadii;
2029+
begin
2030+
if ACornerType <> TCornerType.Round then
2031+
inherited
2032+
else
2033+
begin
2034+
LPaint := BeginPaintWithStrokeBrush(ABrush, ARect, AOpacity, LBrushData);
2035+
if LPaint <> nil then
2036+
try
2037+
if ACorners = AllCorners then
2038+
Canvas.DrawRoundRect(ARect, XRadius, YRadius, LPaint)
2039+
else
2040+
begin
2041+
FillChar(LRoundRectRadii, SizeOf(LRoundRectRadii), 0);
2042+
if TCorner.TopLeft in ACorners then
2043+
LRoundRectRadii[TSkRoundRectCorner.UpperLeft] := PointF(XRadius, YRadius);
2044+
if TCorner.TopRight in ACorners then
2045+
LRoundRectRadii[TSkRoundRectCorner.UpperRight] := PointF(XRadius, YRadius);
2046+
if TCorner.BottomLeft in ACorners then
2047+
LRoundRectRadii[TSkRoundRectCorner.LowerLeft] := PointF(XRadius, YRadius);
2048+
if TCorner.BottomRight in ACorners then
2049+
LRoundRectRadii[TSkRoundRectCorner.LowerRight] := PointF(XRadius, YRadius);
2050+
LRoundRect := TSkRoundRect.Create(ARect, LRoundRectRadii);
2051+
Canvas.DrawRoundRect(LRoundRect, LPaint);
2052+
end;
2053+
finally
2054+
EndPaint(LBrushData);
2055+
end;
2056+
end;
2057+
end;
2058+
20242059
procedure TSkCanvasCustom.DoEndScene;
20252060
begin
20262061
EndCanvas(FContextHandle);
@@ -2079,6 +2114,8 @@ procedure TSkCanvasCustom.DoFillRoundRect(const ARect: TRectF; const XRadius, YR
20792114
var
20802115
LBrushData: TBrushData;
20812116
LPaint: TSkPaint;
2117+
LRoundRect: ISkRoundRect;
2118+
LRoundRectRadii: TSkRoundRectRadii;
20822119
begin
20832120
if ACornerType <> TCornerType.Round then
20842121
inherited
@@ -2091,17 +2128,17 @@ procedure TSkCanvasCustom.DoFillRoundRect(const ARect: TRectF; const XRadius, YR
20912128
Canvas.DrawRoundRect(ARect, XRadius, YRadius, LPaint)
20922129
else
20932130
begin
2094-
FillChar(FRoundRectRadii, SizeOf(FRoundRectRadii), 0);
2131+
FillChar(LRoundRectRadii, SizeOf(LRoundRectRadii), 0);
20952132
if TCorner.TopLeft in ACorners then
2096-
FRoundRectRadii[TSkRoundRectCorner.UpperLeft] := PointF(XRadius, YRadius);
2133+
LRoundRectRadii[TSkRoundRectCorner.UpperLeft] := PointF(XRadius, YRadius);
20972134
if TCorner.TopRight in ACorners then
2098-
FRoundRectRadii[TSkRoundRectCorner.UpperRight] := PointF(XRadius, YRadius);
2135+
LRoundRectRadii[TSkRoundRectCorner.UpperRight] := PointF(XRadius, YRadius);
20992136
if TCorner.BottomLeft in ACorners then
2100-
FRoundRectRadii[TSkRoundRectCorner.LowerLeft] := PointF(XRadius, YRadius);
2137+
LRoundRectRadii[TSkRoundRectCorner.LowerLeft] := PointF(XRadius, YRadius);
21012138
if TCorner.BottomRight in ACorners then
2102-
FRoundRectRadii[TSkRoundRectCorner.LowerRight] := PointF(XRadius, YRadius);
2103-
FRoundRect.SetRect(ARect, FRoundRectRadii);
2104-
Canvas.DrawRoundRect(FRoundRect, LPaint);
2139+
LRoundRectRadii[TSkRoundRectCorner.LowerRight] := PointF(XRadius, YRadius);
2140+
LRoundRect := TSkRoundRect.Create(ARect, LRoundRectRadii);
2141+
Canvas.DrawRoundRect(LRoundRect, LPaint);
21052142
end;
21062143
finally
21072144
EndPaint(LBrushData);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy