Forráskód Böngészése

merge bitmap layer with vectorial layer

also fix merged layer original guid
circular17 6 éve
szülő
commit
03c0fb521c
1 módosított fájl, 80 hozzáadás és 26 törlés
  1. 80 26
      lazpaint/image/uimagediff.pas

+ 80 - 26
lazpaint/image/uimagediff.pas

@@ -484,6 +484,7 @@ type
     layerOverCompressedBackup: TStoredLayer;
     layerUnderCompressedBackup: TStoredLayer;
     mergeVectorial: boolean;
+    mergeVectorialGuid: TGuid;
     constructor Create(ADestination: TState; ALayerOverIndex: integer);
     function UsedMemory: int64; override;
     function TryCompress: boolean; override;
@@ -2114,6 +2115,7 @@ constructor TMergeLayerOverStateDifference.Create(ADestination: TState;
   ALayerOverIndex: integer);
 var
   imgDest: TImageState;
+  totalCost: Integer;
 begin
   inherited Create(ADestination);
   imgDest := ADestination as TImageState;
@@ -2122,18 +2124,28 @@ begin
   if ALayerOverIndex = 0 then
     raise exception.Create('First layer cannot be merged over');
 
+  mergeVectorial := false;
+  mergeVectorialGuid := GUID_NULL;
   layerOverIndex := ALayerOverIndex;
   with imgDest.LayeredBitmap do
   begin
     previousActiveLayerId:= LayerUniqueId[imgDest.SelectedImageLayerIndex];
     layerOverCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex, true);
     layerUnderCompressedBackup := TStoredLayer.Create(imgDest.LayeredBitmap, ALayerOverIndex-1, true);
-    mergeVectorial := (LayerOriginalClass[ALayerOverIndex] = TVectorOriginal) and
-       (LayerOriginalClass[ALayerOverIndex-1] = TVectorOriginal) and
-       (TVectorOriginal(LayerOriginal[ALayerOverIndex]).GetShapesCost +
-        TVectorOriginal(LayerOriginal[ALayerOverIndex-1]).GetShapesCost <= MediumShapeCost) and
-        (BlendOperation[ALayerOverIndex] = boTransparent) and
-        (BlendOperation[ALayerOverIndex-1] = boTransparent);
+    if ((LayerOriginalClass[ALayerOverIndex] = TVectorOriginal) or
+       (LayerOriginalClass[ALayerOverIndex-1] = TVectorOriginal)) and
+       (BlendOperation[ALayerOverIndex] = boTransparent) and
+       (BlendOperation[ALayerOverIndex-1] = boTransparent) then
+    begin
+      totalCost := 0;
+      if LayerOriginalClass[ALayerOverIndex] = TVectorOriginal then
+        inc(totalCost, TVectorOriginal(LayerOriginal[ALayerOverIndex]).GetShapesCost)
+      else inc(totalCost, 10);
+      if LayerOriginalClass[ALayerOverIndex-1] = TVectorOriginal then
+        inc(totalCost, TVectorOriginal(LayerOriginal[ALayerOverIndex-1]).GetShapesCost)
+      else inc(totalCost, 10);
+      if totalCost <= MediumShapeCost then mergeVectorial := true;
+    end;
   end;
 
   //select layer under and merge
@@ -2155,10 +2167,64 @@ end;
 procedure TMergeLayerOverStateDifference.ApplyTo(AState: TState);
 var
   merged: TBGRABitmap;
