Skip to content

Commit 43080b9

Browse files
committed
Support for styled text in library (lispkit draw).
1 parent 46e72e6 commit 43080b9

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

Sources/LispKit/Primitives/DrawingLibrary.swift

+30
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ public final class DrawingLibrary: NativeLibrary {
135135
self.define(Procedure("draw-ellipse", drawEllipse))
136136
self.define(Procedure("fill-ellipse", fillEllipse))
137137
self.define(Procedure("draw-text", drawText))
138+
self.define(Procedure("draw-styled-text", drawStyledText))
138139
self.define(Procedure("draw-html", drawHtml))
139140
self.define(Procedure("draw-image", drawImage))
140141
self.define(Procedure("draw-drawing", drawDrawing))
@@ -237,6 +238,7 @@ public final class DrawingLibrary: NativeLibrary {
237238

238239
// Utilities
239240
self.define(Procedure("text-size", textSize))
241+
self.define(Procedure("styled-text-size", styledTextSize))
240242
self.define(Procedure("html-size", htmlSize))
241243

242244
// Define constants
@@ -584,6 +586,17 @@ public final class DrawingLibrary: NativeLibrary {
584586
return .void
585587
}
586588

589+
private func drawStyledText(text: Expr,
590+
location: Expr,
591+
drawing: Expr?) throws -> Expr {
592+
guard case .object(let obj) = text, let attribStr = (obj as? StyledText)?.value else {
593+
throw RuntimeError.type(text, expected: [StyledText.type])
594+
}
595+
let loc = try self.asObjectLocation(location)
596+
try self.drawing(from: drawing).append(.attributedText(attribStr, at: loc))
597+
return .void
598+
}
599+
587600
private func drawHtml(text: Expr,
588601
location: Expr,
589602
drawing: Expr?) throws -> Expr {
@@ -1938,6 +1951,23 @@ public final class DrawingLibrary: NativeLibrary {
19381951
return .pair(.flonum(Double(rect.width)), .flonum(Double(rect.height)))
19391952
}
19401953

1954+
private func styledTextSize(text: Expr, dimensions: Expr?) throws -> Expr {
1955+
guard case .object(let obj) = text, let str = (obj as? StyledText)?.value else {
1956+
throw RuntimeError.type(text, expected: [StyledText.type])
1957+
}
1958+
let size: NSSize
1959+
switch dimensions {
1960+
case .none:
1961+
size = NSSize(width: CGFloat.infinity, height: CGFloat.infinity)
1962+
case .some(.pair(.flonum(let w), .flonum(let h))):
1963+
size = NSSize(width: w, height: h)
1964+
case .some(let w):
1965+
size = NSSize(width: CGFloat(try w.asDouble(coerce: true)), height: CGFloat.infinity)
1966+
}
1967+
let rect = str.boundingRect(with: size, options: [.usesLineFragmentOrigin, .usesFontLeading])
1968+
return .pair(.flonum(Double(rect.width)), .flonum(Double(rect.height)))
1969+
}
1970+
19411971
private func htmlSize(text: Expr, dimensions: Expr?) throws -> Expr {
19421972
let http = Data(try text.asString().utf8)
19431973
let str =

Sources/LispKit/Primitives/DrawingLibrary_iOS.swift

+32
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ public final class DrawingLibrary: NativeLibrary {
131131
self.define(Procedure("draw-ellipse", drawEllipse))
132132
self.define(Procedure("fill-ellipse", fillEllipse))
133133
self.define(Procedure("draw-text", drawText))
134+
self.define(Procedure("draw-styled-text", drawStyledText))
134135
self.define(Procedure("draw-html", drawHtml))
135136
self.define(Procedure("draw-image", drawImage))
136137
self.define(Procedure("draw-drawing", drawDrawing))
@@ -230,6 +231,7 @@ public final class DrawingLibrary: NativeLibrary {
230231

231232
// Utilities
232233
self.define(Procedure("text-size", textSize))
234+
self.define(Procedure("styled-text-size", styledTextSize))
233235
self.define(Procedure("html-size", htmlSize))
234236

235237
// Define constants
@@ -563,6 +565,17 @@ public final class DrawingLibrary: NativeLibrary {
563565
return .void
564566
}
565567

568+
private func drawStyledText(text: Expr,
569+
location: Expr,
570+
drawing: Expr?) throws -> Expr {
571+
guard case .object(let obj) = text, let attribStr = (obj as? StyledText)?.value else {
572+
throw RuntimeError.type(text, expected: [StyledText.type])
573+
}
574+
let loc = try self.asObjectLocation(location)
575+
try self.drawing(from: drawing).append(.attributedText(attribStr, at: loc))
576+
return .void
577+
}
578+
566579
private func drawHtml(text: Expr,
567580
location: Expr,
568581
drawing: Expr?) throws -> Expr {
@@ -1828,6 +1841,25 @@ public final class DrawingLibrary: NativeLibrary {
18281841
return .pair(.flonum(Double(rect.width)), .flonum(Double(rect.height)))
18291842
}
18301843

1844+
private func styledTextSize(text: Expr, dimensions: Expr?) throws -> Expr {
1845+
guard case .object(let obj) = text, let str = (obj as? StyledText)?.value else {
1846+
throw RuntimeError.type(text, expected: [StyledText.type])
1847+
}
1848+
let size: CGSize
1849+
switch dimensions {
1850+
case .none:
1851+
size = CGSize(width: CGFloat.infinity, height: CGFloat.infinity)
1852+
case .some(.pair(.flonum(let w), .flonum(let h))):
1853+
size = CGSize(width: w, height: h)
1854+
case .some(let w):
1855+
size = CGSize(width: CGFloat(try w.asDouble(coerce: true)), height: CGFloat.infinity)
1856+
}
1857+
let rect = str.boundingRect(with: size,
1858+
options: [.usesLineFragmentOrigin, .usesFontLeading],
1859+
context: nil)
1860+
return .pair(.flonum(Double(rect.width)), .flonum(Double(rect.height)))
1861+
}
1862+
18311863
private func htmlSize(text: Expr, dimensions: Expr?) throws -> Expr {
18321864
let http = Data(try text.asString().utf8)
18331865
let str =

0 commit comments

Comments
 (0)