Ver Fonte

lcl: skia renderer

mattias há 1 ano atrás
pai
commit
efbefbfa25

+ 2 - 2
demo/lcl/Button/FreBtnForm.lfm

@@ -13,9 +13,9 @@ object FresnelButtonForm: TFresnelButtonForm
   object Body1: TBody
     Style = 'border: 2px;'#10'border-color: blue;'
     object Div1: TDiv
-      Style = 'background-color: blue;'#10'border-color: black;'#10'height:50px;'
+      Style = 'background-color: blue;'#10'border-color: black;'#10'height:50px;'#10'border-radius:10px;'
       object Label1: TLabel
-        Style = 'color: green;'
+        Style = 'color: green;text-shadow:1 0 0;'
         OnClick = Label1Click
         OnMouseDown = Label1MouseDown
         OnMouseMove = Label1MouseMove

+ 1 - 1
src/base/fresnel.widgetset.pas

@@ -16,7 +16,7 @@ type
   private
     FRenderer: TFresnelRenderer;
   protected
-    procedure SetRenderer(aValue : TFresnelRenderer);
+    procedure SetRenderer(aValue: TFresnelRenderer);
     function GetCaption: TFresnelCaption; virtual; abstract;
     function GetFormBounds: TFresnelRect; virtual; abstract;
     function GetVisible: boolean; virtual; abstract;

+ 5 - 4
src/fresnel.lpk

@@ -19,6 +19,7 @@ if FresnelBackend+''='' then begin
   else
     FresnelBackend := 'gtk3';
 end;
+
 // FresnelRenderer
 if FresnelRenderer+''='' then begin
   FresnelRenderer := 'skia';
@@ -52,16 +53,16 @@ end;"/>
         <Item1>
           <Identifier Value="FresnelBackend"/>
           <Values Count="3">
-            <Item1 Value="Gtk3"/>
-            <Item2 Value="Cocoa"/>
-            <Item3 Value="WinApi"/>
+            <Item1 Value="gtk3"/>
+            <Item2 Value="cocoa"/>
+            <Item3 Value="winapi"/>
           </Values>
           <ValueDescriptions Count="3"/>
         </Item1>
         <Item2>
           <Identifier Value="FresnelRenderer"/>
           <Values Count="1">
-            <Item1 Value="Skia"/>
+            <Item1 Value="skia"/>
           </Values>
           <ValueDescriptions Count="1"/>
         </Item2>

+ 81 - 12
src/lcl/fresnel.lcl.pas

@@ -12,7 +12,11 @@ uses
   AvgLvlTree, LazLoggerBase, GraphType,
   Graphics, Controls, LCLIntf, Forms, LResources, IntfGraphics,
   Fresnel.Classes, Fresnel.Events, Fresnel.DOM,
-  Fresnel.Renderer, Fresnel.Images, Fresnel.WidgetSet, Fresnel.Forms;
+  Fresnel.Renderer, Fresnel.Images, Fresnel.WidgetSet,
+  {$IFDEF FresnelSkia}
+  System.Skia, Fresnel.SkiaRenderer,
+  {$ENDIF}
+  Fresnel.Forms;
 
 type
   TFresnelLCLFontEngine = class;
@@ -80,7 +84,6 @@ type
       const aText: string); override;
     procedure DrawImage(const aLeft, aTop, aWidth, aHeight: TFresnelLength; const aImage: TFPCustomImage); override;
   public
-    constructor Create(AOwner: TComponent); override;
     property Canvas: TCanvas read FCanvas write FCanvas;
   end;
 
@@ -101,6 +104,9 @@ type
   private
     FFresnelForm: TFresnelCustomForm;
     FLCLForm: TFresnelLCLForm;
