Browse Source

Line improvements

Krzysztof Krysiński 4 months ago
parent
commit
8b97006a5d

+ 20 - 8
src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawRasterLine_UpdateableChange.cs

@@ -22,7 +22,8 @@ internal class DrawRasterLine_UpdateableChange : UpdateableChange
 
     [GenerateUpdateableChangeActions]
     public DrawRasterLine_UpdateableChange
-        (Guid memberGuid, VecD from, VecD to, float strokeWidth, Paintable paintable, StrokeCap caps, bool antiAliasing, bool drawOnMask, int frame)
+    (Guid memberGuid, VecD from, VecD to, float strokeWidth, Paintable paintable, StrokeCap caps, bool antiAliasing,
+        bool drawOnMask, int frame)
     {
         this.memberGuid = memberGuid;
         this.from = from;
@@ -34,8 +35,10 @@ internal class DrawRasterLine_UpdateableChange : UpdateableChange
         this.frame = frame;
         this.antiAliasing = antiAliasing;
 
-        paint = new Paint() {
-            StrokeWidth = strokeWidth, StrokeCap = caps, IsAntiAliased = antiAliasing, BlendMode = BlendMode.SrcOver };
+        paint = new Paint()
+        {
+            StrokeWidth = strokeWidth, StrokeCap = caps, IsAntiAliased = antiAliasing, BlendMode = BlendMode.SrcOver
+        };
         paint.SetPaintable(paintable);
     }
 
@@ -47,7 +50,7 @@ internal class DrawRasterLine_UpdateableChange : UpdateableChange
         this.paintable = paintable;
         this.caps = caps;
         this.strokeWidth = strokeWidth;
-        
+
         paint.SetPaintable(paintable);
         paint.StrokeWidth = strokeWidth;
         paint.StrokeCap = caps;
@@ -66,15 +69,23 @@ internal class DrawRasterLine_UpdateableChange : UpdateableChange
         if (from != to)
         {
             DrawingChangeHelper.ApplyClipsSymmetriesEtc(target, image, memberGuid, drawOnMask);
-            if (Math.Abs(strokeWidth - 1) < 0.01f && !antiAliasing)
+            if (strokeWidth == 0)
             {
-                image.EnqueueDrawBresenhamLine((VecI)from, (VecI)to, paintable, BlendMode.SrcOver);
+                image.CancelChanges();
             }
             else
             {
-                image.EnqueueDrawSkiaLine(from, to, paint);
+                if (Math.Abs(strokeWidth - 1) < 0.01f && !antiAliasing)
+                {
+                    image.EnqueueDrawBresenhamLine((VecI)from, (VecI)to, paintable, BlendMode.SrcOver);
+                }
+                else
+                {
+                    image.EnqueueDrawSkiaLine(from, to, paint);
+                }
             }
         }
+
         var totalAffected = image.FindAffectedArea();
         totalAffected.UnionWith(oldAffected);
         return totalAffected;
@@ -85,7 +96,8 @@ internal class DrawRasterLine_UpdateableChange : UpdateableChange
         return DrawingChangeHelper.CreateAreaChangeInfo(memberGuid, CommonApply(target), drawOnMask);
     }
 
-    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
+        out bool ignoreInUndo)
     {
         if (from == to)
         {

+ 4 - 2
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -91,6 +91,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
                 return ExecutionState.Success;
             }
 
+            toolbar.StrokeBrush = data.Stroke.ToBrush();
+
             if (!InitShapeData(data))
             {
                 ActiveMode = ShapeToolMode.Preview;
@@ -192,8 +194,8 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
         var moveOverlayAction = TransformOverlayMoved(start, end);
         internals!.ActionAccumulator.AddActions(moveOverlayAction);
 
-        startDrawingPos = (VecI)start;
-        curPos = (VecI)end;
+        startDrawingPos = start;
+        curPos = end;
     }
 
     public override void OnColorChanged(Color color, bool primary)

+ 16 - 29
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/RasterLineToolExecutor.cs

@@ -19,46 +19,33 @@ internal class RasterLineToolExecutor : LineExecutor<ILineToolHandler>
 
     protected override IAction DrawLine(VecD pos)
     {
-        VecD dir = GetSignedDirection(startDrawingPos, pos);
-        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
-        return new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos, oppositeDir), ToPixelPos(pos, dir), (float)StrokeWidth,
-            StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+        return new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos), ToPixelPos(pos),
+            (float)StrokeWidth,
+            StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask,
+            document!.AnimationHandler.ActiveFrameBindable);
     }
 
     protected override IAction TransformOverlayMoved(VecD start, VecD end)
     {
-        VecD dir = GetSignedDirection(start, end);
-        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
-        return new DrawRasterLine_Action(memberId, ToPixelPos(start, oppositeDir), ToPixelPos(end, dir), 
-            (float)StrokeWidth, StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask, document!.AnimationHandler.ActiveFrameBindable);
+        return new DrawRasterLine_Action(memberId, ToPixelPos(start), ToPixelPos(end),
+            (float)StrokeWidth, StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask,
+            document!.AnimationHandler.ActiveFrameBindable);
     }
 
     protected override IAction[] SettingsChange(string name, object value)
     {
-        VecD dir = GetSignedDirection(startDrawingPos, curPos);
-        VecD oppositeDir = new VecD(-dir.X, -dir.Y);
-        return [new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos, oppositeDir), ToPixelPos(curPos, dir), (float)StrokeWidth,
-            StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask, document!.AnimationHandler.ActiveFrameBindable)];
+        return
+        [
+            new DrawRasterLine_Action(memberId, ToPixelPos(startDrawingPos), ToPixelPos(curPos),
+                (float)StrokeWidth,
+                StrokePaintable, StrokeCap.Butt, toolbar.AntiAliasing, drawOnMask,
+                document!.AnimationHandler.ActiveFrameBindable)
+        ];
     }
 
