Kaynağa Gözat

Fixed low dpi rendering for layers

Krzysztof Krysiński 4 ay önce
ebeveyn
işleme
2cfcb065cd

+ 13 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FilterNodes/ApplyFilterNode.cs

@@ -24,6 +24,19 @@ public class ApplyFilterNode : RenderNode, IRenderInput
         Filter = CreateInput<Filter>("Filter", "FILTER", null);
         Output.FirstInChain = null;
         AllowHighDpiRendering = true;
+        Background.ConnectionChanged += OnConnectionChanged;
+    }
+
+    private void OnConnectionChanged()
+    {
+        if (Background.Connection == null)
+        {
+            AllowHighDpiRendering = true;
+        }
+        else
+        {
+            AllowHighDpiRendering = (Background.Connection.Node as RenderNode)?.AllowHighDpiRendering ?? true;
+        }
     }
 
     protected override void OnPaint(RenderContext context, DrawingSurface surface)

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ImageLayerNode.cs

@@ -54,6 +54,7 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
         int scaled = workingSurface.Canvas.Save();
         float multiplier = (float)ctx.ChunkResolution.InvertedMultiplier();
         workingSurface.Canvas.Translate(GetScenePosition(ctx.FrameTime));
+
         base.DrawLayerInScene(ctx, workingSurface, useFilters);
 
         workingSurface.Canvas.RestoreToCount(scaled);

+ 15 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/LayerNode.cs

@@ -44,7 +44,18 @@ public abstract class LayerNode : StructureNode, IReadOnlyLayerNode, IClipSource
                 blendPaint.BlendMode = RenderContext.GetDrawingBlendMode(BlendMode.Value);
             }
 
-            DrawLayerInScene(context, renderOnto, useFilters);
+            if (AllowHighDpiRendering)
+            {
+                DrawLayerInScene(context, renderOnto, useFilters);
+            }
+            else
+            {
+                using var tempSurface = Texture.ForProcessing(context.DocumentSize, context.ProcessingColorSpace);
+                DrawLayerOnTexture(context, tempSurface.DrawingSurface, useFilters);
+
+                renderOnto.Canvas.DrawSurface(tempSurface.DrawingSurface, 0, 0, blendPaint);
+            }
+
             return;
         }
 
@@ -134,11 +145,13 @@ public abstract class LayerNode : StructureNode, IReadOnlyLayerNode, IClipSource
 
             tex = Texture.ForProcessing(workingSurface,
                 ColorSpace.CreateSrgb());
-            targetSurface = tex.DrawingSurface;
             workingSurface.Canvas.SetMatrix(Matrix3X3.Identity);
 
+            targetSurface = tex.DrawingSurface;
+
             finalPaint = new Paint();
         }
+
         if (useFilters && Filters.Value != null)
         {
             blendPaint.SetFilters(Filters.Value);