瀏覽代碼

layer original logo (SVG, bitmap)

Unknown 6 年之前
父節點
當前提交
06e321605a
共有 3 個文件被更改,包括 73 次插入15 次删除
  1. 7 0
      lazpaint/uimage.pas
  2. 10 0
      lazpaint/uimagestate.pas
  3. 56 15
      lazpaint/ulayerstack.pas

+ 7 - 0
lazpaint/uimage.pas

@@ -64,6 +64,7 @@ type
     function GetLayerBitmapById(AId: integer): TBGRABitmap;
     function GetLayerBitmapById(AId: integer): TBGRABitmap;
     function GetLayerId(AIndex: integer): integer;
     function GetLayerId(AIndex: integer): integer;
     function GetLayerOriginal(AIndex: integer): TBGRALayerCustomOriginal;
     function GetLayerOriginal(AIndex: integer): TBGRALayerCustomOriginal;
+    function GetLayerOriginalClass(AIndex: integer): TBGRALayerOriginalAny;
     function GetLayerOriginalDefined(AIndex: integer): boolean;
     function GetLayerOriginalDefined(AIndex: integer): boolean;
     function GetLayerOriginalKnown(AIndex: integer): boolean;
     function GetLayerOriginalKnown(AIndex: integer): boolean;
     function GetLayerOriginalMatrix(AIndex: integer): TAffineMatrix;
     function GetLayerOriginalMatrix(AIndex: integer): TAffineMatrix;
@@ -239,6 +240,7 @@ type
     property LayerOriginal[AIndex: integer]: TBGRALayerCustomOriginal read GetLayerOriginal;
     property LayerOriginal[AIndex: integer]: TBGRALayerCustomOriginal read GetLayerOriginal;
     property LayerOriginalDefined[AIndex: integer]: boolean read GetLayerOriginalDefined;
     property LayerOriginalDefined[AIndex: integer]: boolean read GetLayerOriginalDefined;
     property LayerOriginalKnown[AIndex: integer]: boolean read GetLayerOriginalKnown;
     property LayerOriginalKnown[AIndex: integer]: boolean read GetLayerOriginalKnown;
+    property LayerOriginalClass[AIndex: integer]: TBGRALayerOriginalAny read GetLayerOriginalClass;
     property LayerOriginalMatrix[AIndex: integer]: TAffineMatrix read GetLayerOriginalMatrix write SetLayerOriginalMatrix;
     property LayerOriginalMatrix[AIndex: integer]: TAffineMatrix read GetLayerOriginalMatrix write SetLayerOriginalMatrix;
     property LayerId[AIndex: integer]: integer read GetLayerId;
     property LayerId[AIndex: integer]: integer read GetLayerId;
     property LayerVisible[AIndex: integer]: boolean read GetLayerVisible write SetLayerVisible;
     property LayerVisible[AIndex: integer]: boolean read GetLayerVisible write SetLayerVisible;
@@ -1208,6 +1210,11 @@ begin
   result := FCurrentState.LayerOriginal[AIndex];
   result := FCurrentState.LayerOriginal[AIndex];
 end;
 end;
 
 
+function TLazPaintImage.GetLayerOriginalClass(AIndex: integer): TBGRALayerOriginalAny;
+begin
+  result := FCurrentState.LayerOriginalClass[AIndex];
+end;
+
 function TLazPaintImage.GetLayerOriginalDefined(AIndex: integer): boolean;
 function TLazPaintImage.GetLayerOriginalDefined(AIndex: integer): boolean;
 begin
 begin
   result := FCurrentState.LayerOriginalDefined[AIndex];
   result := FCurrentState.LayerOriginalDefined[AIndex];

+ 10 - 0
lazpaint/uimagestate.pas

@@ -34,6 +34,7 @@ type
     function GetLayerOriginal(Index: integer): TBGRALayerCustomOriginal;
     function GetLayerOriginal(Index: integer): TBGRALayerCustomOriginal;
     function GetLayerOriginalDefined(Index: integer): boolean;
     function GetLayerOriginalDefined(Index: integer): boolean;
     function GetLayerOriginalKnown(Index: integer): boolean;
     function GetLayerOriginalKnown(Index: integer): boolean;
+    function GetLayerOriginalClass(Index: integer): TBGRALayerOriginalAny;
     function GetLayerOriginalMatrix(Index: integer): TAffineMatrix;
     function GetLayerOriginalMatrix(Index: integer): TAffineMatrix;
     function GetLayerVisible(Index: integer): boolean;
     function GetLayerVisible(Index: integer): boolean;
     function GetLinearBlend: boolean;
     function GetLinearBlend: boolean;
