diff --git a/DOM/Sources/DOM.SVG.swift b/DOM/Sources/DOM.SVG.swift index 0f152c7..9fd3877 100644 --- a/DOM/Sources/DOM.SVG.swift +++ b/DOM/Sources/DOM.SVG.swift @@ -80,9 +80,14 @@ package extension DOM { package var childElements = [GraphicsElement]() } - struct Mask: ContainerElement { - package var id: String + final class Mask: GraphicsElement, ContainerElement { package var childElements = [GraphicsElement]() + + init(id: String, childElements: [GraphicsElement] = []) { + super.init() + self.id = id + self.childElements = childElements + } } struct StyleSheet { diff --git a/DOM/Sources/Parser.XML.SVG.swift b/DOM/Sources/Parser.XML.SVG.swift index 5c75323..2a57a36 100644 --- a/DOM/Sources/Parser.XML.SVG.swift +++ b/DOM/Sources/Parser.XML.SVG.swift @@ -176,8 +176,12 @@ package extension XMLParser { let att = try parseAttributes(e) let id: String = try att.parseString("id") - let children = try parseGraphicsElements(e.children) - return DOM.Mask(id: id, childElements: children) + let mask = DOM.Mask(id: id) + mask.class = try att.parseString("class") + mask.attributes = try parsePresentationAttributes(e) + mask.style = try parseStyleAttributes(e) + mask.childElements = try parseGraphicsElements(e.children) + return mask } func parsePatterns(_ e: XML.Element) throws -> [DOM.Pattern] { diff --git a/Samples.bundle/robin.svg b/Samples.bundle/robin.svg new file mode 100644 index 0000000..b767088 --- /dev/null +++ b/Samples.bundle/robin.svg @@ -0,0 +1,29 @@ + + + Bank Logos/robinhood + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SwiftDraw/Sources/LayerTree/LayerTree.Builder.swift b/SwiftDraw/Sources/LayerTree/LayerTree.Builder.swift index 530e421..ad8c852 100644 --- a/SwiftDraw/Sources/LayerTree/LayerTree.Builder.swift +++ b/SwiftDraw/Sources/LayerTree/LayerTree.Builder.swift @@ -190,8 +190,9 @@ extension LayerTree { let l = Layer() + let maskState = createState(for: mask, inheriting: State()) mask.childElements.forEach { - let contents = Layer.Contents.layer(makeLayer(from: $0, inheriting: State())) + let contents = Layer.Contents.layer(makeLayer(from: $0, inheriting: maskState)) l.appendContents(contents) } diff --git a/SwiftDraw/Tests/LayerTree/LayerTree.BuilderTests.swift b/SwiftDraw/Tests/LayerTree/LayerTree.BuilderTests.swift index 4c0bc78..fdc64f5 100644 --- a/SwiftDraw/Tests/LayerTree/LayerTree.BuilderTests.swift +++ b/SwiftDraw/Tests/LayerTree/LayerTree.BuilderTests.swift @@ -54,17 +54,20 @@ final class LayerTreeBuilderTests: XCTestCase { func testDOMMaskMakesLayer() { let circle = DOM.Circle(cx: 5, cy: 5, r: 5) let line = DOM.Line(x1: 0, y1: 0, x2: 10, y2: 0) + let mask = DOM.Mask(id: "mask1", childElements: [circle, line]) + mask.attributes.fill = .color(.keyword(.white)) + let svg = DOM.SVG(width: 10, height: 10) - svg.defs.masks.append(DOM.Mask(id: "mask1", childElements: [circle, line])) - + svg.defs.masks.append(mask) + let builder = LayerTree.Builder(svg: svg) let element = DOM.GraphicsElement() element.attributes.mask = URL(string: "#mask1") let layer = builder.createMaskLayer(for: element) - XCTAssertEqual(layer?.contents.count, 2) + XCTAssertEqual(layer?.contents[0].shape?.fill.fill, .color(.white)) } func testDOMClipMakesShape() { @@ -206,3 +209,10 @@ extension DOM.Group { return group } } + +private extension LayerTree.Layer.Contents { + var shape: (shape: LayerTree.Shape, stroke: LayerTree.StrokeAttributes, fill: LayerTree.FillAttributes)? { + guard case let .shape(shape, stroke, fill) = self else { return nil } + return (shape, stroke, fill) + } +}