Browse Source

Added bunch of TODOs and fixed compilation errors

Krzysztof Krysiński 1 năm trước cách đây
mục cha
commit
51c1407f2c
21 tập tin đã thay đổi với 77 bổ sung44 xóa
  1. 2 2
      src/PixiEditor.AvaloniaUI/Models/Rendering/AffectedAreasGatherer.cs
  2. 12 5
      src/PixiEditor.AvaloniaUI/Models/Rendering/MemberPreviewUpdater.cs
  3. 4 3
      src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentViewModel.cs
  4. 4 3
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs
  5. 3 3
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ChangeBrightness_UpdateableChange.cs
  6. 4 3
      src/PixiEditor.ChangeableDocument/Changes/Drawing/CombineStructureMembersOnto_Change.cs
  7. 7 1
      src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs
  8. 4 2
      src/PixiEditor.ChangeableDocument/Changes/Drawing/FloodFill/FloodFillHelper.cs
  9. 3 2
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ReplaceColor_Change.cs
  10. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayerHelper.cs
  11. 3 2
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayer_UpdateableChange.cs
  12. 4 2
      src/PixiEditor.ChangeableDocument/Changes/Root/CenterContent_Change.cs
  13. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs
  14. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs
  15. 2 1
      src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs
  16. 3 1
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeBasedChangeBase.cs
  17. 4 1
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeCanvas_Change.cs
  18. 5 2
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeImage_Change.cs
  19. 5 3
      src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs
  20. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Structure/ApplyMask_Change.cs
  21. 3 3
      src/PixiEditor.ChangeableDocument/Rendering/ChunkRenderer.cs

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

@@ -99,7 +99,7 @@ internal class AffectedAreasGatherer
         var member = tracker.Document.FindMember(memberGuid);
         if (member is IReadOnlyLayer layer)
         {
-            var chunks = layer.LayerImage.FindAllChunks();
+            var chunks = layer.Rasterize().FindAllChunks();
             AddToImagePreviews(memberGuid, new AffectedArea(chunks), ignoreSelf);
         }
         else if (member is IReadOnlyFolder folder)
@@ -115,7 +115,7 @@ internal class AffectedAreasGatherer
         var member = tracker.Document.FindMember(memberGuid);
         if (member is IReadOnlyLayer layer)
         {
-            var chunks = layer.LayerImage.FindAllChunks();
+            var chunks = layer.Rasterize().FindAllChunks();
             if (layer.Mask is not null && layer.MaskIsVisible && useMask)
                 chunks.IntersectWith(layer.Mask.FindAllChunks());
             AddToMainImage(new AffectedArea(chunks));

+ 12 - 5
src/PixiEditor.AvaloniaUI/Models/Rendering/MemberPreviewUpdater.cs

@@ -291,8 +291,15 @@ internal class MemberPreviewUpdater
         if (layer.Mask is null && forMask)
             throw new InvalidOperationException();
 
-        IReadOnlyChunkyImage targetImage = forMask ? layer.Mask! : layer.LayerImage;
-        return FindImageTightBounds(targetImage);
+        if (layer.Mask is not null && forMask)
+            return FindImageTightBoundsFast(layer.Mask);
+
+        if (layer is IReadOnlyRasterLayer raster)
+        {
+            return FindImageTightBoundsFast(raster.LayerImage);
+        }
+
+        return layer.GetTightBounds();
     }
 
     /// <summary>
@@ -304,7 +311,7 @@ internal class MemberPreviewUpdater
         {
             if (folder.Mask is null)
                 throw new InvalidOperationException();
-            return FindImageTightBounds(folder.Mask);
+            return FindImageTightBoundsFast(folder.Mask);
         }
 
         RectI? combinedBounds = null;
@@ -330,7 +337,7 @@ internal class MemberPreviewUpdater
     /// Finds the current committed tight bounds for an image in a reasonably efficient way.
     /// Looks at the low-res chunks for large images, meaning the resulting bounds aren't 100% precise.
     /// </summary>
