Skip to content

Commit 29bb3a5

Browse files
committed
Create new node instead of changing the old one
Fix
1 parent a247dc9 commit 29bb3a5

4 files changed

Lines changed: 49 additions & 9 deletions

File tree

Source/model/scene/SceneUtils.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,32 @@ class SceneUtils {
3131

3232
return shape
3333
}
34+
35+
static func copyNode(_ referenceNode: Node) -> Node? {
36+
let pos = referenceNode.place
37+
let opaque = referenceNode.opaque
38+
let visible = referenceNode.visible
39+
let clip = referenceNode.clip
40+
let tag = referenceNode.tag
41+
42+
if let shape = referenceNode as? Shape {
43+
return Shape(form: shape.form, fill: shape.fill, stroke: shape.stroke, place: pos, opaque: opaque, clip: clip, visible: visible, tag: tag)
44+
}
45+
if let text = referenceNode as? Text {
46+
return Text(text: text.text, font: text.font, fill: text.fill, stroke: text.stroke, align: text.align, baseline: text.baseline, place: pos, opaque: opaque, clip: clip, visible: visible, tag: tag)
47+
}
48+
if let image = referenceNode as? Image {
49+
return Image(src: image.src, xAlign: image.xAlign, yAlign: image.yAlign, aspectRatio: image.aspectRatio, w: image.w, h: image.h, place: pos, opaque: opaque, clip: clip, visible: visible, tag: tag)
50+
}
51+
if let group = referenceNode as? Group {
52+
var contents = [Node]()
53+
group.contents.forEach { node in
54+
if let copy = copyNode(node) {
55+
contents.append(copy)
56+
}
57+
}
58+
return Group(contents: contents, place: pos, opaque: opaque, clip: clip, visible: visible, tag: tag)
59+
}
60+
return .none
61+
}
3462
}

Source/render/ShapeRenderer.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,11 @@ class ShapeRenderer: NodeRenderer {
175175
guard let shape = shape else {
176176
return
177177
}
178-
if !pattern.userSpace {
179-
BoundsUtils.applyTransformToNodeInRespectiveCoords(respectiveNode: pattern.content, absoluteLocus: shape.form)
178+
var patternNode = pattern.content
179+
if !pattern.userSpace, let node = BoundsUtils.createNodeFromRespectiveCoords(respectiveNode: pattern.content, absoluteLocus: shape.form) {
180+
patternNode = node
180181
}
181-
let renderer = RenderUtils.createNodeRenderer(pattern.content, view: view, animationCache: animationCache)
182+
let renderer = RenderUtils.createNodeRenderer(patternNode, view: view, animationCache: animationCache)
182183

183184
var patternBounds = pattern.bounds
184185
if !pattern.userSpace {

Source/svg/SVGParser.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,9 @@ open class SVGParser {
644644
return Pattern(content: pattern.content, bounds: pattern.bounds.applying(tranform), userSpace: true)
645645
}
646646
if pattern.userSpace == true && pattern.contentUserSpace == false {
647-
BoundsUtils.applyTransformToNodeInRespectiveCoords(respectiveNode: pattern.content, absoluteLocus: locus!)
648-
return Pattern(content: pattern.content, bounds: pattern.bounds, userSpace: pattern.userSpace)
647+
if let patternNode = BoundsUtils.createNodeFromRespectiveCoords(respectiveNode: pattern.content, absoluteLocus: locus!) {
648+
return Pattern(content: patternNode, bounds: pattern.bounds, userSpace: pattern.userSpace)
649+
}
649650
}
650651
return Pattern(content: pattern.content, bounds: pattern.bounds, userSpace: true)
651652
}

Source/utils/BoundsUtils.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,25 @@ final internal class BoundsUtils {
6262
return Transform.move(dx: absoluteBounds.x, dy: absoluteBounds.y).concat(with: scale)
6363
}
6464

65-
class func applyTransformToNodeInRespectiveCoords(respectiveNode: Node, absoluteLocus: Locus) {
66-
if let patternShape = respectiveNode as? Shape {
65+
class func createNodeFromRespectiveCoords(respectiveNode: Node, absoluteLocus: Locus) -> Node? {
66+
guard let copy = SceneUtils.copyNode(respectiveNode) else {
67+
return nil
68+
}
69+
70+
if let patternShape = copy as? Shape {
6771
let tranform = BoundsUtils.transformForLocusInRespectiveCoords(respectiveLocus: patternShape.form, absoluteLocus: absoluteLocus)
6872
patternShape.place = patternShape.place.concat(with: tranform)
6973
}
70-
if let patternGroup = respectiveNode as? Group {
74+
if let patternGroup = copy as? Group {
75+
var nodes = [Node]()
7176
for groupNode in patternGroup.contents {
72-
applyTransformToNodeInRespectiveCoords(respectiveNode: groupNode, absoluteLocus: absoluteLocus)
77+
if let node = createNodeFromRespectiveCoords(respectiveNode: groupNode, absoluteLocus: absoluteLocus) {
78+
nodes.append(node)
79+
}
7380
}
81+
patternGroup.contents = nodes
7482
}
83+
84+
return copy
7585
}
7686
}

0 commit comments

Comments
 (0)