|
@@ -113,8 +113,15 @@ type
|
|
|
FCanvas: ISkCanvas;
|
|
|
class constructor InitSkiaRenderer;
|
|
|
protected
|
|
|
- procedure DrawElBackground(El: TFresnelElement; Params: TBorderAndBackground;
|
|
|
- HasRadius: boolean; const Radii: TSkRoundRectRadii); virtual;
|
|
|
+ Type
|
|
|
+ TSkiaBorderAndBackground = class (TBorderAndBackground)
|
|
|
+ Radii : TSkRoundRectRadii;
|
|
|
+ procedure CalcRadii;
|
|
|
+ end;
|
|
|
+ protected
|
|
|
+ function PrepareBackgroundBorder(El: TFresnelElement; Params: TBorderAndBackground): Boolean; override;
|
|
|
+ function CreateBorderAndBackGround : TBorderAndBackground; override;
|
|
|
+ procedure DrawElBackground(El: TFresnelElement; Params: TBorderAndBackground); override;
|
|
|
procedure DrawElBorder(El: TFresnelElement; Params: TBorderAndBackground); override;
|
|
|
procedure DrawImage(const aLeft, aTop, aWidth, aHeight: TFresnelLength;
|
|
|
const aImage: TFPCustomImage); override;
|
|
@@ -554,9 +561,29 @@ begin
|
|
|
ImagesConfig.ImageClass := TFresnelSkiaFPImage;
|
|
|
end;
|
|
|
|
|
|
-procedure TFresnelSkiaRenderer.DrawElBackground(El: TFresnelElement;
|
|
|
- Params: TBorderAndBackground; HasRadius: boolean;
|
|
|
- const Radii: TSkRoundRectRadii);
|
|
|
+function TFresnelSkiaRenderer.PrepareBackgroundBorder(El: TFresnelElement; Params: TBorderAndBackground): Boolean;
|
|
|
+
|
|
|
+var
|
|
|
+ Minwidth : TFresnelLength;
|
|
|
+
|
|
|
+begin
|
|
|
+ Result:=inherited PrepareBackgroundBorder(El, Params);
|
|
|
+ if not Result then
|
|
|
+ exit;
|
|
|
+ MinWidth:=GetMinStrokeWidth;
|
|
|
+ Result:=(Params.Box.Width>MinWidth) and (Params.Box.Height>MinWidth);
|
|
|
+ if Result then
|
|
|
+ if Params.HasRadius then
|
|
|
+ (Params as TSkiaBorderAndBackground).CalcRadii;
|
|
|
+end;
|
|
|
+
|
|
|
+function TFresnelSkiaRenderer.CreateBorderAndBackGround: TBorderAndBackground;
|
|
|
+begin
|
|
|
+ Result:=TSkiaBorderAndBackground.Create(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+procedure TFresnelSkiaRenderer.DrawElBackground(El: TFresnelElement; Params: TBorderAndBackground);
|
|
|
var
|
|
|
r: TRectF;
|
|
|
LinGrad: TFresnelCSSImageLinearGradient;
|
|
@@ -565,6 +592,8 @@ var
|
|
|
Shader: ISkShader;
|
|
|
SkPaint: ISkPaint;
|
|
|
Oval: ISkRoundRect;
|
|
|
+ SkiaParams : TSkiaBorderAndBackground Absolute Params;
|
|
|
+
|
|
|
begin
|
|
|
if El=nil then ;
|
|
|
|
|
@@ -595,80 +624,32 @@ begin
|
|
|
end else
|
|
|
exit;
|
|
|
|
|
|
- if HasRadius then
|
|
|
+ if Params.HasRadius then
|
|
|
begin
|
|
|
Oval:=TSkRoundRect.Create;
|
|
|
- Oval.SetRect(r,Radii);
|
|
|
+ Oval.SetRect(r,SkiaParams.Radii);
|
|
|
Canvas.DrawRoundRect(Oval, SkPaint);
|
|
|
end else begin
|
|
|
Canvas.DrawRect(r, SkPaint);
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-procedure TFresnelSkiaRenderer.DrawElBorder(El: TFresnelElement;
|
|
|
- Params: TBorderAndBackground);
|
|
|
-const
|
|
|
- MinStrokeWidth=0.09;
|
|
|
-
|
|
|
- procedure NormStroke(var s: TFresnelLength; NoNegative: boolean);
|
|
|
- begin
|
|
|
- if NoNegative and (s<0) then
|
|
|
- begin
|
|
|
- s:=0;
|
|
|
- exit;
|
|
|
- end;
|
|
|
- if SameValue(s,0,MinStrokeWidth) then
|
|
|
- s:=0;
|
|
|
- end;
|
|
|
+procedure TFresnelSkiaRenderer.DrawElBorder(El: TFresnelElement; Params: TBorderAndBackground);
|
|
|
|
|
|
var
|
|
|
HasBorder, HasRadius, SameBorderWidth: Boolean;
|
|
|
r: TRectF;
|
|
|
- Corner: TFresnelCSSCorner;
|
|
|
- Radii: TSkRoundRectRadii;
|
|
|
SkPaint: ISkPaint;
|
|
|
- SkCorner: TSkRoundRectCorner;
|
|
|
- Side: TFresnelCSSSide;
|
|
|
Oval: ISkRoundRect;
|
|
|
+ SkiaParams : TSkiaBorderAndBackground Absolute Params;
|
|
|
+
|
|
|
begin
|
|
|
if El=nil then ;
|
|
|
+ // Radii are calculated in prepare step.
|
|
|
|
|
|
- if (Params.Box.Width<=MinStrokeWidth)
|
|
|
- or (Params.Box.Height<=MinStrokeWidth) then
|
|
|
- begin
|
|
|
- //writeln('TFresnelSkiaRenderer.DrawElBorder ',El.GetPath,' Params.Box=',Params.Box.ToString);
|
|
|
- exit;
|
|
|
- end;
|
|
|
-
|
|
|
- SameBorderWidth:=true;
|
|
|
- for Side in TFresnelCSSSide do
|
|
|
- begin
|
|
|
- NormStroke(Params.Width[Side],true);
|
|
|
- if (Side>Low(Side)) and (not SameValue(Params.Width[Side],Params.Width[Low(Side)])) then
|
|
|
- SameBorderWidth:=false;
|
|
|
- end;
|
|
|
-
|
|
|
- HasBorder:=(Params.Width[ffsLeft]>0)
|
|
|
- or (Params.Width[ffsRight]>0)
|
|
|
- or (Params.Width[ffsTop]>0)
|
|
|
- or (Params.Width[ffsBottom]>0);
|
|
|
- HasRadius:=false;
|
|
|
- for Corner in TFresnelCSSCorner do
|
|
|
- begin
|
|
|
- SkCorner:=CSSToSkRoundRectCorner[Corner];
|
|
|
- NormStroke(Params.Radius[Corner].X,true);
|
|
|
- NormStroke(Params.Radius[Corner].Y,true);
|
|
|
- if (Params.Radius[Corner].X>0) and (Params.Radius[Corner].Y>0) then
|
|
|
- begin
|
|
|
- Radii[SkCorner].x:=Params.Radius[Corner].X;
|
|
|
- Radii[SkCorner].y:=Params.Radius[Corner].Y;
|
|
|
- HasRadius:=true;
|
|
|
- end else begin
|
|
|
- Radii[SkCorner].x:=0;
|
|
|
- Radii[SkCorner].y:=0;
|
|
|
- end;
|
|
|
- end;
|
|
|
-
|
|
|
+ SameBorderWidth:=Params.SameBorderWidth;
|
|
|
+ HasBorder:=Params.HasBorder;
|
|
|
+ HasRadius:=Params.HasRadius;
|
|
|
if HasBorder then begin
|
|
|
// with border
|
|
|
r:=RectF(Params.Width[ffsLeft]/2,
|
|
@@ -682,8 +663,6 @@ begin
|
|
|
r.Offset(Params.Box.Left+Origin.X,Params.Box.Top+Origin.Y);
|
|
|
//writeln('TFresnelSkiaRenderer.DrawElBorder ',El.GetPath,' Box=',Params.Box.ToString,' Origin=',Origin.ToString,' r=',r.Left,',',r.Top,',',r.Right,',',r.Bottom);
|
|
|
|
|
|
- DrawElBackground(El,Params,HasRadius,Radii);
|
|
|
-
|
|
|
// draw border
|
|
|
if HasBorder then
|
|
|
begin
|
|
@@ -695,7 +674,7 @@ begin
|
|
|
if HasRadius then
|
|
|
begin
|
|
|
Oval:=TSkRoundRect.Create;
|
|
|
- Oval.SetRect(r,Radii);
|
|
|
+ Oval.SetRect(r,SkiaParams.Radii);
|
|
|
Canvas.DrawRoundRect(Oval, SkPaint);
|
|
|
end else begin
|
|
|
Canvas.DrawRect(r, SkPaint);
|
|
@@ -721,7 +700,7 @@ begin
|
|
|
if SkImage=nil then exit;
|
|
|
|
|
|
r:=RectF(aLeft,aTop,aLeft+aWidth,aTop+aHeight);
|
|
|
- r.Offset(FOrigin.X,FOrigin.Y);
|
|
|
+ r.Offset(Origin.X,Origin.Y);
|
|
|
Canvas.DrawImageRect(SkImage,r);
|
|
|
end;
|
|
|
|
|
@@ -735,7 +714,7 @@ begin
|
|
|
SkPaint:=TSkPaint.Create(TSkPaintStyle.Fill);
|
|
|
SkPaint.setColor(FPColorToSkia(aColor));
|
|
|
r:=aRect.GetRectF;
|
|
|
- r.Offset(FOrigin.X,FOrigin.Y);
|
|
|
+ r.Offset(Origin.X,Origin.Y);
|
|
|
Canvas.DrawRect(r, SkPaint);
|
|
|
end;
|
|
|
|
|
@@ -746,7 +725,7 @@ var
|
|
|
begin
|
|
|
SkPaint:=TSkPaint.Create(TSkPaintStyle.Stroke);
|
|
|
SkPaint.setColor(FPColorToSkia(aColor));
|
|
|
- Canvas.DrawLine(FOrigin.X+x1,FOrigin.Y+y1,FOrigin.X+x2,FOrigin.Y+y2, SkPaint);
|
|
|
+ Canvas.DrawLine(Origin.X+x1,Origin.Y+y1,Origin.X+x2,Origin.Y+y2, SkPaint);
|
|
|
end;
|
|
|
|
|
|
procedure TFresnelSkiaRenderer.TextOut(const aLeft, aTop: TFresnelLength;
|
|
@@ -762,8 +741,8 @@ begin
|
|
|
SkPaint:=TSkPaint.Create;
|
|
|
SkPaint.setColor(FPColorToSkia(aColor));
|
|
|
aTextBlob:=TSkTextBlob.MakeFromText(UnicodeString(aText),FreSkiaFont.SKFont);
|
|
|
- X:=FOrigin.X+aLeft;
|
|
|
- Y:=FOrigin.Y+aTop - FreSkiaFont.SKMetrics.Ascent;
|
|
|
+ X:=Origin.X+aLeft;
|
|
|
+ Y:=Origin.Y+aTop - FreSkiaFont.SKMetrics.Ascent;
|
|
|
Canvas.DrawTextBlob(aTextBlob, X, Y, SkPaint);
|
|
|
end;
|
|
|
|
|
@@ -783,8 +762,8 @@ begin
|
|
|
aTextBlob:=TSkTextBlob.MakeFromText(UnicodeString(aText),FreSkiaFont.SKFont);
|
|
|
//SkPaint.MaskFilter:=TSkMaskFilter.MakeBlur(TSkBlurStyle.Normal,);
|
|
|
SkPaint.ImageFilter:=TSkImageFilter.MakeBlur(aRadius,aRadius);
|
|
|
- X:=FOrigin.X+aLeft;
|
|
|
- Y:=FOrigin.Y+aTop - FreSkiaFont.SKMetrics.Ascent;
|
|
|
+ X:=Origin.X+aLeft;
|
|
|
+ Y:=Origin.Y+aTop - FreSkiaFont.SKMetrics.Ascent;
|
|
|
Canvas.DrawTextBlob(aTextBlob, X, Y, SkPaint);
|
|
|
end;
|
|
|
|
|
@@ -794,5 +773,26 @@ begin
|
|
|
SubPixel:=true;
|
|
|
end;
|
|
|
|
|
|
+{ TFresnelSkiaRenderer.TSkiaBorderAndBackground }
|
|
|
+
|
|
|
+procedure TFresnelSkiaRenderer.TSkiaBorderAndBackground.CalcRadii;
|
|
|
+
|
|
|
+var
|
|
|
+ Corner : TFresnelCSSCorner;
|
|
|
+ SkCorner : TSkRoundRectCorner;
|
|
|
+
|
|
|
+begin
|
|
|
+ Radii:=Default(TSkRoundRectRadii);
|
|
|
+ for Corner in TFresnelCSSCorner do
|
|
|
+ begin
|
|
|
+ SkCorner:=CSSToSkRoundRectCorner[Corner];
|
|
|
+ if (Radius[Corner].X>0) and (Radius[Corner].Y>0) then
|
|
|
+ begin
|
|
|
+ Radii[SkCorner].x:=Radius[Corner].X;
|
|
|
+ Radii[SkCorner].y:=Radius[Corner].Y;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
end.
|
|
|
|