public void FloodArea(int x, int y, Color colorToSet, Color colorClickedOn) { Dictionary <Tuple <int, int>, bool> PosDone = new Dictionary <Tuple <int, int>, bool>(); Queue <Pixel> PixelStack = new Queue <Pixel>(); PixelStack.Enqueue(new Pixel() { Color = colorClickedOn, X = x, Y = y }); while (PixelStack.Count > 0) { var pixel = PixelStack.Dequeue(); x = pixel.X; y = pixel.Y; var key = new Tuple <int, int>(x, y); if (x < 0 || y < 0 || y > DrawingImageHeight - 1 || x > DrawingImageWidth - 1 || PosDone.ContainsKey(key)) { continue; } PosDone[key] = true; var color = UnlockedBitmap.GetPixel(x, y); // DrawingImage.GetPixel(x, y); if (color.A == 0) { color = Color.Transparent; } if (color == colorClickedOn) { UnlockedBitmap.SetPixel(x, y, colorToSet); } else { continue; } PixelStack.Enqueue(new Pixel() { Color = color, X = x - 1, Y = y }); PixelStack.Enqueue(new Pixel() { Color = color, X = x, Y = y - 1 }); PixelStack.Enqueue(new Pixel() { Color = color, X = x, Y = y + 1 }); PixelStack.Enqueue(new Pixel() { Color = color, X = x + 1, Y = y }); } }
public void DrawPixel(int X, int Y, MouseButtons button, bool DelayRefresh = false) { Color foreColor = GetCurrentColor(button); var scale = (decimal)(Zoom / 100.0f); var x = (int)(X / scale); var y = (int)(Y / scale); if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (x >= DrawingImageWidth) { x = DrawingImageWidth - 1; } if (y >= DrawingImageHeight) { y = DrawingImageHeight - 1; } if (ColorModeActive == ColorMode.Blend && ((OpacityPen != 0 && OpacityPen != 255) || (foreColor.A != 0 && foreColor.A != 255))) { var ColorA = (foreColor.A != 0 && foreColor.A != 255) ? foreColor : Color.FromArgb(OpacityPen, foreColor); var ColorB = UnlockedBitmap.GetPixel(x, y); if (ColorB == Color.Transparent || ColorB == NoColor) { UnlockedBitmap.SetPixel(x, y, ColorA); } else { UnlockedBitmap.SetPixel(x, y, Merge(x, y, ColorA, ColorB)); } } else { if (OpacityPen != 255) { UnlockedBitmap.SetPixel(x, y, Color.FromArgb(OpacityPen, foreColor)); } else { UnlockedBitmap.SetPixel(x, y, foreColor); } } if (!DelayRefresh) { fastDraw1.Refresh(); } }