@@ -215,7 +215,7 @@ extension LayerTree.Builder {
215215 }
216216 }
217217
218- func makeLinearGradient( for gradientId: URL ) -> LayerTree . Gradient ? {
218+ func makeLinearGradient( for gradientId: URL ) -> LayerTree . LinearGradient ? {
219219 guard let element = svg. defs. linearGradients. first ( where: { $0. id == gradientId. fragment } ) ,
220220 let gradient = makeGradient ( for: element) else {
221221 return nil
@@ -249,7 +249,7 @@ extension LayerTree.Builder {
249249 return pattern
250250 }
251251
252- func makeGradient( for element: DOM . LinearGradient ) -> LayerTree . Gradient ? {
252+ func makeGradient( for element: DOM . LinearGradient ) -> LayerTree . LinearGradient ? {
253253 guard
254254 let x1 = element. x1,
255255 let y1 = element. y1,
@@ -258,56 +258,52 @@ extension LayerTree.Builder {
258258 return nil
259259 }
260260
261- var gradient = LayerTree . Gradient ( start : Point ( x1 , y1 ) , end : Point ( x2 , y2 ) )
261+ var stops = [ LayerTree . Gradient. Stop ] ( )
262262 if let id = element. href? . fragment,
263263 let reference = svg. defs. linearGradients. first ( where: { $0. id == id } ) {
264- gradient . stops = makeGradientStops ( for: reference)
264+ stops = makeGradientStops ( for: reference)
265265 } else {
266- gradient . stops = makeGradientStops ( for: element)
266+ stops = makeGradientStops ( for: element)
267267 }
268-
269- if element. gradientUnits == . userSpaceOnUse {
270- gradient. units = . userSpaceOnUse
271- }
272-
273- gradient. transform = Self . createTransforms ( from: element. gradientTransform)
274-
275- guard gradient. stops. count > 1 else {
268+ guard stops. count > 1 else {
276269 return nil
277270 }
278271
272+ var gradient = LayerTree . LinearGradient (
273+ gradient: . init( stops: stops) ,
274+ start: Point ( x1, y1) ,
275+ end: Point ( x2, y2)
276+ )
277+
278+ gradient. units = Self . createUnits ( from: element. gradientUnits)
279+ gradient. transform = Self . createTransforms ( from: element. gradientTransform)
279280 return gradient
280281 }
281282
282283 func makeGradient( for element: DOM . RadialGradient ) -> LayerTree . RadialGradient ? {
283- var gradient = LayerTree . Gradient ( start : Point ( 0 , 0 ) , end : Point ( 1 , 1 ) )
284+ var stops = [ LayerTree . Gradient. Stop ] ( )
284285 if let id = element. href? . fragment,
285- let reference = svg. defs. linearGradients . first ( where: { $0. id == id } ) {
286- gradient . stops = makeGradientStops ( for: reference)
286+ let reference = svg. defs. radialGradients . first ( where: { $0. id == id } ) {
287+ stops = makeGradientStops ( for: reference)
287288 } else {
288- gradient. stops = makeGradientStops ( for: element)
289- }
290-
291- if element. gradientUnits == . userSpaceOnUse {
292- gradient. units = . userSpaceOnUse
289+ stops = makeGradientStops ( for: element)
293290 }
294-
295- gradient. transform = Self . createTransforms ( from: element. gradientTransform)
296-
297- guard gradient. stops. count > 1 else {
291+ guard stops. count > 1 else {
298292 return nil
299293 }
300294
301295 let cx = element. cx ?? 0.5
302296 let cy = element. cy ?? 0.5
303-
304- return LayerTree . RadialGradient (
305- gradient: gradient,
297+ var gradient = LayerTree . RadialGradient (
298+ gradient: . init( stops: stops) ,
306299 center: LayerTree . Point ( element. fx ?? cx, element. fy ?? cy) ,
307300 radius: LayerTree . Float ( element. fr ?? 0 ) ,
308301 endCenter: LayerTree . Point ( cx, cy) ,
309302 endRadius: LayerTree . Float ( element. r ?? 0.5 )
310303 )
304+ gradient. units = Self . createUnits ( from: element. gradientUnits)
305+ gradient. transform = Self . createTransforms ( from: element. gradientTransform)
306+ return gradient
311307 }
312308
313309 func makeGradientStops( for element: DOM . LinearGradient ) -> [ LayerTree . Gradient . Stop ] {
@@ -437,6 +433,18 @@ extension LayerTree.Builder {
437433 }
438434 }
439435
436+ static func createUnits( from units: DOM . LinearGradient . Units ? ) -> LayerTree . Gradient . Units {
437+ guard let units = units else {
438+ return . objectBoundingBox
439+ }
440+ switch units {
441+ case . objectBoundingBox:
442+ return . objectBoundingBox
443+ case . userSpaceOnUse:
444+ return . userSpaceOnUse
445+ }
446+ }
447+
440448 static func createTransforms( from transforms: [ DOM . Transform ] ) -> [ LayerTree . Transform ] {
441449 return transforms. flatMap { createTransform ( for: $0) }
442450 }
0 commit comments