Browse Source

Crash prevention

flabbet 2 years ago
parent
commit
35c91cac4a

+ 6 - 6
src/PixiEditor.ChangeableDocument/Changes/Selection/MagicWand/MagicWandHelper.cs

@@ -152,7 +152,7 @@ internal class MagicWandHelper
             var reallyReferenceChunk = referenceChunk.AsT0;
 
             VecI globalPos = chunkPos * chunkSize + posOnChunk;
-            visualizer.CurrentContext = $"FloodFill_{chunkPos}";
+            //visualizer.CurrentContext = $"FloodFill_{chunkPos}";
             var maybeArray = AddLinesForChunkViaFloodFill(
                 reallyReferenceChunk,
                 chunkSize,
@@ -171,14 +171,14 @@ internal class MagicWandHelper
             selection = BuildContour(lines);
         }
 
-        visualizer.GenerateVisualization(document.Size.X, document.Size.Y, 500, 500);
+        //visualizer.GenerateVisualization(document.Size.X, document.Size.Y, 500, 500);
 
         return selection;
     }
 
     private static void AddLinesForEmptyChunk(Lines lines, VecI chunkPos, VecI imageSize, int chunkSize)
     {
-        visualizer.CurrentContext = "EmptyChunk";
+        //visualizer.CurrentContext = "EmptyChunk";
 
         RectI chunkRect = new RectI(chunkPos * chunkSize, new(chunkSize));
         chunkRect = chunkRect.Intersect(new RectI(VecI.Zero, imageSize));
@@ -274,7 +274,7 @@ internal class MagicWandHelper
 
             pixelVisitedStates[pixelOffset] = true;
 
-            visualizer.CurrentContext = "AddFillContourLines";
+            //visualizer.CurrentContext = "AddFillContourLines";
             AddFillContourLines(chunkSize, chunkOffset, bounds, lines, curPos, pixelVisitedStates, pixelOffset, refPixel, toVisit, globalPos, documentSize);
         }
 
@@ -440,12 +440,12 @@ internal class MagicWandHelper
             if (LineDicts[-line.NormalizedDirection].ContainsKey(line.End))
             {
                 LineDicts[-line.NormalizedDirection].Remove(line.End);
-                visualizer.Steps.Add(new Step(line, StepType.CancelLine));
+                //visualizer.Steps.Add(new Step(line, StepType.CancelLine));
                 return;
             }
 
             LineDicts[line.NormalizedDirection][line.Start] = line;
-            visualizer.Steps.Add(new Step(line));
+            //visualizer.Steps.Add(new Step(line));
         }
 
         public IEnumerator<Line> GetEnumerator()

+ 4 - 2
src/PixiEditor/Helpers/DocumentViewModelBuilder.cs

@@ -181,7 +181,7 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
                 throw new InvalidOperationException("You must first set the width and height of the layer. You can do this by calling WithRect() or setting the Width and Height properties.");
             }
             
-            var surfaceBuilder = new SurfaceBuilder(new Surface(new VecI(Width, Height)));
+            var surfaceBuilder = new SurfaceBuilder(new Surface(new VecI(Math.Max(Width, 1), Math.Max(Height, 1))));
             surface(surfaceBuilder);
             Surface = surfaceBuilder;
             return this;
@@ -226,6 +226,8 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         
         public SurfaceBuilder WithImage(ReadOnlySpan<byte> buffer, int x, int y)
         {
+            if(buffer.IsEmpty) return this;
+            
             Surface.DrawingSurface.Canvas.DrawBitmap(Bitmap.Decode(buffer), 0, 0);
             return this;
         }
@@ -256,7 +258,7 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         
         public MaskBuilder WithSurface(int width, int height, Action<SurfaceBuilder> surface)
         {
-            var surfaceBuilder = new SurfaceBuilder(new Surface(new VecI(width, height)));
+            var surfaceBuilder = new SurfaceBuilder(new Surface(new VecI(Math.Max(width, 1), Math.Max(height, 1))));
             surface(surfaceBuilder);
             Surface = surfaceBuilder;
             return this;

+ 17 - 9
src/PixiEditor/Helpers/Extensions/PixiParserDocumentEx.cs

@@ -28,7 +28,10 @@ internal static class PixiParserDocumentEx
                 }
                 else if (member is ImageLayer layer)
                 {
-                    builder.WithLayer(x => BuildLayer(x, layer));
+                    /*if (layer.Height > 0 && layer.Width > 0)
+                    {*/
+                        builder.WithLayer(x => BuildLayer(x, layer));
+                    //}
                 }
                 else
                 {
@@ -45,13 +48,18 @@ internal static class PixiParserDocumentEx
             .WithChildren(x => BuildChildren(x, folder.Children))
             .WithMask(folder.Mask, (x, m) => x.WithVisibility(m.Enabled).WithSurface(m.Width, m.Height, x => x.WithImage(m.ImageBytes, m.OffsetX, m.OffsetY)));
 
-        void BuildLayer(DocumentViewModelBuilder.LayerBuilder builder, ImageLayer layer) => builder
-            .WithName(layer.Name)
-            .WithVisibility(layer.Enabled)
-            .WithOpacity(layer.Opacity)
-            .WithBlendMode((PixiEditor.ChangeableDocument.Enums.BlendMode)(int)layer.BlendMode)
-            .WithSize(layer.Width, layer.Height)
-            .WithSurface(x => x.WithImage(layer.ImageBytes, layer.OffsetX, layer.OffsetY))
-            .WithMask(layer.Mask, (x, m) => x.WithVisibility(m.Enabled).WithSurface(m.Width, m.Height, x => x.WithImage(m.ImageBytes, m.OffsetX, m.OffsetY)));
+        void BuildLayer(DocumentViewModelBuilder.LayerBuilder builder, ImageLayer layer)
+        {
+            builder
+                .WithName(layer.Name)
+                .WithVisibility(layer.Enabled)
+                .WithOpacity(layer.Opacity)
+                .WithBlendMode((PixiEditor.ChangeableDocument.Enums.BlendMode)(int)layer.BlendMode)
+                .WithSize(layer.Width, layer.Height)
+                .WithSurface(x => x.WithImage(layer.ImageBytes, layer.OffsetX, layer.OffsetY))
+                .WithMask(layer.Mask,
+                    (x, m) => x.WithVisibility(m.Enabled).WithSurface(m.Width, m.Height,
+                        x => x.WithImage(m.ImageBytes, m.OffsetX, m.OffsetY)));
+        }
     }
 }