+    {$IFDEF FresnelSkia}
+    FIntfImg: TLazIntfImage;
+    {$ENDIF}
     procedure LCLMouseDown(Sender: TObject; Button: Controls.TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure LCLMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
@@ -258,11 +264,6 @@ begin
   end;
 end;
 
-constructor TFresnelLCLRenderer.Create(AOwner: TComponent);
-begin
-  inherited Create(AOwner);
-end;
-
 { TLCLWSForm }
 
 procedure TLCLWSForm.SetFresnelForm(const AValue: TFresnelCustomForm);
@@ -323,8 +324,62 @@ begin
 end;
 
 procedure TLCLWSForm.LCLPaint(Sender: TObject);
+
+  {$IFDEF FresnelSkia}
+  procedure DrawSkia;
+  var
+    W, H: Integer;
+    SkiaRenderer: TFresnelSkiaRenderer;
+    SkSurface: ISkSurface;
+    SkCanvas: ISkCanvas;
+    Desc: TRawImageDescription;
+    Bmp: TBitmap;
+  begin
+    W:=LCLForm.ClientWidth;
+    H:=LCLForm.ClientHeight;
+    if (W<1) or (H<1) then exit;
+    SkiaRenderer:=Renderer as TFresnelSkiaRenderer;
+
+    if FIntfImg=nil then
+    begin
+      if SkNative32ColorType=TSkColorType.BGRA8888 then
+        Desc.Init_BPP32_B8G8R8A8_BIO_TTB(W,H)
+      else
+        Desc.Init_BPP32_R8G8B8A8_BIO_TTB(W,H);
+      FIntfImg:=TLazIntfImage.Create(0,0);
+      FIntfImg.DataDescription:=Desc;
+      FIntfImg.SetSize(W,H);
+    end else if (FIntfImg.Width<>W) or (FIntfImg.Height<>H) then
+    begin
+      FIntfImg.SetSize(W,H);
+    end;
+
+    SkSurface := TSkSurface.MakeRasterDirect(TSkImageInfo.Create(W,H),
+                     FIntfImg.PixelData, FIntfImg.DataDescription.BytesPerLine);
+    SkCanvas:=SkSurface.Canvas;
+    SkiaRenderer.Canvas:=SkCanvas;
+    try
+      FresnelForm.WSDraw;
+    finally
+      SkiaRenderer.Canvas:=SkCanvas;
+    end;
+
+    Bmp:=TBitmap.Create;
+    try
+      Bmp.LoadFromIntfImage(FIntfImg);
+      LCLForm.Canvas.Draw(0,0,Bmp);
+    finally
+      Bmp.Free;
+    end;
+  end;
+  {$ENDIF}
+
 begin
+  {$IFDEF FresnelSkia}
+  DrawSkia;
+  {$ELSE}
   FresnelForm.WSDraw;
+  {$ENDIF}
 end;
 
 function TLCLWSForm.GetFormBounds: TFresnelRect;
@@ -371,14 +426,23 @@ begin
 end;
 
 constructor TLCLWSForm.Create(AOwner: TComponent);
+var
+  aRenderer: TFresnelRenderer;
 begin
   inherited Create(AOwner);
-  SetRenderer(TFresnelLCLRenderer.Create(Self));
+  {$IFDEF FresnelSkia}
+  aRenderer:=TFresnelSkiaRenderer.Create(Self);
+  {$ELSE}
+  aRenderer:=TFresnelLCLRenderer.Create(Self);
+  {$ENDIF}
+  SetRenderer(aRenderer);
 end;
 
 destructor TLCLWSForm.Destroy;
 begin
-//  FreeAndNil(FRenderer);
+  {$IFDEF FrsenelSkia}
+  FreeAndNil(FIntfImg);
+  {$ENDIF}
   inherited Destroy;
 end;
 
@@ -403,18 +467,23 @@ end;
 
 function TLCLWSForm.CreateLCLForm: TForm;
 var
-  aFontEngine: TFresnelLCLFontEngine;
+  aFontEngine: TFresnelFontEngine;
 begin
   debugln(['TLCLWSForm.CreateLCLForm Bounds=',dbgs(FresnelForm.FormBounds)]);
   FLCLForm := TFresnelLCLForm.CreateNew(Self);
   FLCLForm.FFresnelForm:=FresnelForm;
   Result:=LCLForm;
+  {$IFDEF FresnelSkia}
+  // create one fontengine per form
+  aFontEngine:=TFresnelSkiaFontEngine.Create(Self);
+  FresnelForm.FontEngine:=aFontEngine;
+  {$ELSE}
   TFresnelLCLRenderer(Renderer).Canvas:=LCLForm.Canvas;
-
   // create one fontengine per form
   aFontEngine:=TFresnelLCLFontEngine.Create(FLCLForm);
   FresnelForm.FontEngine:=aFontEngine;
-  aFontEngine.Canvas:=LCLForm.Canvas;
+  TFresnelLCLFontEngine(aFontEngine).Canvas:=LCLForm.Canvas;
+  {$ENDIF}
 
   // events
   FLCLForm.OnMouseDown:=@LCLMouseDown;

+ 1 - 0
src/lcl/fresnel.lclcontrols.pas

@@ -9,6 +9,7 @@ uses
   fresnel.lclevents;
 
 type
+
   { TFresnelLCLControl }
 
   TFresnelLCLControl = class(TCustomControl)

+ 28 - 6
src/lcl/fresnellcl.lpk

@@ -8,11 +8,33 @@
       <SearchPaths>
         <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
       </SearchPaths>
-      <Other>
-        <ConfigFile>
-          <WriteConfigFilePath Value=""/>
-        </ConfigFile>
-      </Other>
+      <Conditionals Value="// FresnelRenderer
+if FresnelLCLRenderer+&apos;&apos;=&apos;&apos; then begin
+  FresnelLCLRenderer := &apos;lcl&apos;;
+end;
+
+if FresnelLCLRenderer=&apos;skia&apos; then begin
+  CustomOptions += &apos; -dFresnelSkia&apos;;
+  UnitPath += &apos;;../skia;../skia/skia4delphi&apos;;
+end;
+
+// linker options
+if TargetOS=&apos;darwin&apos; then begin
+  if FresnelBackend=&apos;gtk3&apos; then
+    UsageLibraryPath := &apos;/usr/X11R6/lib;/sw/lib;/sw/lib/pango-ft219/lib&apos;
+  else if FresnelBackend=&apos;cocoa&apos; then
+    UsageLinkerOptions := &apos;-framework Cocoa&apos;;
+end;"/>
+      <BuildMacros>
+        <Count Value="1"/>
+        <Item1>
+          <Identifier Value="FresnelLCLRenderer"/>
+          <Values Count="2">
+            <Item1 Value="skia"/>
+            <Item2 Value="lcl"/>
+          </Values>
+        </Item1>
+      </BuildMacros>
     </CompilerOptions>
     <Description Value="Runtime package for using Fresnel inside an LCL application."/>
     <License Value="Same as LCL.
@@ -52,7 +74,7 @@ Modified LGPL-2."/>
       </Item2>
     </RequiredPkgs>
     <UsageOptions>
-      <CustomOptions Value="-dFresnel -dFresnelLCL"/>
+      <CustomOptions Value="-dFresnel -dFresnel$(FresnelLCLRenderer)"/>
       <UnitPath Value="$(PkgOutDir)"/>
     </UsageOptions>
     <PublishOptions>