ソースを参照

Fixed tests and masks for folders

Krzysztof Krysiński 1 週間 前
コミット
938226a11e

+ 2 - 2
src/ChunkyImageLib/ChunkyImage.cs

@@ -355,8 +355,8 @@ public class ChunkyImage : IReadOnlyChunkyImage, IDisposable, ICloneable, ICache
                 using Chunk tempChunk = Chunk.Create(ProcessingColorSpace, ChunkResolution.Eighth);
                 using Paint committedPaint = new Paint() { Color = committedColor, BlendMode = BlendMode.Src };
                 using Paint latestPaint = new Paint() { Color = latestColor, BlendMode = this.blendMode };
-                tempChunk.Surface.DrawingSurface.Canvas.DrawPixel(VecI.Zero, committedPaint);
-                tempChunk.Surface.DrawingSurface.Canvas.DrawPixel(VecI.Zero, latestPaint);
+                tempChunk.Surface.DrawingSurface.Canvas.DrawRect(new RectD(VecI.Zero, new VecD(1)), committedPaint);
+                tempChunk.Surface.DrawingSurface.Canvas.DrawRect(new RectD(VecI.Zero, new VecI(1)), latestPaint);
                 return tempChunk.Surface.GetSrgbPixel(VecI.Zero);
             }
         }

+ 5 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FolderNode.cs

@@ -100,8 +100,13 @@ public class FolderNode : StructureNode, IReadOnlyFolderNode, IClipSource
 
         Content.Value?.Paint(sceneContext, outputWorkingSurface.DrawingSurface);
 
+        int saved2 = outputWorkingSurface.DrawingSurface.Canvas.Save();
+        outputWorkingSurface.DrawingSurface.Canvas.Scale((float)sceneContext.ChunkResolution.InvertedMultiplier());
+
         ApplyMaskIfPresent(outputWorkingSurface.DrawingSurface, sceneContext, sceneContext.ChunkResolution);
 
+        outputWorkingSurface.DrawingSurface.Canvas.RestoreToCount(saved2);
+
         if (Background.Value != null && sceneContext.TargetPropertyOutput != RawOutput)
         {
             Texture tempSurface = RequestTexture(1, outputWorkingSurface.Size, sceneContext.ProcessingColorSpace);

+ 10 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs

@@ -324,6 +324,13 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
         return EmbeddedMask != null;
     }
 
+    public override RectD? GetPreviewBounds(RenderContext ctx, string elementToRenderName)
+    {
+        return EmbeddedMask is null
+            ? null
+            : new RectD(0, 0, EmbeddedMask.LatestSize.X, EmbeddedMask.LatestSize.Y);
+    }
+
     public override void RenderPreview(DrawingSurface renderOn, RenderContext context,
         string elementToRenderName)
     {
@@ -334,10 +341,13 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
             return;
         }
 
+        int saved = renderOn.Canvas.Save();
+        renderOn.Canvas.Scale((float)context.ChunkResolution.InvertedMultiplier());
         img.DrawMostUpToDateRegionOn(
             new RectI(0, 0, img.LatestSize.X, img.LatestSize.Y),
             context.ChunkResolution,
             renderOn, VecI.Zero, maskPreviewPaint, drawPaintOnEmpty: true);
+        renderOn.Canvas.RestoreToCount(saved);
     }
 
     public override void Dispose()

+ 1 - 1
src/PixiEditor/Models/DocumentModels/ActionAccumulator.cs

@@ -157,7 +157,7 @@ internal class ActionAccumulator
                             affectedAreas.ChangedMasks,
                             affectedAreas.ChangedNodes, affectedAreas.ChangedKeyFrames,
                             affectedAreas.IgnoreAnimationPreviews,
-                            undoBoundaryPassed || refreshPreviewsRequest);
+                            undoBoundaryPassed || refreshPreviewsRequest || refreshPreviewRequest);
                     }
                 }
 

+ 1 - 1
src/PixiEditor/Models/DocumentPassthroughActions/RefreshPreview_PassthroughAction.cs

@@ -4,4 +4,4 @@ using PixiEditor.Models.Position;
 
 namespace PixiEditor.Models.DocumentPassthroughActions;
 
