Skip to content

Commit 5bda33c

Browse files
authored
Merge pull request #41 from swhitty/fix-image-size
Correctly handle image sizes
2 parents 2823463 + 040031e commit 5bda33c

16 files changed

+139
-59
lines changed

Examples/Basic.xcodeproj/project.pbxproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 52;
6+
objectVersion = 54;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -312,6 +312,7 @@
312312
CODE_SIGN_STYLE = Automatic;
313313
DEVELOPMENT_TEAM = C8TWBM2E6Q;
314314
INFOPLIST_FILE = Sources/Info.plist;
315+
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
315316
LD_RUNPATH_SEARCH_PATHS = (
316317
"$(inherited)",
317318
"@executable_path/Frameworks",
@@ -331,6 +332,7 @@
331332
CODE_SIGN_STYLE = Automatic;
332333
DEVELOPMENT_TEAM = C8TWBM2E6Q;
333334
INFOPLIST_FILE = Sources/Info.plist;
335+
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
334336
LD_RUNPATH_SEARCH_PATHS = (
335337
"$(inherited)",
336338
"@executable_path/Frameworks",

Examples/Sources/ViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ViewController: UIViewController {
6565

6666
override func loadView() {
6767
let imageView = UIImageView(frame: UIScreen.main.bounds)
68-
imageView.image = SVG(named: "gradient-stroke.svg", in: .samples)?.rasterize()
68+
imageView.image = SVG(named: "shapes.svg", in: .samples)?.rasterize()
6969
imageView.contentMode = .scaleAspectFit
7070
imageView.backgroundColor = .white
7171
self.view = imageView

Samples.bundle/base64-image.svg

Lines changed: 8 additions & 0 deletions
Loading

Samples.bundle/base64.svg

Lines changed: 3 additions & 2 deletions
Loading

SwiftDraw/DOM.Image.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,14 @@
3131
extension DOM {
3232
final class Image: GraphicsElement {
3333
var href: URL
34-
var width: Coordinate
35-
var height: Coordinate
36-
34+
var width: Coordinate?
35+
var height: Coordinate?
36+
3737
var x: Coordinate?
3838
var y: Coordinate?
3939

40-
init(href: URL, width: Coordinate, height: Coordinate) {
40+
init(href: URL) {
4141
self.href = href
42-
self.width = width
43-
self.height = height
4442
super.init()
4543
}
4644
}

SwiftDraw/LayerTree.Builder.Layer.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,15 @@ extension LayerTree.Builder {
7171
static func makeImageContents(from image: DOM.Image) throws -> LayerTree.Layer.Contents {
7272
guard
7373
let decoded = image.href.decodedData,
74-
let im = LayerTree.Image(mimeType: decoded.mimeType, data: decoded.data) else {
74+
var im = LayerTree.Image(mimeType: decoded.mimeType, data: decoded.data) else {
7575
throw LayerTree.Error.invalid("Cannot decode image")
7676
}
77+
78+
im.origin.x = LayerTree.Float(image.x ?? 0)
79+
im.origin.y = LayerTree.Float(image.y ?? 0)
80+
im.width = image.width.map { LayerTree.Float($0) }
81+
im.height = image.height.map { LayerTree.Float($0) }
82+
7783
return .image(im)
7884
}
7985
}

SwiftDraw/LayerTree.CommandGenerator.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,31 @@ extension LayerTree {
243243

244244
func renderCommands(for image: Image) -> [RendererCommand<P.Types>] {
245245
guard let renderImage = provider.createImage(from: image) else { return [] }
246-
return [.draw(image: renderImage)]
246+
let size = provider.createSize(from: renderImage)
247+
guard size.width > 0 && size.height > 0 else { return [] }
248+
249+
let frame = makeImageFrame(for: image, bitmapSize: size)
250+
let rect = provider.createRect(from: frame)
251+
return [.draw(image: renderImage, in: rect)]
252+
}
253+
254+
func makeImageFrame(for image: Image, bitmapSize: LayerTree.Size) -> LayerTree.Rect {
255+
var frame = LayerTree.Rect(
256+
x: image.origin.x,
257+
y: image.origin.y,
258+
width: image.width ?? bitmapSize.width,
259+
height: image.height ?? bitmapSize.height
260+
)
261+
262+
let aspectRatio = bitmapSize.width / bitmapSize.height
263+
264+
if let height = image.height, image.width == nil {
265+
frame.size.width = height * aspectRatio
266+
}
267+
if let width = image.width, image.height == nil {
268+
frame.size.height = width / aspectRatio
269+
}
270+
return frame
247271
}
248272

249273
func renderCommands(for text: String, at point: Point, attributes: TextAttributes, colorConverter: ColorConverter = DefaultColorConverter()) -> [RendererCommand<P.Types>] {

SwiftDraw/LayerTree.Image.swift

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,35 @@
3232
import Foundation
3333

3434
extension LayerTree {
35-
enum Image: Equatable {
36-
case jpeg(data: Data)
37-
case png(data: Data)
38-
39-
init?(mimeType: String, data: Data) {
40-
guard data.count > 0 else { return nil }
41-
42-
switch mimeType {
43-
case "image/png":
44-
self = .png(data: data)
45-
case "image/jpeg":
46-
self = .jpeg(data: data)
47-
case "image/jpg":
48-
self = .jpeg(data: data)
49-
default:
50-
return nil
51-
}
35+
struct Image: Equatable {
36+
37+
var bitmap: Bitmap
38+
var origin: Point = .zero
39+
var width: LayerTree.Float?
40+
var height: LayerTree.Float?
41+
42+
enum Bitmap: Equatable {
43+
case jpeg(Data)
44+
case png(Data)
45+
}
46+
47+
init(bitmap: Bitmap) {
48+
self.bitmap = bitmap
49+
}
50+
51+
init?(mimeType: String, data: Data) {
52+
guard data.count > 0 else { return nil }
53+
54+
switch mimeType {
55+
case "image/png":
56+
self.bitmap = .png(data)
57+
case "image/jpeg":
58+
self.bitmap = .jpeg(data)
59+
case "image/jpg":
60+
self.bitmap = .jpeg(data)
61+
default:
62+
return nil
63+
}
64+
}
5265
}
53-
}
5466
}

SwiftDraw/Parser.XML.Image.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ extension XMLParser {
3333

3434
func parseImage(_ att: AttributeParser) throws -> DOM.Image {
3535
let href: DOM.URL = try att.parseUrl("xlink:href")
36-
let width: DOM.Coordinate = try att.parseCoordinate("width")
37-
let height: DOM.Coordinate = try att.parseCoordinate("height")
38-
39-
let use = DOM.Image(href: href, width: width, height: height)
40-
use.x = try att.parseCoordinate("x")
41-
use.y = try att.parseCoordinate("y")
42-
43-
return use
36+
37+
let image = DOM.Image(href: href)
38+
image.x = try att.parseCoordinate("x")
39+
image.y = try att.parseCoordinate("y")
40+
image.width = try att.parseCoordinate("width")
41+
image.height = try att.parseCoordinate("height")
42+
43+
return image
4444
}
4545
}

SwiftDraw/Renderer.CGText.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,11 @@ struct CGTextProvider: RendererTypeProvider {
209209
func createImage(from image: LayerTree.Image) -> LayerTree.Image? {
210210
return image
211211
}
212-
212+
213+
func createSize(from image: LayerTree.Image) -> LayerTree.Size {
214+
LayerTree.Size(image.width ?? 0, image.height ?? 0)
215+
}
216+
213217
func getBounds(from shape: LayerTree.Shape) -> LayerTree.Rect {
214218
#if canImport(CoreGraphics)
215219
return CGProvider().getBounds(from: shape)
@@ -556,7 +560,7 @@ public final class CGTextRenderer: Renderer {
556560
}
557561
}
558562

559-
func draw(image: LayerTree.Image) {
563+
func draw(image: LayerTree.Image, in rect: String) {
560564
lines.append("ctx.saveGState()")
561565
lines.append("ctx.translateBy(x: 0, y: image.height)")
562566
lines.append("ctx.scaleBy(x: 1, y: -1)")

0 commit comments

Comments
 (0)