Skip to content

Commit c7c4ce0

Browse files
karwaKarthikRIyer
authored andcommitted
rfac: Make Plot.drawGraph(Renderer) public, faster base64 encoding (#54)
* Make `Plot.drawGraph(renderer: Renderer)` public * AGGRenderer: encode base-64 without intermediate copying of buffer * AGG: Added a test for base-64 PNG output * AGG tests: check data sizes * Regenerate test manifests
1 parent b40f074 commit c7c4ce0

File tree

6 files changed

+72
-9
lines changed

6 files changed

+72
-9
lines changed

Sources/AGGRenderer/AGGRenderer/AGGRenderer.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,11 @@ public class AGGRenderer: Renderer{
249249
public func base64Png() -> String{
250250
let pngBufferPointer: UnsafePointer<UInt8> = get_png_buffer(agg_object)
251251
let bufferSize: Int = Int(get_png_buffer_size(agg_object))
252-
return encodeBase64PNG(pngBufferPointer: pngBufferPointer,
253-
bufferSize: bufferSize)
252+
return Data(
253+
bytesNoCopy: UnsafeMutableRawPointer(mutating: pngBufferPointer),
254+
count: bufferSize,
255+
deallocator: .none
256+
).base64EncodedString(options: .lineLength64Characters)
254257
}
255258

256259
deinit {

Sources/SwiftPlot/Base64Encoder.swift

Lines changed: 0 additions & 6 deletions
This file was deleted.

Sources/SwiftPlot/Plot.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public protocol Plot {
1313
extension Plot {
1414

1515
/// Draws to the given renderer in-memory at a default size.
16-
func drawGraph(renderer: Renderer) {
16+
public func drawGraph(renderer: Renderer) {
1717
drawGraph(size: Size(width: 1000, height: 660),
1818
renderer: renderer)
1919
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#if canImport(AGGRenderer)
2+
import XCTest
3+
import SwiftPlot
4+
import AGGRenderer
5+
6+
extension AGGRendererTests {
7+
8+
func testBase64Encoding() {
9+
let renderer = AGGRenderer()
10+
let rect = Rect(origin: zeroPoint, size: Size(width: 200, height: 200))
11+
12+
renderer.imageSize = rect.size
13+
renderer.drawSolidRect(rect, fillColor: .white, hatchPattern: .none)
14+
renderer.drawSolidCircle(center: Point(100,100), radius: 75, fillColor: .red)
15+
16+
let png = renderer.base64Png()
17+
XCTAssertEqual(png.count, 2315)
18+
19+
// Check that we can decode it again.
20+
guard let data = Data(base64Encoded: png, options: .ignoreUnknownCharacters) else {
21+
XCTFail("Failed to decode base64-encoded PNG")
22+
return
23+
}
24+
XCTAssertEqual(data.count, 1710)
25+
// Check expected data.
26+
// A reference file would be better, but this will have to do for now.
27+
let pngPrefix = png.prefix(128)
28+
let pngSuffix = png.suffix(128)
29+
XCTAssertEqual(
30+
String(pngPrefix),
31+
#"iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAABL1BMVEX/////6+v/"# + "\r\n" +
32+
#"w8P/m5v/gYH/aWn/UVH/ODj/JCT/HBz/FBT/DAz/AwP//v7/39//pqb/bGz/PT3"#
33+
)
34+
XCTAssertEqual(
35+
String(pngSuffix),
36+
#"bOhf/ybcSl/8JBL307q16z"# + "\r\n" +
37+
#"r65fM1xf2bV6P3+K7hZuvI3bu9L9w/VjOPx4/XBfurtteG886F0mk8lkMplMJpPJ"# + "\r\n" +
38+
#"ZDKZTCaTSUH/ABlnILfhHFVMAAAAAElFTkSuQmCC"#
39+
)
40+
}
41+
}
42+
43+
#endif // canImport(AGGRenderer)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import XCTest
2+
3+
final class AGGRendererTests: XCTestCase {}

Tests/SwiftPlotTests/XCTestManifests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
#if !canImport(ObjectiveC)
22
import XCTest
33

4+
extension AGGRendererTests {
5+
// DO NOT MODIFY: This is autogenerated, use:
6+
// `swift test --generate-linuxmain`
7+
// to regenerate.
8+
static let __allTests__AGGRendererTests = [
9+
("testBase64Encoding", testBase64Encoding),
10+
]
11+
}
12+
413
extension BarchartTests {
514
// DO NOT MODIFY: This is autogenerated, use:
615
// `swift test --generate-linuxmain`
@@ -57,12 +66,23 @@ extension ScatterPlotTests {
5766
]
5867
}
5968

69+
extension SubPlotTests {
70+
// DO NOT MODIFY: This is autogenerated, use:
71+
// `swift test --generate-linuxmain`
72+
// to regenerate.
73+
static let __allTests__SubPlotTests = [
74+
("testNestedSubplots", testNestedSubplots),
75+
]
76+
}
77+
6078
public func __allTests() -> [XCTestCaseEntry] {
6179
return [
80+
testCase(AGGRendererTests.__allTests__AGGRendererTests),
6281
testCase(BarchartTests.__allTests__BarchartTests),
6382
testCase(HistogramTests.__allTests__HistogramTests),
6483
testCase(LineChartTests.__allTests__LineChartTests),
6584
testCase(ScatterPlotTests.__allTests__ScatterPlotTests),
85+
testCase(SubPlotTests.__allTests__SubPlotTests),
6686
]
6787
}
6888
#endif

0 commit comments

Comments
 (0)