Procházet zdrojové kódy

Fix posterization zoom scaling

Jakub Ciemała před 1 týdnem
rodič
revize
9a33f8cbcc

+ 9 - 5
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Effects/PosterizationNode.cs

@@ -1,4 +1,5 @@
 using Drawie.Backend.Core;
+using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Shaders;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
@@ -21,7 +22,6 @@ public class PosterizationNode : RenderNode, IRenderInput
     private Shader shader;
     
     private Shader? lastImageShader;
-    private PosterizationMode? lastMode = null;
     private VecI lastDocumentSize;
     
     private string shaderCode = """
@@ -74,6 +74,7 @@ public class PosterizationNode : RenderNode, IRenderInput
         UseDocumentColorSpace = CreateInput("UseDocumentColorSpace", "USE_DOCUMENT_COLOR_SPACE", false);
         
         paint = new Paint();
+        paint.BlendMode = BlendMode.Src;
         Output.FirstInChain = null;
     }
 
@@ -81,7 +82,6 @@ public class PosterizationNode : RenderNode, IRenderInput
     {
         base.OnExecute(context);
         lastDocumentSize = context.RenderOutputSize;
-        lastMode = Mode.Value;
         
         Uniforms uniforms = new Uniforms();
         uniforms.Add("iImage", new Uniform("iImage", lastImageShader));
@@ -117,11 +117,15 @@ public class PosterizationNode : RenderNode, IRenderInput
         paint.Shader = shader;
         snapshot.Dispose();
         
-        var saved = temp.DrawingSurface.Canvas.Save();
-        temp.DrawingSurface.Canvas.Scale((float)context.ChunkResolution.InvertedMultiplier());
+        var savedTemp = temp.DrawingSurface.Canvas.Save();
+        temp.DrawingSurface.Canvas.SetMatrix(Matrix3X3.Identity);
         temp.DrawingSurface.Canvas.DrawRect(0, 0, context.RenderOutputSize.X, context.RenderOutputSize.Y, paint);
-        temp.DrawingSurface.Canvas.RestoreToCount(saved);
+        temp.DrawingSurface.Canvas.RestoreToCount(savedTemp);
+        
+        var saved = surface.Canvas.Save();
+        surface.Canvas.SetMatrix(Matrix3X3.Identity);
         surface.Canvas.DrawSurface(temp.DrawingSurface, 0, 0);
+        surface.Canvas.RestoreToCount(saved);
     }
     
     public override RectD? GetPreviewBounds(int frame, string elementToRenderName = "")