-    private RectI? FindImageTightBounds(IReadOnlyChunkyImage targetImage)
+    private RectI? FindImageTightBoundsFast(IReadOnlyChunkyImage targetImage)
     {
         RectI? bounds = targetImage.FindChunkAlignedCommittedBounds();
         if (bounds is null)
@@ -524,7 +531,7 @@ internal class MemberPreviewUpdater
         foreach (var chunk in area.Chunks)
         {
             var pos = chunk * ChunkResolution.Full.PixelSize();
-            if (!layer.LayerImage.DrawCommittedChunkOn(chunk, ChunkResolution.Full, memberVM.PreviewSurface, pos, scaling < smoothingThreshold ? SmoothReplacingPaint : ReplacingPaint))
+            if (!layer.Rasterize().DrawCommittedChunkOn(chunk, ChunkResolution.Full, memberVM.PreviewSurface, pos, scaling < smoothingThreshold ? SmoothReplacingPaint : ReplacingPaint))
                 memberVM.PreviewSurface.Canvas.DrawRect(pos.X, pos.Y, ChunkyImage.FullChunkSize, ChunkyImage.FullChunkSize, ClearPaint);
         }
 

+ 4 - 3
src/PixiEditor.AvaloniaUI/ViewModels/Document/DocumentViewModel.cs

@@ -363,12 +363,13 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
     public OneOf<Error, None, (Surface, RectI)> MaybeExtractSelectedArea(IStructureMemberHandler? layerToExtractFrom = null)
     {
         layerToExtractFrom ??= SelectedStructureMember;
-        if (layerToExtractFrom is null || layerToExtractFrom is not LayerViewModel layerVm)
+        if (layerToExtractFrom is not LayerViewModel layerVm)
             return new Error();
         if (SelectionPathBindable.IsEmpty)
             return new None();
 
-        IReadOnlyLayer? layer = (IReadOnlyLayer?)Internals.Tracker.Document.FindMember(layerVm.GuidValue);
+        //TODO: Make sure it's not needed for other layer types
+        IReadOnlyRasterLayer? layer = (IReadOnlyRasterLayer?)Internals.Tracker.Document.FindMember(layerVm.GuidValue);
         if (layer is null)
             return new Error();
 
@@ -490,7 +491,7 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
             IReadOnlyStructureMember? maybeMember = Internals.Tracker.Document.FindMember(layerVm.GuidValue);
             if (maybeMember is not IReadOnlyLayer layer)
                 return Colors.Transparent;
-            return layer.LayerImage.GetMostUpToDatePixel(pos);
+            return layer.Rasterize().GetMostUpToDatePixel(pos);
         }
         catch (ObjectDisposedException)
         {

+ 4 - 3
src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs

@@ -16,7 +16,8 @@ internal class ApplyLayerMask_Change : Change
 
     public override bool InitializeAndValidate(Document target)
     {
-        if (!target.TryFindMember<Layer>(layerGuid, out var layer) || layer.Mask is null)
+        //TODO: Check if support for different Layer types is needed here.
+        if (!target.TryFindMember<RasterLayer>(layerGuid, out var layer) || layer.Mask is null)
             return false;
 
         savedLayer = new CommittedChunkStorage(layer.LayerImage, layer.LayerImage.FindCommittedChunks());
@@ -26,7 +27,7 @@ internal class ApplyLayerMask_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        var layer = target.FindMemberOrThrow<Layer>(layerGuid);
+        var layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
         if (layer.Mask is null)
             throw new InvalidOperationException("Cannot apply layer mask, no mask");
 
@@ -55,7 +56,7 @@ internal class ApplyLayerMask_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        var layer = target.FindMemberOrThrow<Layer>(layerGuid);
+        var layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
         if (layer.Mask is not null)
             throw new InvalidOperationException("Cannot restore layer mask, it already has one");
         if (savedLayer is null || savedMask is null)

+ 3 - 3
src/PixiEditor.ChangeableDocument/Changes/Drawing/ChangeBrightness_UpdateableChange.cs

@@ -42,7 +42,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
     {
         if (!DrawingChangeHelper.IsValidForDrawing(target, layerGuid, false))
             return false;
-        Layer layer = (Layer)target.FindMemberOrThrow(layerGuid);
+        RasterLayer layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
         DrawingChangeHelper.ApplyClipsSymmetriesEtc(target, layer.LayerImage, layerGuid, false);
         return true;
     }
@@ -52,7 +52,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
         if (ignoreUpdate)
             return new None();
         VecI pos = positions[^1];
-        Layer layer = (Layer)target.FindMemberOrThrow(layerGuid);
+        RasterLayer layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
 
         int queueLength = layer.LayerImage.QueueLength;
         
@@ -89,7 +89,7 @@ internal class ChangeBrightness_UpdateableChange : UpdateableChange
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        var layer = (Layer)target.FindMemberOrThrow(layerGuid);
+        var layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
         ignoreInUndo = false;
 
         if (savedChunks is not null)

+ 4 - 3
src/PixiEditor.ChangeableDocument/Changes/Drawing/CombineStructureMembersOnto_Change.cs

@@ -50,12 +50,13 @@ internal class CombineStructureMembersOnto_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        var toDrawOn = target.FindMemberOrThrow<Layer>(targetLayer);
+        //TODO: Add support for different Layer types
+        var toDrawOn = target.FindMemberOrThrow<RasterLayer>(targetLayer);
 
         var chunksToCombine = new HashSet<VecI>();
         foreach (var guid in layersToCombine)
         {
-            var layer = target.FindMemberOrThrow<Layer>(guid);
+            var layer = target.FindMemberOrThrow<RasterLayer>(guid);
             chunksToCombine.UnionWith(layer.LayerImage.FindAllChunks());
         }
 
@@ -79,7 +80,7 @@ internal class CombineStructureMembersOnto_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        var toDrawOn = target.FindMemberOrThrow<Layer>(targetLayer);
+        var toDrawOn = target.FindMemberOrThrow<RasterLayer>(targetLayer);
         var affectedArea = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(toDrawOn.LayerImage, ref originalChunks);
         return new LayerImageArea_ChangeInfo(targetLayer, affectedArea);
     }

+ 7 - 1
src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs

@@ -24,6 +24,7 @@ internal static class DrawingChangeHelper
 
     public static ChunkyImage GetTargetImageOrThrow(Document target, Guid memberGuid, bool drawOnMask)
     {
+        // TODO: Figure out if this should work only for raster layers or should rasterize any
         var member = target.FindMemberOrThrow(memberGuid);
         
         if (drawOnMask)
@@ -37,8 +38,13 @@ internal static class DrawingChangeHelper
         {
             throw new InvalidOperationException("Trying to draw on a folder");
         }
+
+        if (member is not RasterLayer layer)
+        {
+            throw new InvalidOperationException("Trying to draw on a non-raster layer member");
+        }
         
-        return ((Layer)member).LayerImage;
+        return layer.LayerImage;
     }
 
     public static void ApplyClipsSymmetriesEtc(Document target, ChunkyImage targetImage, Guid targetMemberGuid, bool drawOnMask)

+ 4 - 2
src/PixiEditor.ChangeableDocument/Changes/Drawing/FloodFill/FloodFillHelper.cs

@@ -24,9 +24,11 @@ public static class FloodFillHelper
         {
             Guid guid = membersToFloodFill.First();
             var member = document.FindMemberOrThrow(guid);
-            if (member is IReadOnlyFolder folder)
+            if (member is IReadOnlyFolder)
                 return new FloodFillChunkCache(membersToFloodFill, document.StructureRoot);
-            return new FloodFillChunkCache(((IReadOnlyLayer)member).LayerImage);
+            if (member is not IReadOnlyRasterLayer rasterLayer)
+                throw new InvalidOperationException("Member is not a raster layer");
+            return new FloodFillChunkCache(rasterLayer.LayerImage);
         }
         return new FloodFillChunkCache(membersToFloodFill, document.StructureRoot);
     }

+ 3 - 2
src/PixiEditor.ChangeableDocument/Changes/Drawing/ReplaceColor_Change.cs

@@ -29,8 +29,9 @@ internal class ReplaceColor_Change : Change
         List<IChangeInfo> infos = new();
         target.ForEveryMember(member =>
         {
-            if (member is not Layer layer)
+            if (member is not RasterLayer layer)
                 return;
+            //TODO: Add support for replacing in different Layer types
             layer.LayerImage.EnqueueReplaceColor(oldColor, newColor);
             var affArea = layer.LayerImage.FindAffectedArea();
             CommittedChunkStorage storage = new(layer.LayerImage, affArea.Chunks);
@@ -49,7 +50,7 @@ internal class ReplaceColor_Change : Change
         List<IChangeInfo> infos = new();
         target.ForEveryMember(member =>
         {
-            if (member is not Layer layer)
+            if (member is not RasterLayer layer)
                 return;
             CommittedChunkStorage? storage = savedChunks[member.GuidValue];
             var affArea = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(layer.LayerImage, ref storage);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayerHelper.cs

@@ -6,7 +6,7 @@ internal static class ShiftLayerHelper
 {
     public static AffectedArea DrawShiftedLayer(Document target, Guid layerGuid, bool keepOriginal, VecI delta)
     {
-        var targetImage = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
+        var targetImage = target.FindMemberOrThrow<RasterLayer>(layerGuid).LayerImage;
         var prevArea = targetImage.FindAffectedArea();
         targetImage.CancelChanges();
         if (!keepOriginal)

+ 3 - 2
src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayer_UpdateableChange.cs

@@ -50,7 +50,8 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
         foreach (var layerGuid in layerGuids)
         {
             var area = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, keepOriginal, delta);
-            var image = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
+            // TODO: Add support for different Layer types
+            var image = target.FindMemberOrThrow<RasterLayer>(layerGuid).LayerImage;
             
             changes.Add(new LayerImageArea_ChangeInfo(layerGuid, area));
             
@@ -80,7 +81,7 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
         List<IChangeInfo> changes = new List<IChangeInfo>();
         foreach (var layerGuid in layerGuids)
         {
-            var image = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
+            var image = target.FindMemberOrThrow<RasterLayer>(layerGuid).LayerImage;
             CommittedChunkStorage? originalChunks = originalLayerChunks[layerGuid];
             var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
             changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));

+ 4 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/CenterContent_Change.cs

@@ -66,9 +66,11 @@ internal class CenterContent_Change : Change
         
         foreach (var layerGuid in affectedLayers)
         {
-            Layer layer = target.FindMemberOrThrow<Layer>(layerGuid);
+            RasterLayer layer = target.FindMemberOrThrow<RasterLayer>(layerGuid);
             var chunks = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, false, shift);
             changes.Add(new LayerImageArea_ChangeInfo(layerGuid, chunks));
+
+            // TODO: Adding support for non-raster layer should be easy, add
             
             originalLayerChunks[layerGuid] = new CommittedChunkStorage(layer.LayerImage, layer.LayerImage.FindAffectedArea().Chunks);
             layer.LayerImage.CommitChanges();
@@ -83,7 +85,7 @@ internal class CenterContent_Change : Change
         List<IChangeInfo> changes = new List<IChangeInfo>();
         foreach (var layerGuid in affectedLayers)
         {
-            var image = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
+            var image = target.FindMemberOrThrow<RasterLayer>(layerGuid).LayerImage;
             CommittedChunkStorage? originalChunks = originalLayerChunks?[layerGuid];
             var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
             changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs

@@ -15,7 +15,7 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
         {
             if (member is Layer layer)
             {
-                var layerBounds = layer.LayerImage.FindTightCommittedBounds();
+                var layerBounds = layer.GetTightBounds();
                 if (layerBounds.HasValue)
                 {
                     bounds ??= layerBounds.Value;
@@ -38,7 +38,7 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
         
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 Resize(layer.LayerImage, layer.GuidValue, newBounds.Size, -newBounds.Pos, deletedChunks);
             }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs

@@ -32,7 +32,7 @@ internal class Crop_Change : ResizeBasedChangeBase
 
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 Resize(layer.LayerImage, layer.GuidValue, rect.Size, rect.Pos * -1, deletedChunks);
             }

+ 2 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs

@@ -99,13 +99,14 @@ internal sealed class FlipImage_Change : Change
         {
             if (membersToFlip.Count == 0 || membersToFlip.Contains(member.GuidValue))
             {
-                if (member is Layer layer)
+                if (member is RasterLayer layer)
                 {
                     FlipImage(layer.LayerImage);
                     changes.Add(
                         new LayerImageArea_ChangeInfo(member.GuidValue, layer.LayerImage.FindAffectedArea()));
                     layer.LayerImage.CommitChanges();
                 }
+                // TODO: Add support for non-raster layers
 
                 if (member.Mask is not null)
                 {

+ 3 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeBasedChangeBase.cs

@@ -37,12 +37,14 @@ internal abstract class ResizeBasedChangeBase : Change
         target.Size = _originalSize;
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 layer.LayerImage.EnqueueResize(_originalSize);
                 deletedChunks[layer.GuidValue].ApplyChunksToImage(layer.LayerImage);
                 layer.LayerImage.CommitChanges();
             }
+
+            // TODO: Add support for different Layer types?
             
             if (member.Mask is null)
                 return;

+ 4 - 1
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeCanvas_Change.cs

@@ -40,10 +40,13 @@ internal class ResizeCanvas_Change : ResizeBasedChangeBase
 
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 Resize(layer.LayerImage, layer.GuidValue, newSize, offset, deletedChunks);
             }
+
+            // TODO: Check if adding support for different Layer types is necessary
+
             if (member.Mask is null)
                 return;
 

+ 5 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeImage_Change.cs

@@ -88,13 +88,16 @@ internal class ResizeImage_Change : Change
 
         target.ForEveryMember(member =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 ScaleChunkyImage(layer.LayerImage);
                 var affected = layer.LayerImage.FindAffectedArea();
                 savedChunks[layer.GuidValue] = new CommittedChunkStorage(layer.LayerImage, affected.Chunks);
                 layer.LayerImage.CommitChanges();
             }
+
+            // Add support for different Layer types
+
             if (member.Mask is not null)
             {
                 ScaleChunkyImage(member.Mask);
@@ -113,7 +116,7 @@ internal class ResizeImage_Change : Change
         target.Size = originalSize;
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 layer.LayerImage.EnqueueResize(originalSize);
                 layer.LayerImage.EnqueueClear();

+ 5 - 3
src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs

@@ -139,11 +139,13 @@ internal sealed class RotateImage_Change : Change
         {
             if (guids.Contains(member.GuidValue))
             {
-                if (member is Layer layer)
+                if (member is RasterLayer layer)
                 {
                     Resize(layer.LayerImage, layer.GuidValue, deletedChunks, changes);
                 }
 
+                // TODO: Add support for different Layer types
+
                 if (member.Mask is null)
                     return;
 
@@ -170,7 +172,7 @@ internal sealed class RotateImage_Change : Change
 
         target.ForEveryMember((member) =>
         {
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 Resize(layer.LayerImage, layer.GuidValue, deletedChunks, null);
             }
@@ -211,7 +213,7 @@ internal sealed class RotateImage_Change : Change
         target.ForEveryMember((member) =>
         {
             if(membersToRotate.Count > 0 && !membersToRotate.Contains(member.GuidValue)) return;
-            if (member is Layer layer)
+            if (member is RasterLayer layer)
             {
                 layer.LayerImage.EnqueueResize(originalSize);
                 deletedChunks[layer.GuidValue].ApplyChunksToImage(layer.LayerImage);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Structure/ApplyMask_Change.cs

@@ -27,7 +27,7 @@ internal sealed class ApplyMask_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        var layer = (Layer)target.FindMember(structureMemberGuid)!;
+        var layer = target.FindMemberOrThrow<RasterLayer>(structureMemberGuid)!;
         layer!.LayerImage.EnqueueApplyMask(layer.Mask!);
         ignoreInUndo = false;
         var layerInfo = new LayerImageArea_ChangeInfo(structureMemberGuid, layer.LayerImage.FindAffectedArea());

+ 3 - 3
src/PixiEditor.ChangeableDocument/Rendering/ChunkRenderer.cs

@@ -76,7 +76,7 @@ public static class ChunkRenderer
             targetChunk.Surface.DrawingSurface.Canvas.ClipRect((RectD)transformedClippingRect);
         }
 
-        if (!layer.LayerImage.DrawMostUpToDateChunkOn(chunkPos, resolution, renderingResult.Surface.DrawingSurface, VecI.Zero, context.ReplacingPaintWithOpacity))
+        if (!layer.Rasterize().DrawMostUpToDateChunkOn(chunkPos, resolution, renderingResult.Surface.DrawingSurface, VecI.Zero, context.ReplacingPaintWithOpacity))
         {
             renderingResult.Dispose();
             return new EmptyChunk();
@@ -126,7 +126,7 @@ public static class ChunkRenderer
             targetChunk.Surface.DrawingSurface.Canvas.Save();
             targetChunk.Surface.DrawingSurface.Canvas.ClipRect((RectD)transformedClippingRect);
         }
-        if (!layer.LayerImage.DrawMostUpToDateChunkOn(chunkPos, resolution, renderingResult.Surface.DrawingSurface, VecI.Zero, context.ReplacingPaintWithOpacity))
+        if (!layer.Rasterize().DrawMostUpToDateChunkOn(chunkPos, resolution, renderingResult.Surface.DrawingSurface, VecI.Zero, context.ReplacingPaintWithOpacity))
         {
             renderingResult.Dispose();
             return new EmptyChunk();
@@ -177,7 +177,7 @@ public static class ChunkRenderer
             targetChunk.Surface.DrawingSurface.Canvas.Save();
             targetChunk.Surface.DrawingSurface.Canvas.ClipRect((RectD)transformedClippingRect);
         }
-        layer.LayerImage.DrawMostUpToDateChunkOn(chunkPos, resolution, targetChunk.Surface.DrawingSurface, VecI.Zero, context.BlendModeOpacityPaint);
+        layer.Rasterize().DrawMostUpToDateChunkOn(chunkPos, resolution, targetChunk.Surface.DrawingSurface, VecI.Zero, context.BlendModeOpacityPaint);
         if (transformedClippingRect is not null)
             targetChunk.Surface.DrawingSurface.Canvas.Restore();
     }