Skip to content

Commit 9df5bfe

Browse files
committed
Deprecate Insets
1 parent a43bfea commit 9df5bfe

File tree

6 files changed

+156
-246
lines changed

6 files changed

+156
-246
lines changed

SwiftDraw/NSImage+Image.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public extension NSImage {
7272
}
7373

7474
public extension SVG {
75+
7576
func rasterize() -> NSImage {
7677
return rasterize(with: size)
7778
}
@@ -91,8 +92,9 @@ public extension SVG {
9192
return image
9293
}
9394

94-
func pngData(size: CGSize? = nil, scale: CGFloat = 0, insets: Insets = .zero) throws -> Data {
95-
let (bounds, pixelsWide, pixelsHigh) = makeBounds(size: size, scale: scale, insets: insets)
95+
func pngData(scale: CGFloat = 0) throws -> Data {
96+
let scale = scale == 0 ? SVG.defaultScale : scale
97+
let (bounds, pixelsWide, pixelsHigh) = Self.makeBounds(size: size, scale: scale)
9698
guard let bitmap = makeBitmap(width: pixelsWide, height: pixelsHigh, isOpaque: false),
9799
let ctx = NSGraphicsContext(bitmapImageRep: bitmap)?.cgContext else {
98100
throw Error("Failed to create CGContext")
@@ -108,8 +110,9 @@ public extension SVG {
108110
return data
109111
}
110112

111-
func jpegData(size: CGSize? = nil, scale: CGFloat = 0, compressionQuality quality: CGFloat = 1, insets: Insets = .zero) throws -> Data {
112-
let (bounds, pixelsWide, pixelsHigh) = makeBounds(size: size, scale: scale, insets: insets)
113+
func jpegData(scale: CGFloat = 0, compressionQuality quality: CGFloat = 1) throws -> Data {
114+
let scale = scale == 0 ? SVG.defaultScale : scale
115+
let (bounds, pixelsWide, pixelsHigh) = Self.makeBounds(size: size, scale: scale)
113116
guard let bitmap = makeBitmap(width: pixelsWide, height: pixelsHigh, isOpaque: true),
114117
let ctx = NSGraphicsContext(bitmapImageRep: bitmap)?.cgContext else {
115118
throw Error("Failed to create CGContext")
@@ -127,6 +130,10 @@ public extension SVG {
127130
return data
128131
}
129132

133+
internal static var defaultScale: CGFloat {
134+
NSScreen.main?.backingScaleFactor ?? 1.0
135+
}
136+
130137
private struct Error: LocalizedError {
131138
var errorDescription: String?
132139

@@ -138,11 +145,6 @@ public extension SVG {
138145

139146
extension SVG {
140147

141-
func makeBounds(size: CGSize?, scale: CGFloat, insets: Insets) -> (bounds: CGRect, pixelsWide: Int, pixelsHigh: Int) {
142-
let scale = scale == 0 ? (NSScreen.main?.backingScaleFactor ?? 1.0) : scale
143-
return Self.makeBounds(size: size, defaultSize: self.size, scale: scale, insets: insets)
144-
}
145-
146148
func makeBitmap(width: Int, height: Int, isOpaque: Bool) -> NSBitmapImageRep? {
147149
guard width > 0 && height > 0 else { return nil }
148150
return NSBitmapImageRep(

SwiftDraw/SVG+CoreGraphics.swift

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ public extension CGContext {
5555

5656
public extension SVG {
5757

58-
func pdfData(size: CGSize? = nil, insets: Insets = .zero) throws -> Data {
59-
let (bounds, pixelsWide, pixelsHigh) = makeBounds(size: size, scale: 1, insets: insets)
58+
func pdfData() throws -> Data {
59+
let (bounds, pixelsWide, pixelsHigh) = Self.makeBounds(size: size, scale: 1)
6060
var mediaBox = CGRect(x: 0.0, y: 0.0, width: CGFloat(pixelsWide), height: CGFloat(pixelsHigh))
6161

6262
let data = NSMutableData()
@@ -86,31 +86,18 @@ public extension SVG {
8686

8787
extension SVG {
8888

89-
static func makeBounds(size: CGSize?,
90-
defaultSize: CGSize,
91-
scale: CGFloat,
92-
insets: Insets) -> (bounds: CGRect, pixelsWide: Int, pixelsHigh: Int) {
93-
let viewport = CGSize(
94-
width: defaultSize.width - (insets.left + insets.right),
95-
height: defaultSize.height - (insets.top + insets.bottom)
89+
static func makeBounds(size: CGSize, scale: CGFloat) -> (bounds: CGRect, pixelsWide: Int, pixelsHigh: Int) {
90+
let bounds = CGRect(
91+
x: 0,
92+
y: 0,
93+
width: size.width * scale,
94+
height: size.height * scale
9695
)
9796

98-
let size = size ?? viewport
99-
100-
let sx = size.width / viewport.width
101-
let sy = size.height / viewport.height
102-
103-
let width = size.width * scale
104-
let height = size.height * scale
105-
let insets = insets.applying(sx: sx * scale, sy: sy * scale)
106-
let bounds = CGRect(x: -insets.left,
107-
y: -insets.top,
108-
width: width + insets.left + insets.right,
109-
height: height + insets.top + insets.bottom)
11097
return (
11198
bounds: bounds,
112-
pixelsWide: Int(width),
113-
pixelsHigh: Int(height)
99+
pixelsWide: Int(exactly: ceil(bounds.width)) ?? 0,
100+
pixelsHigh: Int(exactly: ceil(bounds.height)) ?? 0
114101
)
115102
}
116103
}

SwiftDraw/SVG+Deprecated.swift

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//
2+
// SVG+Deprecated.swift
3+
// SwiftDraw
4+
//
5+
// Created by Simon Whitty on 23/2/25.
6+
// Copyright 2025 Simon Whitty
7+
//
8+
// Distributed under the permissive zlib license
9+
// Get the latest version from here:
10+
//
11+
// https://github.com/swhitty/SwiftDraw
12+
//
13+
// This software is provided 'as-is', without any express or implied
14+
// warranty. In no event will the authors be held liable for any damages
15+
// arising from the use of this software.
16+
//
17+
// Permission is granted to anyone to use this software for any purpose,
18+
// including commercial applications, and to alter it and redistribute it
19+
// freely, subject to the following restrictions:
20+
//
21+
// 1. The origin of this software must not be misrepresented; you must not
22+
// claim that you wrote the original software. If you use this software
23+
// in a product, an acknowledgment in the product documentation would be
24+
// appreciated but is not required.
25+
//
26+
// 2. Altered source versions must be plainly marked as such, and must not be
27+
// misrepresented as being the original software.
28+
//
29+
// 3. This notice may not be removed or altered from any source distribution.
30+
//
31+
32+
#if canImport(CoreGraphics)
33+
import CoreGraphics
34+
import Foundation
35+
36+
#if canImport(UIKit)
37+
import UIKit
38+
#endif
39+
40+
public extension SVG {
41+
42+
@available(*, deprecated, message: "add insets via SVG.expand() before pngData")
43+
func pngData(scale: CGFloat = 0, insets: Insets) throws -> Data {
44+
try inset(insets).pngData(scale: scale)
45+
}
46+
47+
@available(*, deprecated, message: "set size via SVG.size() before pngData")
48+
func pngData(size: CGSize, scale: CGFloat = 0) throws -> Data {
49+
try self.size(size).pngData(scale: scale)
50+
}
51+
52+
@available(*, deprecated, message: "add insets via SVG.expand() before jpegData")
53+
func jpegData(scale: CGFloat = 0, compressionQuality quality: CGFloat = 1, insets: Insets) throws -> Data {
54+
try inset(insets).jpegData(scale: scale, compressionQuality: quality)
55+
}
56+
57+
@available(*, deprecated, message: "set size via SVG.size() before jpegData")
58+
func jpegData(size: CGSize, scale: CGFloat = 0, compressionQuality quality: CGFloat = 1) throws -> Data {
59+
try self.size(size).jpegData(scale: scale, compressionQuality: quality)
60+
}
61+
62+
private func inset(_ insets: Insets) -> SVG {
63+
expand(top: -insets.top, left: -insets.left, bottom: -insets.bottom, right: -insets.right)
64+
}
65+
66+
#if canImport(UIKit)
67+
@available(*, deprecated, message: "add insets via SVG.expand() before rasterize()")
68+
func rasterize(scale: CGFloat = 0, insets: UIEdgeInsets) -> UIImage {
69+
inset(insets).rasterize(scale: scale)
70+
}
71+
72+
@available(*, deprecated, message: "add insets via SVG.expand() before pngData()")
73+
func pngData(scale: CGFloat = 0, insets: UIEdgeInsets) throws -> Data {
74+
try inset(insets).pngData(scale: scale)
75+
}
76+
77+
@available(*, deprecated, message: "add insets via SVG.expand() before jpegData()")
78+
func jpegData(scale: CGFloat = 0, compressionQuality quality: CGFloat = 1, insets: UIEdgeInsets) throws -> Data {
79+
try inset(insets).jpegData(scale: scale, compressionQuality: quality)
80+
}
81+
82+
private func inset(_ insets: UIEdgeInsets) -> SVG {
83+
expand(top: -insets.top, left: -insets.left, bottom: -insets.bottom, right: -insets.right)
84+
}
85+
#endif
86+
87+
}
88+
#endif

SwiftDraw/UIImage+Image.swift

Lines changed: 14 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,11 @@ public extension UIImage {
7171
}
7272

7373
public extension SVG {
74-
func rasterize() -> UIImage {
75-
return rasterize(with: size)
76-
}
7774

7875
#if os(watchOS)
79-
func rasterize(with size: CGSize? = nil, scale: CGFloat = 0, insets: UIEdgeInsets = .zero) -> UIImage {
80-
let insets = Insets(top: insets.top, left: insets.left, bottom: insets.bottom, right: insets.right)
81-
let (bounds, pixelsWide, pixelsHigh) = makeBounds(size: size, scale: 1, insets: insets)
82-
83-
let actualScale = scale <= 0 ? WKInterfaceDevice.current().screenScale : scale
76+
func rasterize(scale: CGFloat = 0) -> UIImage {
77+
let (bounds, pixelsWide, pixelsHigh) = SVG.makeBounds(size: size, scale: 1)
78+
let actualScale = scale <= 0 ? SVG.defaultScale : scale
8479
UIGraphicsBeginImageContextWithOptions(CGSize(width: pixelsWide, height: pixelsHigh), false, actualScale)
8580
defer { UIGraphicsEndImageContext() }
8681

@@ -91,40 +86,29 @@ public extension SVG {
9186
return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
9287
}
9388
#else
94-
private func makeFormat() -> UIGraphicsImageRendererFormat {
95-
guard #available(iOS 12.0, *) else {
96-
let f = UIGraphicsImageRendererFormat.default()
97-
f.prefersExtendedRange = true
98-
return f
99-
}
89+
func rasterize(scale: CGFloat = 0) -> UIImage {
90+
let (bounds, pixelsWide, pixelsHigh) = SVG.makeBounds(size: size, scale: 1)
10091
let f = UIGraphicsImageRendererFormat.preferred()
10192
f.preferredRange = .automatic
102-
return f
103-
}
104-
105-
func rasterize(with size: CGSize? = nil, scale: CGFloat = 0, insets: UIEdgeInsets = .zero) -> UIImage {
106-
let insets = Insets(top: insets.top, left: insets.left, bottom: insets.bottom, right: insets.right)
107-
let (bounds, pixelsWide, pixelsHigh) = makeBounds(size: size, scale: 1, insets: insets)
108-
let f = makeFormat()
109-
f.scale = scale <= 0 ? UIScreen.main.scale : scale
93+
f.scale = scale <= 0 ? SVG.defaultScale : scale
11094
f.opaque = false
11195
let r = UIGraphicsImageRenderer(size: CGSize(width: pixelsWide, height: pixelsHigh), format: f)
112-
return r.image{
96+
return r.image {
11397
$0.cgContext.draw(self, in: bounds)
11498
}
11599
}
116100
#endif
117101

118-
func pngData(size: CGSize? = nil, scale: CGFloat = 0, insets: UIEdgeInsets = .zero) throws -> Data {
119-
let image = rasterize(with: size, scale: scale, insets: insets)
102+
func pngData(scale: CGFloat = 0) throws -> Data {
103+
let image = rasterize(scale: scale)
120104
guard let data = image.pngData() else {
121105
throw Error("Failed to create png data")
122106
}
123107
return data
124108
}
125109

126-
func jpegData(size: CGSize? = nil, scale: CGFloat = 0, compressionQuality quality: CGFloat = 1, insets: UIEdgeInsets = .zero) throws -> Data {
127-
let image = rasterize(with: size, scale: scale, insets: insets)
110+
func jpegData(scale: CGFloat = 0, compressionQuality quality: CGFloat = 1) throws -> Data {
111+
let image = rasterize(scale: scale)
128112
guard let data = image.jpegData(compressionQuality: quality) else {
129113
throw Error("Failed to create jpeg data")
130114
}
@@ -134,25 +118,12 @@ public extension SVG {
134118

135119
extension SVG {
136120

137-
func jpegData(size: CGSize?, scale: CGFloat, insets: Insets) throws -> Data {
138-
let insets = UIEdgeInsets(top: insets.top, left: insets.left, bottom: insets.bottom, right: insets.right)
139-
return try jpegData(size: size, scale: scale, insets: insets)
140-
}
141-
142-
func pngData(size: CGSize?, scale: CGFloat, insets: Insets) throws -> Data {
143-
let insets = UIEdgeInsets(top: insets.top, left: insets.left, bottom: insets.bottom, right: insets.right)
144-
return try pngData(size: size, scale: scale, insets: insets)
145-
}
146-
147-
func makeBounds(size: CGSize?, scale: CGFloat, insets: Insets) -> (bounds: CGRect, pixelsWide: Int, pixelsHigh: Int) {
148-
let newScale: CGFloat = {
121+
static var defaultScale: CGFloat {
149122
#if os(watchOS)
150-
return scale <= 0 ? WKInterfaceDevice.current().screenScale : scale
123+
WKInterfaceDevice.current().screenScale
151124
#else
152-
return scale <= 0 ? UIScreen.main.scale : scale
125+
UIScreen.main.scale
153126
#endif
154-
}()
155-
return Self.makeBounds(size: size, defaultSize: self.size, scale: newScale, insets: insets)
156127
}
157128

158129
private struct Error: LocalizedError {

0 commit comments

Comments
 (0)