@@ -144,6 +145,7 @@ type
     property LayerOriginal[Index: integer]: TBGRALayerCustomOriginal read GetLayerOriginal;
     property LayerOriginal[Index: integer]: TBGRALayerCustomOriginal read GetLayerOriginal;
     property LayerOriginalDefined[Index: integer]: boolean read GetLayerOriginalDefined;
     property LayerOriginalDefined[Index: integer]: boolean read GetLayerOriginalDefined;
     property LayerOriginalKnown[Index: integer]: boolean read GetLayerOriginalKnown;
     property LayerOriginalKnown[Index: integer]: boolean read GetLayerOriginalKnown;
+    property LayerOriginalClass[Index: integer]: TBGRALayerOriginalAny read GetLayerOriginalClass;
     property LayerOriginalMatrix[Index: integer]: TAffineMatrix read GetLayerOriginalMatrix;
     property LayerOriginalMatrix[Index: integer]: TAffineMatrix read GetLayerOriginalMatrix;
     property LayerBitmap[Index: integer]: TBGRABitmap read GetLayerBitmap;
     property LayerBitmap[Index: integer]: TBGRABitmap read GetLayerBitmap;
     property LayerBitmapById[AId: integer]: TBGRABitmap read GetLayerBitmapById;
     property LayerBitmapById[AId: integer]: TBGRABitmap read GetLayerBitmapById;
@@ -193,6 +195,14 @@ begin
     result := LayeredBitmap.BlendOperation[Index];
     result := LayeredBitmap.BlendOperation[Index];
 end;
 end;
 
 
+function TImageState.GetLayerOriginalClass(Index: integer): TBGRALayerOriginalAny;
+begin
+  if LayeredBitmap = nil then
+    result := nil
+  else
+    result := LayeredBitmap.LayerOriginalClass[Index];
+end;
+
 function TImageState.GetCurrentLayerIndex: integer;
 function TImageState.GetCurrentLayerIndex: integer;
 begin
 begin
   if LayeredBitmap = nil then
   if LayeredBitmap = nil then

+ 56 - 15
lazpaint/ulayerstack.pas

@@ -96,7 +96,8 @@ type
 
 
 implementation
 implementation
 
 
-uses BGRAFillInfo,uscaledpi,uresourcestrings,ublendop, uimage, utool, BGRAText, BGRAThumbnail;
+uses BGRAFillInfo,uscaledpi,uresourcestrings,ublendop, uimage, utool, BGRAText, BGRAThumbnail,
+   BGRALayerOriginal, math, BGRATransform, BGRASVGOriginal;
 
 
 function TFLayerStack.DrawLayerItem(ABitmap: TBGRABitmap; layerPos: TPoint; layerIndex: integer; ASelected: boolean): TDrawLayerItemResult;
 function TFLayerStack.DrawLayerItem(ABitmap: TBGRABitmap; layerPos: TPoint; layerIndex: integer; ASelected: boolean): TDrawLayerItemResult;
 var
 var
@@ -547,6 +548,54 @@ var i: integer;
   y: integer;
   y: integer;
   clipping, rKind: TRect;
   clipping, rKind: TRect;
   lColor, lColorTrans: TBGRAPixel;
   lColor, lColorTrans: TBGRAPixel;
