Browse Source

Fix mask deletion crash

Equbuxu 2 years ago
parent
commit
3147a88c83

+ 12 - 4
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -23,6 +23,8 @@ using ChunkyImageLib.Operations;
 namespace PixiEditor.Models.Rendering;
 internal class MemberPreviewUpdater
 {
+    private const float smoothingThreshold = 1.5f;
+
     private readonly DocumentViewModel doc;
     private readonly DocumentInternalParts internals;
 
@@ -32,10 +34,9 @@ internal class MemberPreviewUpdater
     private Dictionary<Guid, AffectedArea> mainPreviewAreasAccumulator = new();
     private Dictionary<Guid, AffectedArea> maskPreviewAreasAccumulator = new();
 
-    private const float smoothingThreshold = 1.5f;
     private static readonly Paint SmoothReplacingPaint = new() { BlendMode = BlendMode.Src, FilterQuality = FilterQuality.Medium, IsAntiAliased = true };
     private static readonly Paint ReplacingPaint = new() { BlendMode = BlendMode.Src };
-    private static readonly Paint ClearPaint = new() { BlendMode = BlendMode.Src, Color = PixiEditor.DrawingApi.Core.ColorsImpl.Colors.Transparent };
+    private static readonly Paint ClearPaint = new() { BlendMode = BlendMode.Src, Color = DrawingApi.Core.ColorsImpl.Colors.Transparent };
 
     public MemberPreviewUpdater(DocumentViewModel doc, DocumentInternalParts internals)
     {
@@ -175,6 +176,12 @@ internal class MemberPreviewUpdater
             if (member is null)
                 continue;
 
+            if (forMasks && member.Mask is null)
+            {
+                newPreviewBitmapSizes.Add(guid, null);
+                continue;
+            }
+
             RectI? tightBounds = GetOrFindMemberTightBounds(member, area, forMasks);
             RectI? maybeLastBounds = targetLastBounds.TryGetValue(guid, out RectI lastBounds) ? lastBounds : null;
             if (tightBounds == maybeLastBounds)
@@ -214,7 +221,7 @@ internal class MemberPreviewUpdater
             {
                 if (member.PreviewBitmap is not null && member.PreviewBitmap.PixelWidth == newSize.Value.previewSize.X && member.PreviewBitmap.PixelHeight == newSize.Value.previewSize.Y)
                 {
-                    member.PreviewSurface.Canvas.Clear();
+                    member.PreviewSurface!.Canvas.Clear();
                 }
                 else
                 {
@@ -272,6 +279,7 @@ internal class MemberPreviewUpdater
         {
             IReadOnlyLayer layer => FindLayerTightBounds(layer, forMask),
             IReadOnlyFolder folder => FindFolderTightBounds(folder, forMask),
+            _ => throw new ArgumentOutOfRangeException()
         };
     }
 
@@ -283,7 +291,7 @@ internal class MemberPreviewUpdater
         if (layer.Mask is null && forMask)
             throw new InvalidOperationException();
 
-        IReadOnlyChunkyImage targetImage = forMask ? layer.Mask : layer.LayerImage;
+        IReadOnlyChunkyImage targetImage = forMask ? layer.Mask! : layer.LayerImage;
         return FindImageTightBounds(targetImage);
     }
 

+ 2 - 2
src/PixiEditor/ViewModels/SubViewModels/Document/StructureMemberViewModel.cs

@@ -138,8 +138,8 @@ internal abstract class StructureMemberViewModel : INotifyPropertyChanged
     public StructureMemberSelectionType Selection { get; set; }
 
     public const int PreviewSize = 48;
-    public WriteableBitmap PreviewBitmap { get; set; }
-    public DrawingSurface PreviewSurface { get; set; }
+    public WriteableBitmap? PreviewBitmap { get; set; }
+    public DrawingSurface? PreviewSurface { get; set; }
 
     public WriteableBitmap? MaskPreviewBitmap { get; set; }
     public DrawingSurface? MaskPreviewSurface { get; set; }