@@ -42,13 +42,18 @@ public extension CGContext {
4242 renderer. perform ( image. commands)
4343 return
4444 }
45-
46- let sx = rect. width / image. size. width
47- let sy = rect. height / image. size. height
45+
46+ let scale = CGSize ( width: rect. width / image. size. width,
47+ height: rect. height / image. size. height)
48+ draw ( image. commands, in: rect, scale: scale)
49+ }
50+
51+ fileprivate func draw( _ commands: [ RendererCommand < CGTypes > ] , in rect: CGRect , scale: CGSize = CGSize ( width: 1.0 , height: 1.0 ) ) {
52+ let renderer = CGRenderer ( context: self )
4853 saveGState ( )
4954 translateBy ( x: rect. origin. x, y: rect. origin. y)
50- scaleBy ( x: sx , y: sy )
51- renderer. perform ( image . commands)
55+ scaleBy ( x: scale . width , y: scale . height )
56+ renderer. perform ( commands)
5257 restoreGState ( )
5358 }
5459}
@@ -73,4 +78,30 @@ public extension Image {
7378
7479 return data as Data
7580 }
81+
82+ static func pdfData( fileURL url: URL ) throws -> Data {
83+ let svg = try DOM . SVG. parse ( fileURL: url)
84+ let layer = LayerTree . Builder ( svg: svg) . makeLayer ( )
85+ var mediaBox = CGRect ( x: 0 , y: 0 , width: CGFloat ( svg. width) , height: CGFloat ( svg. height) )
86+ let generator = LayerTree . CommandGenerator ( provider: CGProvider ( supportsTransparencyLayers: false ) ,
87+ size: LayerTree . Size ( svg. width, svg. height) )
88+ let commands = generator. renderCommands ( for: layer)
89+ let data = NSMutableData ( )
90+ guard let consumer = CGDataConsumer ( data: data as CFMutableData ) else { throw Error . unknown }
91+
92+ guard let ctx = CGContext ( consumer: consumer, mediaBox: & mediaBox, nil ) else { throw Error . unknown }
93+
94+ ctx. beginPage ( mediaBox: & mediaBox)
95+ let flip = CGAffineTransform ( a: 1 , b: 0 , c: 0 , d: - 1 , tx: 0 , ty: mediaBox. size. height)
96+ ctx. concatenate ( flip)
97+ ctx. draw ( commands, in: mediaBox)
98+ ctx. endPage ( )
99+ ctx. closePDF ( )
100+
101+ return data as Data
102+ }
103+
104+ private enum Error : Swift . Error {
105+ case unknown
106+ }
76107}
0 commit comments