-  origOver, origUnder, mergedOriginal: TVectorOriginal;
-  i: Integer;
-  mOver, mUnder: TAffineMatrix;
-  s: TVectorShape;
+  mergedOriginal: TVectorOriginal;
+
+  procedure AppendToMergedOriginal(ALayeredBitmap: TBGRALayeredBitmap; ALayerIndex: integer);
+  var
+    vectOrig: TVectorOriginal;
+    m: TAffineMatrix;
+    i: Integer;
+    s: TVectorShape;
+    temp: TBGRABitmap;
+    b: TRect;
+    c: TBGRALayerOriginalAny;
+  begin
+    c := ALayeredBitmap.LayerOriginalClass[ALayerIndex];
+    m := ALayeredBitmap.LayerOriginalMatrix[ALayerIndex];
+    if c = TVectorOriginal then
+    begin
+      vectOrig := ALayeredBitmap.LayerOriginal[ALayerIndex] as TVectorOriginal;
+      for i := 0 to vectOrig.ShapeCount-1 do
+      begin
+        s := vectOrig.Shape[i].Duplicate;
+        s.Transform(m);
+        mergedOriginal.AddShape(s);
+      end;
+    end else
+    if c = TBGRALayerImageOriginal then
+    begin
+      temp := (ALayeredBitmap.LayerOriginal[ALayerIndex] as TBGRALayerImageOriginal).GetImageCopy;
+      if Assigned(temp) then
+      begin
+        s := TRectShape.Create(mergedOriginal);
+        s.PenStyle := ClearPenStyle;
+        s.BackFill.SetTexture(temp, AffineMatrixIdentity, 255, trNone);
+        temp.FreeReference;
+        s.QuickDefine(PointF(-0.5,-0.5), PointF(temp.width-0.5,temp.Height-0.5));
+        s.Transform(m);
+        mergedOriginal.AddShape(s);
+      end;
+    end else
+    begin
+      if Assigned(ALayeredBitmap.LayerBitmap[ALayerIndex]) then
+      begin
+        b := ALayeredBitmap.LayerBitmap[ALayerIndex].GetImageBounds;
+        if not b.IsEmpty then
+        begin
+          temp := ALayeredBitmap.LayerBitmap[ALayerIndex].GetPart(b) as TBGRABitmap;
+          s := TRectShape.Create(mergedOriginal);
+          s.PenStyle := ClearPenStyle;
+          s.BackFill.SetTexture(temp, AffineMatrixIdentity, 255, trNone);
+          temp.FreeReference;
+          s.QuickDefine(PointF(-0.5,-0.5), PointF(temp.width-0.5,temp.Height-0.5));
+          with ALayeredBitmap.LayerOffset[ALayerIndex] do
+            s.Transform(AffineMatrixTranslation(b.Left+X,b.Top+Y));
+          mergedOriginal.AddShape(s);
+        end;
+      end;
+    end;
+  end;
+
 begin
   inherited ApplyTo(AState);
   with AState as TImageState do
@@ -2169,23 +2235,11 @@ begin
      if mergeVectorial then
      begin
        mergedOriginal := TVectorOriginal.Create;
-       origOver := LayerOriginal[layerOverIndex] as TVectorOriginal;
-       mOver := LayeredBitmap.LayerOriginalMatrix[layerOverIndex];
-       origUnder := LayerOriginal[layerOverIndex-1] as TVectorOriginal;
-       mUnder := LayeredBitmap.LayerOriginalMatrix[layerOverIndex-1];
-       for i := 0 to origUnder.ShapeCount-1 do
-       begin
-         s := origUnder.Shape[i].Duplicate;
-         s.Transform(mUnder);
-         mergedOriginal.AddShape(s);
-       end;
-       for i := 0 to origOver.ShapeCount-1 do
-       begin
-         s := origOver.Shape[i].Duplicate;
-         s.Transform(mOver);
-         mergedOriginal.AddShape(s);
-       end;
+       mergedOriginal.Guid := mergeVectorialGuid;
+       AppendToMergedOriginal(LayeredBitmap, layerOverIndex-1);
+       AppendToMergedOriginal(LayeredBitmap, layerOverIndex);
        LayeredBitmap.AddOriginal(mergedOriginal);
+       mergeVectorialGuid := mergedOriginal.Guid;
        LayeredBitmap.LayerOriginalGuid[layerOverIndex-1] := mergedOriginal.Guid;
        LayeredBitmap.LayerOriginalMatrix[layerOverIndex-1] := AffineMatrixIdentity;
        LayeredBitmap.RenderLayerFromOriginal(layerOverIndex-1);