From 37a82f82ad63e337da0defc02ad78940b0c22366 Mon Sep 17 00:00:00 2001 From: Pg Gonni <59372630+sekeidesign@users.noreply.github.com> Date: Tue, 8 Oct 2024 21:33:18 -0400 Subject: [PATCH 1/3] Add trimTo and trimFrom to SVGPath --- Source/Model/Nodes/SVGNode.swift | 8 +++++++- Source/Model/Shapes/SVGPath.swift | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/Model/Nodes/SVGNode.swift b/Source/Model/Nodes/SVGNode.swift index fecfd06..e898c13 100644 --- a/Source/Model/Nodes/SVGNode.swift +++ b/Source/Model/Nodes/SVGNode.swift @@ -9,16 +9,20 @@ public class SVGNode: SerializableElement { @Published public var clip: SVGNode? @Published public var mask: SVGNode? @Published public var id: String? + @Published public var trimFrom: Double = 0 + @Published public var trimTo: Double = 0 var gestures = [AnyGesture<()>]() - public init(transform: CGAffineTransform = .identity, opaque: Bool = true, opacity: Double = 1, clip: SVGNode? = nil, mask: SVGNode? = nil, id: String? = nil) { + public init(transform: CGAffineTransform = .identity, opaque: Bool = true, opacity: Double = 1, clip: SVGNode? = nil, mask: SVGNode? = nil, id: String? = nil, trimFrom: Double = 0, trimTo: Double = 1) { self.transform = transform self.opaque = opaque self.opacity = opacity self.clip = clip self.mask = mask self.id = id + self.trimFrom = trimFrom + self.trimTo = trimTo } public func bounds() -> CGRect { @@ -56,6 +60,8 @@ public class SVGNode: SerializableElement { serializer.add("opacity", opacity, 1) serializer.add("opaque", opaque, true) serializer.add("clip", clip).add("mask", mask) + serializer.add("trimFrom", trimFrom) + serializer.add("trimTo", trimTo) } var typeName: String { diff --git a/Source/Model/Shapes/SVGPath.swift b/Source/Model/Shapes/SVGPath.swift index a37e15a..3c2c82c 100644 --- a/Source/Model/Shapes/SVGPath.swift +++ b/Source/Model/Shapes/SVGPath.swift @@ -46,6 +46,7 @@ extension MBezierPath { let isGradient = model.fill is SVGGradient let bounds = isGradient ? model.bounds() : CGRect.zero return Path(self.cgPath) + .trim(from: model.trimFrom, to: model.trimTo) .applySVGStroke(stroke: model.stroke, eoFill: eoFill) .applyShapeAttributes(model: model) .applyIf(isGradient) { From ce96b06030d34b402049fba41a92f09d3b4e7ad3 Mon Sep 17 00:00:00 2001 From: Pg Gonni <59372630+sekeidesign@users.noreply.github.com> Date: Wed, 9 Oct 2024 07:12:24 -0400 Subject: [PATCH 2/3] Remove double instantiation --- Source/Model/Nodes/SVGNode.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Model/Nodes/SVGNode.swift b/Source/Model/Nodes/SVGNode.swift index e898c13..c09ae97 100644 --- a/Source/Model/Nodes/SVGNode.swift +++ b/Source/Model/Nodes/SVGNode.swift @@ -9,8 +9,8 @@ public class SVGNode: SerializableElement { @Published public var clip: SVGNode? @Published public var mask: SVGNode? @Published public var id: String? - @Published public var trimFrom: Double = 0 - @Published public var trimTo: Double = 0 + @Published public var trimFrom: Double + @Published public var trimTo: Double var gestures = [AnyGesture<()>]() From adbee448187b1dc8e2f68ae672ad3137349df1ea Mon Sep 17 00:00:00 2001 From: Pg Gonni <59372630+sekeidesign@users.noreply.github.com> Date: Sun, 13 Oct 2024 08:55:31 -0400 Subject: [PATCH 3/3] Add path stroke controls --- Source/Model/Nodes/SVGNode.swift | 5 ++++- Source/Model/Shapes/SVGPath.swift | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Source/Model/Nodes/SVGNode.swift b/Source/Model/Nodes/SVGNode.swift index c09ae97..b7dcac9 100644 --- a/Source/Model/Nodes/SVGNode.swift +++ b/Source/Model/Nodes/SVGNode.swift @@ -11,10 +11,11 @@ public class SVGNode: SerializableElement { @Published public var id: String? @Published public var trimFrom: Double @Published public var trimTo: Double + @Published public var pathStroke: SVGStroke? var gestures = [AnyGesture<()>]() - public init(transform: CGAffineTransform = .identity, opaque: Bool = true, opacity: Double = 1, clip: SVGNode? = nil, mask: SVGNode? = nil, id: String? = nil, trimFrom: Double = 0, trimTo: Double = 1) { + public init(transform: CGAffineTransform = .identity, opaque: Bool = true, opacity: Double = 1, clip: SVGNode? = nil, mask: SVGNode? = nil, id: String? = nil, trimFrom: Double = 0, trimTo: Double = 1, pathStroke: SVGStroke? = nil) { self.transform = transform self.opaque = opaque self.opacity = opacity @@ -23,6 +24,7 @@ public class SVGNode: SerializableElement { self.id = id self.trimFrom = trimFrom self.trimTo = trimTo + self.pathStroke = pathStroke } public func bounds() -> CGRect { @@ -62,6 +64,7 @@ public class SVGNode: SerializableElement { serializer.add("clip", clip).add("mask", mask) serializer.add("trimFrom", trimFrom) serializer.add("trimTo", trimTo) + serializer.add("pathStroke", pathStroke) } var typeName: String { diff --git a/Source/Model/Shapes/SVGPath.swift b/Source/Model/Shapes/SVGPath.swift index 3c2c82c..66b26ac 100644 --- a/Source/Model/Shapes/SVGPath.swift +++ b/Source/Model/Shapes/SVGPath.swift @@ -47,7 +47,7 @@ extension MBezierPath { let bounds = isGradient ? model.bounds() : CGRect.zero return Path(self.cgPath) .trim(from: model.trimFrom, to: model.trimTo) - .applySVGStroke(stroke: model.stroke, eoFill: eoFill) + .applySVGStroke(stroke: model.pathStroke ?? model.stroke, eoFill: eoFill) .applyShapeAttributes(model: model) .applyIf(isGradient) { $0.frame(width: bounds.width, height: bounds.height)