@@ -91,47 +91,60 @@ extension LayerTree {
9191 return transform
9292 }
9393
94- func makeLayer( from element: DOM . GraphicsElement , inheriting previousState: State ) -> Layer {
94+ func makeLayer( from root: DOM . GraphicsElement , inheriting previousState: State ) -> Layer {
95+ var stack : [ ( DOM . GraphicsElement , State , Layer ? ) ] = [ ( root, previousState, nil ) ]
96+ var resultLayer : Layer ? = nil
97+
98+ while let ( currentElement, currentState, parentLayer) = stack. popLast ( ) {
99+ let ( layer, newState) = makeBaseLayer ( from: currentElement, inheriting: currentState)
100+
101+ if let contents = makeContents ( from: currentElement, with: newState) {
102+ layer. appendContents ( contents)
103+ } else if let container = currentElement as? ContainerElement {
104+ // Push children in reverse so they are processed in the original order
105+ for child in container. childElements. reversed ( ) {
106+ stack. append ( ( child, newState, layer) )
107+ }
108+ }
109+
110+ if let parent = parentLayer {
111+ parent. appendContents ( . layer( layer) )
112+
113+ if let svg = currentElement as? DOM . SVG {
114+ let viewBox = svg. viewBox ?? DOM . SVG. ViewBox ( x: 0 , y: 0 , width: . init( svg. width) , height: . init( svg. height) )
115+ let bounds = LayerTree . Rect ( x: viewBox. x, y: viewBox. y, width: viewBox. width, height: viewBox. height)
116+ layer. clip = [ ClipShape ( shape: . rect( within: bounds, radii: . zero) , transform: . identity) ]
117+ layer. transform = Builder . makeTransform (
118+ x: svg. x,
119+ y: svg. y,
120+ viewBox: svg. viewBox,
121+ width: svg. width,
122+ height: svg. height
123+ )
124+ }
125+ } else {
126+ // This must be the top-level root layer
127+ resultLayer = layer
128+ }
129+ }
130+
131+ return resultLayer!
132+ }
133+
134+ func makeBaseLayer( from element: DOM . GraphicsElement , inheriting previousState: State ) -> ( Layer , State ) {
95135 let state = createState ( for: element, inheriting: previousState)
96136 let attributes = element. attributes
97137 let l = Layer ( )
98138 l. class = element. class
99- guard state. display != . none else { return l }
139+ guard state. display != . none else { return ( l , state ) }
100140
101141 l. transform = Builder . createTransforms ( from: attributes. transform ?? [ ] )
102142 l. clip = makeClipShapes ( for: element)
103143 l. clipRule = attributes. clipRule
104144 l. mask = createMaskLayer ( for: element)
105145 l. opacity = state. opacity
106- l. contents = makeAllContents ( from: element, with: state)
107146 l. filters = makeFilters ( for: state)
108- return l
109- }
110-
111- func makeChildLayer( from element: DOM . GraphicsElement , inheriting previousState: State ) -> Layer {
112- if let svg = element as? DOM . SVG {
113- let layer = makeLayer ( svg: svg, inheriting: previousState)
114- let viewBox = svg. viewBox ?? DOM . SVG. ViewBox ( x: 0 , y: 0 , width: . init( svg. width) , height: . init( svg. height) )
115- let bounds = LayerTree . Rect ( x: viewBox. x, y: viewBox. y, width: viewBox. width, height: viewBox. height)
116- layer. clip = [ ClipShape ( shape: . rect( within: bounds, radii: . zero) , transform: . identity) ]
117- return layer
118- } else {
119- return makeLayer ( from: element, inheriting: previousState)
120- }
121- }
122-
123- func makeAllContents( from element: DOM . GraphicsElement , with state: State ) -> [ Layer . Contents ] {
124- var all = [ Layer . Contents] ( )
125- if let contents = makeContents ( from: element, with: state) {
126- all. append ( contents)
127- }
128- else if let container = element as? ContainerElement {
129- container. childElements. forEach {
130- let contents = Layer . Contents. layer ( makeChildLayer ( from: $0, inheriting: state) )
131- all. append ( contents)
132- }
133- }
134- return all
147+ return ( l, state)
135148 }
136149
137150 func makeContents( from element: DOM . GraphicsElement , with state: State ) -> Layer . Contents ? {
0 commit comments