Browse Source

skia: override RoundRect and Arc

mattias 1 year ago
parent
commit
151941733b

+ 7 - 0
src/base/fresnel.classes.pas

@@ -56,6 +56,7 @@ type
     procedure SetLocation(const p: TFresnelPoint); overload;
     procedure SetLocation(const p: TPoint); overload;
     function GetPoint: TPoint;
+    function GetPointF: TPointF;
     function ToString : String;
   end;
   TFLPoint = TFresnelPoint;
@@ -237,6 +238,12 @@ begin
   Result.Y:=round(Y);
 end;
 
+function TFresnelPoint.GetPointF: TPointF;
+begin
+  Result.x:=X;
+  Result.y:=Y;
+end;
+
 function TFresnelPoint.ToString: String;
 begin
   Result:=Format('(%g,%g)',[X,Y]);

+ 0 - 1
src/base/fresnel.renderer.pas

@@ -158,7 +158,6 @@ end;
 procedure TFresnelRenderer.AddTextShadow(const aX, aY: TFresnelLength; const aColor: TFPColor; const aRadius: TFresnelLength);
 var
   Len : Integer;
-  Shadow : TFresnelTextShadow;
 
 begin
   Len:=Length(FTextShadows);

+ 1 - 2
src/lcl/fresnel.lcl.pas

@@ -79,14 +79,13 @@ type
   TFresnelLCLRenderer = class(TFresnelRenderer)
   private
     FCanvas: TCanvas;
-  protected
+  public
     procedure FillRect(const aColor: TFPColor; const aRect: TFresnelRect); override;
     procedure Line(const aColor: TFPColor; const x1, y1, x2, y2: TFresnelLength); override;
     procedure TextOut(const aLeft, aTop: TFresnelLength;
       const aFont: IFresnelFont; const aColor: TFPColor;
       const aText: string); override;
     procedure DrawImage(const aLeft, aTop, aWidth, aHeight: TFresnelLength; const aImage: TFPCustomImage); override;
-  public
     property Canvas: TCanvas read FCanvas write FCanvas;
   end;
 

+ 45 - 5
src/skia/fresnel.skiarenderer.pas

@@ -124,12 +124,16 @@ type
     procedure DrawElBackground(El: TFresnelElement; Params: TBorderAndBackground); override;
     procedure DrawElBorder(El: TFresnelElement; Params: TBorderAndBackground); override;
     procedure DrawTextShadow(const aLeft, aTop: TFresnelLength; const FreSkiaFont: TFresnelSkiaFont;
-      const aColor: TFPColor; const aRadius: TFresnelLength; const aTextBlob: ISkTextBlob);
+      const aColor: TFPColor; const aRadius: TFresnelLength; const aTextBlob: ISkTextBlob); virtual;
  Public
+   procedure Arc(const aColor: TFPColor; aCenter, aRadii: TFresnelPoint;
+     aStartAngle: Double=0; aStopAngle: Double=DoublePi); override;
     procedure DrawImage(const aLeft, aTop, aWidth, aHeight: TFresnelLength;
       const aImage: TFPCustomImage); override;
     procedure FillRect(const aColor: TFPColor; const aRect: TFresnelRect); override;
     procedure Line(const aColor: TFPColor; const x1, y1, x2, y2: TFresnelLength); override;
+    procedure RoundRect(const aColor: TFPColor; const aRect: TFresnelRoundRect;
+      Fill: Boolean); override;
     procedure TextOut(const aLeft, aTop: TFresnelLength;
       const aFont: IFresnelFont; const aColor: TFPColor;
       const aText: string); override;
@@ -593,7 +597,7 @@ var
   Color1, Color2: TAlphaColor;
   Shader: ISkShader;
   SkPaint: ISkPaint;
-  Oval: ISkRoundRect;
+  RoundR: ISkRoundRect;
   SkiaParams : TSkiaBorderAndBackground Absolute Params;
 
 begin
@@ -631,9 +635,9 @@ begin
 
   if Params.HasRadius then
   begin
-    Oval:=TSkRoundRect.Create;
-    Oval.SetRect(r,SkiaParams.Radii);
-    Canvas.DrawRoundRect(Oval, SkPaint);
+    RoundR:=TSkRoundRect.Create;
+    RoundR.SetRect(r,SkiaParams.Radii);
+    Canvas.DrawRoundRect(RoundR, SkPaint);
   end else begin
     Canvas.DrawRect(r, SkPaint);
   end;
@@ -736,6 +740,30 @@ begin
   Canvas.DrawLine(Origin.X+x1,Origin.Y+y1,Origin.X+x2,Origin.Y+y2, SkPaint);
 end;
 
+procedure TFresnelSkiaRenderer.RoundRect(const aColor: TFPColor;
+  const aRect: TFresnelRoundRect; Fill: Boolean);
+var
+  c: TFresnelCSSCorner;
+  Radii: TSkRoundRectRadii;
+  SkPaint: ISkPaint;
+  RR: TRectF;
+  RoundR: ISkRoundRect;
+begin
+  if Fill then
+    SkPaint:=TSkPaint.Create(TSkPaintStyle.Fill)
+  else
+    SkPaint:=TSkPaint.Create(TSkPaintStyle.Stroke);
+  SkPaint.setColor(FPColorToSkia(aColor));
+
+  for c in TFresnelCSSCorner do
+    Radii[CSSToSkRoundRectCorner[c]]:=aRect.Radius[c].GetPointF;
+  RR:=aRect.Box.GetRectF;
+
+  RoundR:=TSkRoundRect.Create;
+  RoundR.SetRect(RR,Radii);
+  Canvas.DrawRoundRect(RoundR, SkPaint);
+end;
+
 procedure TFresnelSkiaRenderer.TextOut(const aLeft, aTop: TFresnelLength;
   const aFont: IFresnelFont; const aColor: TFPColor; const aText: string);
 var
@@ -783,6 +811,18 @@ begin
   Canvas.DrawTextBlob(aTextBlob, X, Y, SkPaint);
 end;
 
+procedure TFresnelSkiaRenderer.Arc(const aColor: TFPColor; aCenter,
+  aRadii: TFresnelPoint; aStartAngle: Double; aStopAngle: Double);
+var
+  Oval: TRectF;
+  SkPaint: ISkPaint;
+begin
+  SkPaint:=TSkPaint.Create(TSkPaintStyle.Stroke);
+  SkPaint.setColor(FPColorToSkia(aColor));
+  Oval:=RectF(aCenter.X-aRadii.X,aCenter.Y-aRadii.Y,aCenter.X+aRadii.X,aCenter.Y+aRadii.Y);
+  Canvas.DrawArc(Oval,aStartAngle,aStopAngle-aStartAngle,false,SkPaint);
+end;
+
 constructor TFresnelSkiaRenderer.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);