Browse Source

Fixed LineTool with thickness 1

flabbet 3 years ago
parent
commit
0cc2a0cc8f
1 changed files with 92 additions and 2 deletions
  1. 92 2
      PixiEditor/Models/Tools/Tools/LineTool.cs

+ 92 - 2
PixiEditor/Models/Tools/Tools/LineTool.cs

@@ -79,9 +79,99 @@ namespace PixiEditor.Models.Tools.Tools
             paint.Color = color;
             paint.BlendMode = blendMode;
             paint.StrokeCap = strokeCap;
-            layer.LayerBitmap.SkiaSurface.Canvas.DrawLine(x, y, x1, y1, paint);
+
+            if (thickness == 1)
+            {
+                BresenhamLine(layer, x, y, x1, y1, paint);
+            }
+            else
+            {
+                layer.LayerBitmap.SkiaSurface.Canvas.DrawLine(x, y, x1, y1, paint);
+            }
 
             layer.InvokeLayerBitmapChange(dirtyRect);
         }
+
+        private void BresenhamLine(Layer layer, int x1, int y1, int x2, int y2, SKPaint paint)
+        {
+            if (x1 == x2 && y1 == y2)
+            {
+                layer.LayerBitmap.SkiaSurface.Canvas.DrawPoint(x1, y1, paint);
+            }
+
+            int d, dx, dy, ai, bi, xi, yi;
+            int x = x1, y = y1;
+
+            if (x1 < x2)
+            {
+                xi = 1;
+                dx = x2 - x1;
+            }
+            else
+            {
+                xi = -1;
+                dx = x1 - x2;
+            }
+
+            if (y1 < y2)
+            {
+                yi = 1;
+                dy = y2 - y1;
+            }
+            else
+            {
+                yi = -1;
+                dy = y1 - y2;
+            }
+
+            layer.LayerBitmap.SkiaSurface.Canvas.DrawPoint(x, y, paint);
+
+            if (dx > dy)
+            {
+                ai = (dy - dx) * 2;
+                bi = dy * 2;
+                d = bi - dx;
+
+                while (x != x2)
+                {
+                    if (d >= 0)
+                    {
+                        x += xi;
+                        y += yi;
+                        d += ai;
+                    }
+                    else
+                    {
+                        d += bi;
+                        x += xi;
+                    }
+
+                    layer.LayerBitmap.SkiaSurface.Canvas.DrawPoint(x, y, paint);
+                }
+            }
+            else
+            {
+                ai = (dx - dy) * 2;
+                bi = dx * 2;
+                d = bi - dy;
+
+                while (y != y2)
+                {
+                    if (d >= 0)
+                    {
+                        x += xi;
+                        y += yi;
+                        d += ai;
+                    }
+                    else
+                    {
+                        d += bi;
+                        y += yi;
+                    }
+
+                    layer.LayerBitmap.SkiaSurface.Canvas.DrawPoint(x, y, paint);
+                }
+            }
+        }
     }
-}
+}