-internal record class RefreshPreview_PassthroughAction(Guid Id, Guid? SubId = null) : IAction, IChangeInfo;
+internal record class RefreshPreview_PassthroughAction(Guid Id, Guid? SubId = null, string ElementToRender = null) : IAction, IChangeInfo;

+ 9 - 2
src/PixiEditor/Models/Rendering/AffectedAreasGatherer.cs

@@ -214,8 +214,15 @@ internal class AffectedAreasGatherer
                 case RefreshPreview_PassthroughAction info:
                     if (info.SubId == null)
                     {
-                        AddToImagePreviews(info.Id);
-                        AddToNodePreviews(info.Id);
+                        if (info.ElementToRender == nameof(StructureNode.EmbeddedMask))
+                        {
+                            AddToMaskPreview(info.Id);
+                        }
+                        else
+                        {
+                            AddToImagePreviews(info.Id);
+                            AddToNodePreviews(info.Id);
+                        }
                     }
                     else
                     {

+ 8 - 2
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -6,6 +6,7 @@ using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ViewModels.Nodes;
 using PixiEditor.ChangeableDocument.Rendering;
 using PixiEditor.Models.DocumentPassthroughActions;
@@ -288,7 +289,7 @@ internal class MemberPreviewUpdater
 
                 if (structureMemberHandler.MaskPreview == null)
                 {
-                    structureMemberHandler.MaskPreview = new TexturePreview(node.Id, RequestRender);
+                    structureMemberHandler.MaskPreview = new TexturePreview(node.Id, RequestMaskRender);
                     continue;
                 }
 
@@ -322,7 +323,7 @@ internal class MemberPreviewUpdater
                 }
 
                 previewTextures[node.Id].Add(new PreviewRenderRequest(CreateTextureForMask,
-                    structureMemberHandler.MaskPreview.InvokeTextureUpdated));
+                    structureMemberHandler.MaskPreview.InvokeTextureUpdated) {ElementToRender = nameof(StructureNode.EmbeddedMask) });
             }
         }
     }
@@ -436,4 +437,9 @@ internal class MemberPreviewUpdater
     {
         internals.ActionAccumulator.AddActions(new RefreshPreview_PassthroughAction(nodeId, celId));
     }
+
+    private void RequestMaskRender(Guid id)
+    {
+        internals.ActionAccumulator.AddActions(new RefreshPreview_PassthroughAction(id, null, nameof(StructureNode.EmbeddedMask)));
+    }
 }

+ 18 - 2
tests/PixiEditor.Tests/BlendingTests.cs

@@ -1,9 +1,12 @@
 using ChunkyImageLib.DataHolders;
 using Drawie.Backend.Core;
+using Drawie.Backend.Core.Bridge;
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
+using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Numerics;
+using Drawie.Skia;
 using PixiEditor.ChangeableDocument.Changeables.Graph;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
 using PixiEditor.ChangeableDocument.Rendering;
@@ -39,13 +42,26 @@ public class BlendingTests : PixiEditorTest
         NodeGraph graph = new NodeGraph();
         var firstImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
 
+        using Paint redPaint = new Paint
+        {
+            Color = new Color(255, 0, 0, 255),
+            BlendMode = Drawie.Backend.Core.Surfaces.BlendMode.Src
+        };
+
         var firstImg = firstImageLayer.GetLayerImageAtFrame(0);
-        firstImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 0, 0, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
+        firstImg.EnqueueDrawPaint(redPaint);
         firstImg.CommitChanges();
 
         var secondImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
         var secondImg = secondImageLayer.GetLayerImageAtFrame(0);
-        secondImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 255, 255, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
+
+        using var whitePaint = new Paint
+        {
+            Color = new Color(255, 255, 255, 255),
+            BlendMode = Drawie.Backend.Core.Surfaces.BlendMode.Src
+        };
+
+        secondImg.EnqueueDrawPaint(whitePaint);
         secondImg.CommitChanges();
 
         var outputNode = new OutputNode();

BIN
tests/PixiEditor.Tests/TestFiles/RenderTests/BlendingLinearSrgb.png


BIN
tests/PixiEditor.Tests/TestFiles/RenderTests/VectorRectangleClippedToCircleMasked.png