-    private VecI ToPixelPos(VecD pos, VecD dir)
+    private VecD ToPixelPos(VecD pos)
     {
-        if (StrokeWidth > 1) return (VecI)pos.Round();
-        
-        double xAdjustment = dir.X > 0 ? 0.5 : -0.5;
-        double yAdjustment = dir.Y > 0 ? 0.5 : -0.5;
-        
-        VecD adjustment = new VecD(xAdjustment, yAdjustment);
-
-        
-        VecI finalPos = (VecI)(pos - adjustment);
-
-        return finalPos;
-    }
-    
-    private VecD GetSignedDirection(VecD start, VecD end)
-    {
-        return new VecD(Math.Sign(end.X - start.X), Math.Sign(end.Y - start.Y));
+        return (VecD)pos;
     }
 
     protected override IAction EndDraw()

+ 13 - 3
src/PixiEditor/Views/Overlays/LineToolOverlay/LineToolOverlay.cs

@@ -167,6 +167,7 @@ internal class LineToolOverlay : Overlay
         {
             SnappingController.HighlightedXAxis = null;
             SnappingController.HighlightedYAxis = null;
+            SnappingController.HighlightedPoint = null;
             Refresh();
         }
 
@@ -273,6 +274,7 @@ internal class LineToolOverlay : Overlay
 
             SnappingController.HighlightedXAxis = snapAxisX;
             SnappingController.HighlightedYAxis = snapAxisY;
+            SnappingController.HighlightedPoint = x != null || y != null ? final : null;
         }
 
         return final;
@@ -294,12 +296,13 @@ internal class LineToolOverlay : Overlay
         VecD mappedStart = lineStartOnMouseDown;
         VecD mappedEnd = lineEndOnMouseDown;
 
-        ((string, string), VecD) snapDeltaResult = TrySnapLine(mappedStart, mappedEnd, delta);
+        ((string, string), VecD) snapDeltaResult = TrySnapLine(mappedStart, mappedEnd, delta, out VecD? snapSource);
 
         if (SnappingController != null)
         {
             SnappingController.HighlightedXAxis = snapDeltaResult.Item1.Item1;
             SnappingController.HighlightedYAxis = snapDeltaResult.Item1.Item2;
+            SnappingController.HighlightedPoint = snapSource;
         }
 
         LineStart = lineStartOnMouseDown + delta + snapDeltaResult.Item2;
@@ -319,10 +322,11 @@ internal class LineToolOverlay : Overlay
             ActionCompleted.Execute(null);
     }
 
-    private ((string, string), VecD) TrySnapLine(VecD originalStart, VecD originalEnd, VecD delta)
+    private ((string, string), VecD) TrySnapLine(VecD originalStart, VecD originalEnd, VecD delta, out VecD? snapSource)
     {
         if (SnappingController == null)
         {
+            snapSource = null;
             return ((string.Empty, string.Empty), delta);
         }
 
@@ -330,7 +334,13 @@ internal class LineToolOverlay : Overlay
         VecD[] pointsToTest = new VecD[] { center + delta, originalStart + delta, originalEnd + delta, };
 
         VecD snapDelta =
-            SnappingController.GetSnapDeltaForPoints(pointsToTest, out string snapAxisX, out string snapAxisY, out _);
+            SnappingController.GetSnapDeltaForPoints(pointsToTest, out string snapAxisX, out string snapAxisY,
+                out snapSource);
+
+        if (snapSource != null)
+        {
+            snapSource += snapDelta;
+        }
 
         return ((snapAxisX, snapAxisY), snapDelta);
     }