Browse Source

Transform selected now respects lock transparency

Krzysztof Krysiński 4 months ago
parent
commit
5996ee65e3

+ 15 - 4
src/PixiEditor.ChangeableDocument/Changes/Drawing/TransformSelected_UpdateableChange.cs

@@ -4,6 +4,7 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.ChangeInfos.Objects;
 using PixiEditor.ChangeableDocument.Changes.Selection;
 using Drawie.Backend.Core;
+using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.PaintImpl;
@@ -35,6 +36,7 @@ internal class TransformSelected_UpdateableChange : InterruptableUpdateableChang
     private AffectedArea lastAffectedArea;
 
     private static Paint RegularPaint { get; } = new() { BlendMode = BlendMode.SrcOver };
+    private static Paint LockedAlphaPaint { get; } = new() { BlendMode = BlendMode.SrcIn, Color = Colors.White };
 
     [GenerateUpdateableChangeActions]
     public TransformSelected_UpdateableChange(
@@ -250,7 +252,8 @@ internal class TransformSelected_UpdateableChange : InterruptableUpdateableChang
             {
                 ChunkyImage memberImage =
                     DrawingChangeHelper.GetTargetImageOrThrow(target, member.MemberId, drawOnMask, frame);
-                var area = DrawImage(member, memberImage);
+                var memberNode = target.FindMember(member.MemberId);
+                var area = DrawImage(member, memberImage, isTransformingSelection && memberNode is ImageLayerNode { LockTransparency: true });
                 member.SavedChunks = new(memberImage, memberImage.FindAffectedArea().Chunks);
                 memberImage.CommitChanges();
                 infos.Add(DrawingChangeHelper.CreateAreaChangeInfo(member.MemberId, area, drawOnMask).AsT1);
@@ -287,8 +290,9 @@ internal class TransformSelected_UpdateableChange : InterruptableUpdateableChang
                 ChunkyImage targetImage =
                     DrawingChangeHelper.GetTargetImageOrThrow(target, member.MemberId, drawOnMask, frame);
 
+                var memberNode = target.FindMember(member.MemberId);
                 infos.Add(DrawingChangeHelper.CreateAreaChangeInfo(member.MemberId,
-                        DrawImage(member, targetImage), drawOnMask)
+                        DrawImage(member, targetImage, isTransformingSelection && memberNode is ImageLayerNode { LockTransparency: true }), drawOnMask)
                     .AsT1);
             }
             else if (member.IsTransformable)
@@ -392,7 +396,7 @@ internal class TransformSelected_UpdateableChange : InterruptableUpdateableChang
         return final;
     }
 
-    private AffectedArea DrawImage(MemberTransformationData data, ChunkyImage memberImage)
+    private AffectedArea DrawImage(MemberTransformationData data, ChunkyImage memberImage, bool lockAlpha)
     {
         var prevAffArea = memberImage.FindAffectedArea();
 
@@ -400,7 +404,14 @@ internal class TransformSelected_UpdateableChange : InterruptableUpdateableChang
 
         if (!keepOriginal)
             memberImage.EnqueueClearPath(data.OriginalPath!, data.RoundedOriginalBounds);
-        memberImage.EnqueueDrawImage(data.LocalMatrix, data.Image, RegularPaint, false);
+        var finalPaint = RegularPaint;
+
+        if (lockAlpha)
+        {
+            finalPaint = LockedAlphaPaint;
+        }
+
+        memberImage.EnqueueDrawImage(data.LocalMatrix, data.Image, finalPaint, false);
         hasEnqueudImages = true;
 
         var affectedArea = memberImage.FindAffectedArea();