@@ -34,19 +34,30 @@ import Foundation
3434
3535public struct SFSymbolRenderer {
3636
37+ private let size : SizeCategory
3738 private let options : SVG . Options
3839 private let insets : CommandLine . Insets
3940 private let insetsUltralight : CommandLine . Insets
4041 private let insetsBlack : CommandLine . Insets
4142 private let formatter : CoordinateFormatter
4243 private let isLegacyInsets : Bool
4344
44- public init ( options: SVG . Options ,
45- insets: CommandLine . Insets ,
46- insetsUltralight: CommandLine . Insets ,
47- insetsBlack: CommandLine . Insets ,
48- precision: Int ,
49- isLegacyInsets: Bool ) {
45+ public enum SizeCategory {
46+ case small
47+ case medium
48+ case large
49+ }
50+
51+ public init (
52+ size: SizeCategory ,
53+ options: SVG . Options ,
54+ insets: CommandLine . Insets ,
55+ insetsUltralight: CommandLine . Insets ,
56+ insetsBlack: CommandLine . Insets ,
57+ precision: Int ,
58+ isLegacyInsets: Bool
59+ ) {
60+ self . size = size
5061 self . options = options
5162 self . insets = insets
5263 self . insetsUltralight = insetsUltralight
@@ -94,6 +105,8 @@ public struct SFSymbolRenderer {
94105 template. black. appendPaths ( pathsRegular, from: bounds, isLegacy: isLegacyInsets)
95106 }
96107
108+ template. setSize ( size)
109+
97110 let element = try XML . Formatter. SVG ( formatter: formatter) . makeElement ( from: template. svg)
98111 let formatter = XML . Formatter ( spaces: 4 )
99112 let result = formatter. encodeRootElement ( element)
@@ -356,25 +369,36 @@ struct SFSymbolTemplate {
356369
357370 let svg : DOM . SVG
358371
372+ var typeReference : DOM . Path
359373 var ultralight : Variant
360374 var regular : Variant
361375 var black : Variant
362376
363377 init ( svg: DOM . SVG ) throws {
364378 self . svg = svg
379+ self . typeReference = try svg. group ( id: " Guides " ) . path ( id: " H-reference " )
365380 self . ultralight = try Variant ( svg: svg, kind: " Ultralight " )
366381 self . regular = try Variant ( svg: svg, kind: " Regular " )
367382 self . black = try Variant ( svg: svg, kind: " Black " )
368383 }
369384
385+ mutating func setSize( _ size: SFSymbolRenderer . SizeCategory ) {
386+ typeReference. attributes. transform = [ . translate( tx: 0 , ty: size. yOffset) ]
387+ ultralight. setSize ( size)
388+ regular. setSize ( size)
389+ black. setSize ( size)
390+ }
391+
370392 struct Variant {
371393 var left : Guide
372394 var contents : Contents
373395 var right : Guide
396+ private var kind : String
374397
375398 init ( svg: DOM . SVG , kind: String ) throws {
376399 let guides = try svg. group ( id: " Guides " )
377400 let symbols = try svg. group ( id: " Symbols " )
401+ self . kind = kind
378402 self . left = try Guide ( guides. path ( id: " left-margin- \( kind) -S " ) )
379403 self . contents = try Contents ( symbols. group ( id: " \( kind) -S " ) )
380404 self . right = try Guide ( guides. path ( id: " right-margin- \( kind) -S " ) )
@@ -385,6 +409,15 @@ struct SFSymbolTemplate {
385409 let maxX = right. x
386410 return . init( x: minX, y: 76 , width: maxX - minX, height: 70 )
387411 }
412+
413+ mutating func setSize( _ size: SFSymbolRenderer . SizeCategory ) {
414+ left. setID ( " left-margin- \( kind) - \( size. name) " )
415+ left. y += size. yOffset
416+ contents. setID ( " \( kind) - \( size. name) " )
417+ contents. setTransform ( . translate( tx: 0 , ty: size. yOffset) )
418+ right. setID ( " right-margin- \( kind) - \( size. name) " )
419+ right. y += size. yOffset
420+ }
388421 }
389422
390423 struct Guide {
@@ -394,6 +427,10 @@ struct SFSymbolTemplate {
394427 self . path = path
395428 }
396429
430+ func setID( _ id: String ) {
431+ path. id = id
432+ }
433+
397434 var x : DOM . Float {
398435 get {
399436 guard case let . move( x, _, _) = path. segments [ 0 ] else {
@@ -408,6 +445,21 @@ struct SFSymbolTemplate {
408445 path. segments [ 0 ] = . move( x: newValue, y: y, space: space)
409446 }
410447 }
448+
449+ var y : DOM . Float {
450+ get {
451+ guard case let . move( _, y, _) = path. segments [ 0 ] else {
452+ fatalError ( )
453+ }
454+ return y
455+ }
456+ set {
457+ guard case let . move( x, _, space) = path. segments [ 0 ] else {
458+ fatalError ( )
459+ }
460+ path. segments [ 0 ] = . move( x: x, y: newValue, space: space)
461+ }
462+ }
411463 }
412464
413465 struct Contents {
@@ -417,6 +469,10 @@ struct SFSymbolTemplate {
417469 self . group = group
418470 }
419471
472+ func setID( _ id: String ) {
473+ group. id = id
474+ }
475+
420476 var paths : [ DOM . Path ] {
421477 get {
422478 group. childElements as! [ DOM . Path ]
@@ -425,6 +481,35 @@ struct SFSymbolTemplate {
425481 group. childElements = newValue
426482 }
427483 }
484+
485+ func setTransform( _ transform: DOM . Transform ) {
486+ group. attributes. transform = [ transform]
487+ }
488+ }
489+ }
490+
491+ extension SFSymbolRenderer . SizeCategory {
492+
493+ var name : String {
494+ switch self {
495+ case . small:
496+ return " S "
497+ case . medium:
498+ return " M "
499+ case . large:
500+ return " L "
501+ }
502+ }
503+
504+ var yOffset : Float {
505+ switch self {
506+ case . small:
507+ return 0
508+ case . medium:
509+ return 200
510+ case . large:
511+ return 400
512+ }
428513 }
429514}
430515
0 commit comments