Browse Source

Changed chunk check to position check

Krzysztof Krysiński 2 years ago
parent
commit
a436c7c0b8

+ 11 - 8
src/PixiEditor.ChangeableDocument/Changes/Drawing/FloodFill/FloodFillHelper.cs

@@ -239,7 +239,7 @@ public static class FloodFillHelper
         ColorBounds colorRange = new(colorToReplace);
 
         HashSet<VecI> processedEmptyChunks = new();
-        HashSet<VecI> processedChunks = new();
+        HashSet<VecI> processedPositions = new();
         Stack<(VecI chunkPos, VecI posOnChunk)> positionsToFloodFill = new();
         positionsToFloodFill.Push((initChunkPos, initPosOnChunk));
 
@@ -275,10 +275,12 @@ public static class FloodFillHelper
 
             // use regular flood fill for chunks that have something in them
             var reallyReferenceChunk = referenceChunk.AsT0;
-            if(processedChunks.Contains(chunkPos))
-                continue;
             
+            VecI globalPos = chunkPos * chunkSize + posOnChunk;
             
+            if(processedPositions.Contains(globalPos))
+                continue;
+
             var maybeArray = GetChunkFloodFill(
                 reallyReferenceChunk,
                 chunkSize,
@@ -288,18 +290,18 @@ public static class FloodFillHelper
                 colorRange, lines);
             
 
-            processedChunks.Add(chunkPos);
+            processedPositions.Add(globalPos);
             if (maybeArray is null)
                 continue;
             for (int i = 0; i < chunkSize; i++)
             {
-                if (chunkPos.Y > 0 && maybeArray[i] == Visited)
+                if (chunkPos.Y > 0 && maybeArray[i] == Visited) // Top
                     positionsToFloodFill.Push((new(chunkPos.X, chunkPos.Y - 1), new(i, chunkSize - 1)));
-                if (chunkPos.Y < imageSizeInChunks.Y - 1 && maybeArray[chunkSize * (chunkSize - 1) + i] == Visited)
+                if (chunkPos.Y < imageSizeInChunks.Y - 1 && maybeArray[chunkSize * (chunkSize - 1) + i] == Visited) // Bottom
                     positionsToFloodFill.Push((new(chunkPos.X, chunkPos.Y + 1), new(i, 0)));
-                if (chunkPos.X > 0 && maybeArray[i * chunkSize] == Visited)
+                if (chunkPos.X > 0 && maybeArray[i * chunkSize] == Visited) // Left
                     positionsToFloodFill.Push((new(chunkPos.X - 1, chunkPos.Y), new(chunkSize - 1, i)));
-                if (chunkPos.X < imageSizeInChunks.X - 1 && maybeArray[i * chunkSize + (chunkSize - 1)] == Visited)
+                if (chunkPos.X < imageSizeInChunks.X - 1 && maybeArray[i * chunkSize + (chunkSize - 1)] == Visited) // Right
                     positionsToFloodFill.Push((new(chunkPos.X + 1, chunkPos.Y), new(0, i)));
             }
         }
@@ -398,6 +400,7 @@ public static class FloodFillHelper
             i--;
         }
         
+        selection.MoveTo(startingLine.End);
         selection.Close();
         return selection;
     }