Browse Source

Fixed resizing the image

flabbet 10 months ago
parent
commit
9c5969331f

+ 35 - 18
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ImageLayerNode.cs

@@ -18,9 +18,12 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
     public const string ImageLayerKey = "LayerImage";
     public OutputProperty<Texture> RawOutput { get; }
 
+    public override VecD ScenePosition => layerImage.CommittedSize / 2f;
+    public override VecD SceneSize => layerImage.CommittedSize;
+    
     public bool LockTransparency { get; set; }
 
-    private VecI size;
+    private VecI startSize;
     private ChunkyImage layerImage => keyFrames[0]?.Data as ChunkyImage;
     protected Paint replacePaint = new Paint() { BlendMode = DrawingApi.Core.Surfaces.BlendMode.Src };
 
@@ -47,12 +50,20 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
             keyFrames.Add(new KeyFrameData(Guid.NewGuid(), 0, 0, ImageLayerKey) { Data = new ChunkyImage(size) });
         }
 
-        this.size = size;
-        
-        renderedSurfaces[ChunkResolution.Full] = new Texture(size);
-        renderedSurfaces[ChunkResolution.Half] = new Texture(new VecI(Math.Max(size.X / 2, 1), Math.Max(size.Y / 2, 1))); 
-        renderedSurfaces[ChunkResolution.Quarter] = new Texture(new VecI(Math.Max(size.X / 4, 1), Math.Max(size.Y / 4, 1)));
-        renderedSurfaces[ChunkResolution.Eighth] = new Texture(new VecI(Math.Max(size.X / 8, 1), Math.Max(size.Y / 8, 1)));
+        this.startSize = size;
+
+        CreateRenderCanvases(size);
+    }
+
+    private void CreateRenderCanvases(VecI newSize)
+    {
+        renderedSurfaces[ChunkResolution.Full] = new Texture(newSize);
+        renderedSurfaces[ChunkResolution.Half] =
+            new Texture(new VecI(Math.Max(newSize.X / 2, 1), Math.Max(newSize.Y / 2, 1)));
+        renderedSurfaces[ChunkResolution.Quarter] =
+            new Texture(new VecI(Math.Max(newSize.X / 4, 1), Math.Max(newSize.Y / 4, 1)));
+        renderedSurfaces[ChunkResolution.Eighth] =
+            new Texture(new VecI(Math.Max(newSize.X / 8, 1), Math.Max(newSize.Y / 8, 1)));
     }
 
 
@@ -74,29 +85,29 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
         }*/
     }
 
-    public override VecD ScenePosition => size / 2f;
-    public override VecD SceneSize => size;
-
     protected override VecI GetTargetSize(RenderContext ctx)
     {
         return (GetFrameWithImage(ctx.FrameTime).Data as ChunkyImage).LatestSize;
     }
 
-    protected internal override void DrawLayer(SceneObjectRenderContext ctx, DrawingSurface workingSurface, bool useFilters = true)
+    protected internal override void DrawLayer(SceneObjectRenderContext ctx, DrawingSurface workingSurface,
+        bool useFilters = true)
     {
         int scaled = workingSurface.Canvas.Save();
         float multiplier = (float)ctx.ChunkResolution.InvertedMultiplier();
+        VecD shiftToCenter = SceneSize - renderedSurfaces[ctx.ChunkResolution].Size;
         workingSurface.Canvas.Scale(multiplier, multiplier);
+        workingSurface.Canvas.Translate(shiftToCenter / 2f);
         base.DrawLayer(ctx, workingSurface, useFilters);
-        
+
         workingSurface.Canvas.RestoreToCount(scaled);
     }
 
     protected override void DrawWithoutFilters(SceneObjectRenderContext ctx, DrawingSurface workingSurface,
         Paint paint)
     {
-        VecD topLeft = size / 2f;
-        workingSurface.Canvas.DrawSurface(renderedSurfaces[ctx.ChunkResolution].DrawingSurface, -(VecI)topLeft, paint); 
+        VecD topLeft = SceneSize / 2f;
+        workingSurface.Canvas.DrawSurface(renderedSurfaces[ctx.ChunkResolution].DrawingSurface, -(VecI)topLeft, paint);
     }
 
     // Draw with filters is a bit tricky since some filters sample data from chunks surrounding the chunk being drawn,
@@ -220,7 +231,6 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
         return true;
     }
 
-
     private void DrawChunk(ChunkyImage frameImage, RenderContext context, Texture tempSurface, VecI vecI,
         Paint paint)
     {
@@ -267,7 +277,7 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
 
     public override Node CreateCopy()
     {
-        var image = new ImageLayerNode(size) { MemberName = this.MemberName, };
+        var image = new ImageLayerNode(startSize) { MemberName = this.MemberName, };
 
         image.keyFrames.Clear();
 
@@ -294,7 +304,7 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
         SetLayerImageAtFrame(frame, (ChunkyImage)newLayerImage);
 
     void IReadOnlyImageNode.ForEveryFrame(Action<IReadOnlyChunkyImage> action) => ForEveryFrame(action);
-    
+
     public void RenderChunk(VecI chunkPos, ChunkResolution resolution, KeyFrameTime frameTime)
     {
         var img = GetLayerImageAtFrame(frameTime.Frame);
@@ -304,13 +314,20 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
             return;
         }
 
+        VecD targetSize = img.LatestSize * resolution.Multiplier();
+        if ((renderedSurfaces[resolution].Size * resolution.InvertedMultiplier()) != targetSize)
+        {
+            renderedSurfaces[resolution].Dispose();
+            renderedSurfaces[resolution] = new Texture((VecI)targetSize);
+        }
+
         img.DrawMostUpToDateChunkOn(
             chunkPos,
             resolution,
             renderedSurfaces[resolution].DrawingSurface,
             chunkPos * resolution.PixelSize(),
             replacePaint);
-        
+
         renderedSurfaces[resolution].DrawingSurface.Flush();
     }