+
+  procedure DrawKind(AClass: TBGRALayerOriginalAny);
+  var
+    eb: TEasyBezierCurve;
+    w: single;
+    i: integer;
+    m: TAffineMatrix;
+  begin
+    if AClass = TBGRALayerImageOriginal then
+    begin
+      Bitmap.Rectangle(rKind, lColor,lColorTrans, dmDrawWithTransparency);
+      Bitmap.HorizLine(rKind.Left+1,rKind.Top+(rKind.Height-1) div 2,rKind.Right-2, lColor, dmDrawWithTransparency);
+      Bitmap.VertLine(rKind.Left+(rKind.Width-1) div 2,rKind.Top+1,rKind.Bottom-2, lColor, dmDrawWithTransparency);
+    end else
+    if AClass = TBGRALayerSVGOriginal then
+    begin
+      m := AffineMatrixTranslation(rKind.Left,rKind.Top+rKind.Height*0.1)*AffineMatrixScale(rKind.Width,rKind.Height*0.8);
+      w := max(1,rKind.Height/10);
+      eb := EasyBezierCurve([PointF(0.28,0),PointF(0,0),PointF(0,0.5),PointF(0.28,0.5),PointF(1/3,1),PointF(0,1)],False,cmCurve);
+      for i := 0 to eb.PointCount-1 do eb.Point[i] := m*eb.Point[i];
+      Bitmap.DrawPolyLineAntialias(eb.ToPoints, lColor, w, true);
+      eb := EasyBezierCurve([PointF(0.33,0),PointF(0.47,1),PointF(0.6,0)],False,cmAngle);
+      for i := 0 to eb.PointCount-1 do eb.Point[i] := m*eb.Point[i];
+      Bitmap.DrawPolyLineAntialias(eb.ToPoints, lColor, w, true);
+      eb := EasyBezierCurve([PointF(1,0),PointF(0.7,0),PointF(2/3,1),PointF(1,1),PointF(1,0.5),PointF(5/6,0.5)],False,cmCurve);
+      eb.CurveMode[eb.PointCount-2] := cmAngle;
+      for i := 0 to eb.PointCount-1 do eb.Point[i] := m*eb.Point[i];
+      Bitmap.DrawPolyLineAntialias(eb.ToPoints, lColor, w, true);
+    end else
+    if AClass = nil then
+    begin
+      eb := EasyBezierCurve([PointF(0.25,0.25),PointF(0.32,0.07),PointF(0.5,0),PointF(0.68,0.07),PointF(0.75,0.20),
+                             PointF(0.75,0.30),PointF(0.70,0.40),PointF(0.5,0.5),PointF(0.5,0.70)],False,cmCurve);
+      m := AffineMatrixTranslation(rKind.Left,rKind.Top)*AffineMatrixScale(rKind.Width,rKind.Height);
+      for i := 0 to eb.PointCount-1 do eb.Point[i] := m*eb.Point[i];
+      w := max(1,rKind.Height/10);
+      Bitmap.DrawPolyLineAntialias(eb.ToPoints, lColor, w, true);
+      Bitmap.FillEllipseAntialias((rKind.Left+rKind.Right)/2, rKind.Bottom - 1 - (w-1)/2, w*0.6,w*0.6, lColor);
+    end else
+    begin
+      Bitmap.EllipseAntialias(rKind.Left+rKind.Width / 3, rKind.Top+rKind.Height / 3,rKind.Width / 3,rKind.Height / 3,
+                              lColor, 1, lColorTrans);
+      Bitmap.DrawPolygonAntialias([PointF(rKind.Left+rKind.Width/4,rKind.Bottom),
+                                   PointF(rKind.Left+rKind.Width/2,rKind.Top+rKind.Height/4),
+                                   PointF(rKind.Right,rKind.Bottom)],lColor,1, lColorTrans);
+    end;
+  end;
+
 begin
 begin
   if Layout then
   if Layout then
   begin
   begin
@@ -607,20 +656,12 @@ begin
           if LayerOriginalDefined[i] then
           if LayerOriginalDefined[i] then
           begin
           begin
             if LayerOriginalKnown[i] then
             if LayerOriginalKnown[i] then
-            begin
-              Bitmap.EllipseAntialias(rKind.Left+rKind.Width / 3, rKind.Top+rKind.Height / 3,rKind.Width / 3,rKind.Height / 3,
-                                      lColor, 1, lColorTrans);
-              Bitmap.DrawPolygonAntialias([PointF(rKind.Left+rKind.Width/4,rKind.Bottom),
-                                           PointF(rKind.Left+rKind.Width/2,rKind.Top+rKind.Height/4),
-                                           PointF(rKind.Right,rKind.Bottom)],lColor,1, lColorTrans);
-            end else
-              Bitmap.TextOut((rKind.Left+rKind.Right)/2, rKind.Top, '?', lColor, taCenter);
-          end else
-          begin
-            Bitmap.Rectangle(rKind, lColor,lColorTrans, dmDrawWithTransparency);
-            Bitmap.HorizLine(rKind.Left+1,rKind.Top+(rKind.Height-1) div 2,rKind.Right-2, lColor, dmDrawWithTransparency);
-            Bitmap.VertLine(rKind.Left+(rKind.Width-1) div 2,rKind.Top+1,rKind.Bottom-2, lColor, dmDrawWithTransparency);
-          end;
+              DrawKind(LayerOriginalClass[i])
+            else
+              DrawKind(nil);
+          end
+          else
+            DrawKind(TBGRALayerImageOriginal);
 
 
           inc(layerPos.X,InterruptorWidth);
           inc(layerPos.X,InterruptorWidth);
           if movingItemStart and (i= movingItemSourceIndex) then
           if movingItemStart and (i= movingItemSourceIndex) then