@reekon-tools/react-native-pdf-canvas 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +57 -0
- package/PdfCanvas.podspec +68 -39
- package/README.md +213 -1316
- package/android/build.gradle +67 -54
- package/android/consumer-rules.pro +7 -0
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasNativeTest.java +254 -0
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/TestPdfs.java +60 -468
- package/android/src/main/cpp/CMakeLists.txt +54 -0
- package/android/src/main/cpp/pdfcanvas-jni.cpp +262 -0
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfCanvasNative.java +167 -0
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfErrorCode.java +14 -4
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfRasterException.java +10 -4
- package/android/src/reactnative/java/tools/reekon/pdfcanvas/rn/PdfCanvasModule.java +160 -376
- package/android/tools/compile-gate.sh +81 -101
- package/dist/controller.d.ts +14 -0
- package/dist/controller.js +4 -3
- package/dist/rasterizer/index.native.d.ts +8 -12
- package/dist/rasterizer/index.native.js +15 -21
- package/dist/rasterizer/native-bridge.d.ts +51 -75
- package/dist/rasterizer/native-bridge.js +49 -33
- package/dist/rasterizer/native.d.ts +45 -0
- package/dist/rasterizer/native.js +123 -0
- package/dist/react/usePdfDocument.d.ts +5 -5
- package/dist/react/usePdfLayer.d.ts +10 -1
- package/dist/react/usePdfLayer.js +10 -2
- package/dist/testing/scenes.d.ts +3 -3
- package/dist/testing/scenes.js +4 -4
- package/dist/types.d.ts +36 -42
- package/ios/Sources/PdfCanvasBridge/PdfCanvasModule.mm +234 -536
- package/native/.clangd +5 -0
- package/native/CMakeLists.txt +89 -0
- package/native/core/include/pdfcanvas/document.h +90 -0
- package/native/core/include/pdfcanvas/error.h +47 -0
- package/native/core/include/pdfcanvas/jsi.h +18 -0
- package/native/core/include/pdfcanvas/jsi_config.h +30 -0
- package/native/core/include/pdfcanvas/library.h +28 -0
- package/native/core/include/pdfcanvas/pixels.h +92 -0
- package/native/core/include/pdfcanvas/service.h +87 -0
- package/native/core/include/pdfcanvas/slots.h +113 -0
- package/native/core/include/pdfcanvas/types.h +110 -0
- package/native/core/pdfcanvas-core.cmake +22 -0
- package/native/core/src/document.cpp +516 -0
- package/native/core/src/error.cpp +29 -0
- package/native/core/src/jsi.cpp +66 -0
- package/native/core/src/library.cpp +52 -0
- package/native/core/src/pixels.cpp +45 -0
- package/native/core/src/service.cpp +156 -0
- package/native/core/src/slots.cpp +139 -0
- package/native/tests/fixtures.cpp +451 -0
- package/native/tests/fixtures.h +96 -0
- package/native/tests/harness.h +122 -0
- package/native/tests/main.cpp +64 -0
- package/native/tests/pixels_util.h +126 -0
- package/native/tests/test_document.cpp +485 -0
- package/native/tests/test_service.cpp +130 -0
- package/native/tests/test_slots.cpp +250 -0
- package/package.json +27 -7
- package/react-native.config.js +5 -2
- package/scripts/fetch-pdfium.mjs +487 -0
- package/scripts/pdfium-manifest.json +46 -0
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasCancellationTest.java +0 -226
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasConcurrencyTest.java +0 -239
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasDeviceTimingTest.java +0 -251
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasFailureTest.java +0 -221
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasJsiTransportTest.java +0 -783
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasPhaseTimingTest.java +0 -1388
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasPoisonGuardTest.java +0 -98
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasQuirksTest.java +0 -324
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasRasterizerTest.java +0 -775
- package/android/src/androidTest/java/tools/reekon/pdfcanvas/PoisonsTheProcess.java +0 -20
- package/android/src/jsi/cpp/CMakeLists.txt +0 -33
- package/android/src/jsi/cpp/pdfcanvas-jsi.cpp +0 -469
- package/android/src/jsi/java/tools/reekon/pdfcanvas/jsi/PdfCanvasPixelBridge.java +0 -140
- package/android/src/main/java/tools/reekon/pdfcanvas/PageGeometry.java +0 -45
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfCanvasRasterizer.java +0 -564
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfPlatformQuirks.java +0 -277
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfPreflight.java +0 -214
- package/android/src/main/java/tools/reekon/pdfcanvas/PdfRendererPool.java +0 -234
- package/android/src/main/java/tools/reekon/pdfcanvas/RasterCancellation.java +0 -47
- package/android/src/main/java/tools/reekon/pdfcanvas/RasterPixels.java +0 -143
- package/android/src/main/java/tools/reekon/pdfcanvas/RasterRequest.java +0 -95
- package/dist/rasterizer/android.d.ts +0 -121
- package/dist/rasterizer/android.js +0 -126
- package/dist/rasterizer/ios.d.ts +0 -84
- package/dist/rasterizer/ios.js +0 -155
- package/ios/Package.swift +0 -58
- package/ios/Sources/PdfCanvasCore/PdfCanvasCancellation.m +0 -38
- package/ios/Sources/PdfCanvasCore/PdfCanvasDocumentPool.m +0 -389
- package/ios/Sources/PdfCanvasCore/PdfCanvasErrorCode.m +0 -57
- package/ios/Sources/PdfCanvasCore/PdfCanvasPageGeometry.m +0 -44
- package/ios/Sources/PdfCanvasCore/PdfCanvasPageTransform.m +0 -82
- package/ios/Sources/PdfCanvasCore/PdfCanvasPixelSink.m +0 -37
- package/ios/Sources/PdfCanvasCore/PdfCanvasPreflight.m +0 -158
- package/ios/Sources/PdfCanvasCore/PdfCanvasRasterPixels.m +0 -80
- package/ios/Sources/PdfCanvasCore/PdfCanvasRasterRequest.m +0 -65
- package/ios/Sources/PdfCanvasCore/PdfCanvasRasterizer.m +0 -548
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasCancellation.h +0 -48
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasCore.h +0 -26
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasDocumentPool.h +0 -122
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasErrorCode.h +0 -80
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasPageGeometry.h +0 -79
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasPageTransform.h +0 -129
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasPixelSink.h +0 -100
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasPreflight.h +0 -65
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterPixels.h +0 -111
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterRequest.h +0 -85
- package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterizer.h +0 -163
- package/ios/Sources/PdfCanvasSlots/PdfCanvasSlots.mm +0 -297
- package/ios/Sources/PdfCanvasSlots/include/PdfCanvasSlots.h +0 -140
- package/ios/Tests/PdfCanvasCoreTests/ConcurrencyTests.swift +0 -358
- package/ios/Tests/PdfCanvasCoreTests/FailureTests.swift +0 -262
- package/ios/Tests/PdfCanvasCoreTests/GeometryTests.swift +0 -173
- package/ios/Tests/PdfCanvasCoreTests/PreviewTests.swift +0 -114
- package/ios/Tests/PdfCanvasCoreTests/RasterAssertions.swift +0 -158
- package/ios/Tests/PdfCanvasCoreTests/RasterizerTests.swift +0 -544
- package/ios/Tests/PdfCanvasCoreTests/SinkTests.swift +0 -287
- package/ios/Tests/PdfCanvasCoreTests/SlotsTests.swift +0 -396
- package/ios/Tests/PdfCanvasCoreTests/TestPdfs.swift +0 -639
- package/ios/Tests/PdfCanvasCoreTests/TimingTests.swift +0 -179
- package/ios/Tests/PdfCanvasCoreTests/TransformTests.swift +0 -283
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import CoreGraphics
|
|
2
|
-
import Foundation
|
|
3
|
-
import XCTest
|
|
4
|
-
|
|
5
|
-
@testable import PdfCanvasCore
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
Reading pixels back, and the vocabulary every rendering test below is written in.
|
|
9
|
-
|
|
10
|
-
The one thing worth stating up front: `PdfCanvasRasterPixels` is indexed from the
|
|
11
|
-
TOP-LEFT, because that is what doc space is. The underlying `CGBitmapContext` is
|
|
12
|
-
y-up, and the flip is inside `PdfCanvasDocToRasterTransform` — so a test that
|
|
13
|
-
reasoned in CG's coordinates would be testing its own arithmetic against the
|
|
14
|
-
library's rather than testing the library against the PDF.
|
|
15
|
-
*/
|
|
16
|
-
extension PdfCanvasRasterPixels {
|
|
17
|
-
struct Pixel: Equatable, CustomStringConvertible {
|
|
18
|
-
var r: Int
|
|
19
|
-
var g: Int
|
|
20
|
-
var b: Int
|
|
21
|
-
var a: Int
|
|
22
|
-
|
|
23
|
-
var description: String { "[\(r),\(g),\(b),\(a)]" }
|
|
24
|
-
|
|
25
|
-
static let red = Pixel(r: 255, g: 0, b: 0, a: 255)
|
|
26
|
-
static let green = Pixel(r: 0, g: 255, b: 0, a: 255)
|
|
27
|
-
static let blue = Pixel(r: 0, g: 0, b: 255, a: 255)
|
|
28
|
-
static let black = Pixel(r: 0, g: 0, b: 0, a: 255)
|
|
29
|
-
static let white = Pixel(r: 255, g: 255, b: 255, a: 255)
|
|
30
|
-
static let clear = Pixel(r: 0, g: 0, b: 0, a: 0)
|
|
31
|
-
|
|
32
|
-
/// Within `tolerance` on every channel. Antialiasing makes exact equality wrong near an edge.
|
|
33
|
-
func isNear(_ other: Pixel, tolerance: Int = 4) -> Bool {
|
|
34
|
-
abs(r - other.r) <= tolerance && abs(g - other.g) <= tolerance
|
|
35
|
-
&& abs(b - other.b) <= tolerance && abs(a - other.a) <= tolerance
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/// The pixel at (x, y), indexed from the TOP-LEFT.
|
|
40
|
-
func pixel(_ x: Int, _ y: Int) -> Pixel {
|
|
41
|
-
Pixel(
|
|
42
|
-
r: channelAt(x: x, y: y, channel: 0),
|
|
43
|
-
g: channelAt(x: x, y: y, channel: 1),
|
|
44
|
-
b: channelAt(x: x, y: y, channel: 2),
|
|
45
|
-
a: channelAt(x: x, y: y, channel: 3))
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/// A coarse letter map, for eyeballing a failure in the log rather than guessing.
|
|
49
|
-
func map(cols: Int = 16, rows: Int = 16) -> String {
|
|
50
|
-
var lines: [String] = []
|
|
51
|
-
for row in 0..<rows {
|
|
52
|
-
var line = ""
|
|
53
|
-
for col in 0..<cols {
|
|
54
|
-
let x = min(width - 1, (col * width) / cols + width / (cols * 2))
|
|
55
|
-
let y = min(height - 1, (row * height) / rows + height / (rows * 2))
|
|
56
|
-
let p = pixel(x, y)
|
|
57
|
-
if p.a == 0 {
|
|
58
|
-
line += "_"
|
|
59
|
-
} else if p.r > 200 && p.g > 200 && p.b > 200 {
|
|
60
|
-
line += "W"
|
|
61
|
-
} else if p.r > 200 && p.g < 60 && p.b < 60 {
|
|
62
|
-
line += "r"
|
|
63
|
-
} else if p.g > 200 && p.r < 60 && p.b < 60 {
|
|
64
|
-
line += "g"
|
|
65
|
-
} else if p.b > 200 && p.r < 60 && p.g < 60 {
|
|
66
|
-
line += "b"
|
|
67
|
-
} else if p.r < 60 && p.g < 60 && p.b < 60 {
|
|
68
|
-
line += "k"
|
|
69
|
-
} else {
|
|
70
|
-
line += "."
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
lines.append(line)
|
|
74
|
-
}
|
|
75
|
-
return lines.joined(separator: "\n")
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/// Convenience so a test reads as geometry rather than as an initialiser call.
|
|
80
|
-
func request(
|
|
81
|
-
page: Int = 0,
|
|
82
|
-
x: Double = 0,
|
|
83
|
-
y: Double = 0,
|
|
84
|
-
width: Double,
|
|
85
|
-
height: Double,
|
|
86
|
-
scale: Double = 1,
|
|
87
|
-
annotations: Bool = false,
|
|
88
|
-
background: PdfCanvasBackground = .white
|
|
89
|
-
) -> PdfCanvasRasterRequest {
|
|
90
|
-
PdfCanvasRasterRequest(
|
|
91
|
-
page: page, docX: x, docY: y, docWidth: width, docHeight: height, scale: scale,
|
|
92
|
-
annotations: annotations, background: background)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
extension XCTestCase {
|
|
96
|
-
func openFixture(
|
|
97
|
-
_ data: Data, name: String, poolSize: Int = 1, password: String? = nil
|
|
98
|
-
) throws -> PdfCanvasRasterizer {
|
|
99
|
-
let url = try TestPdfs.write(data, name: name)
|
|
100
|
-
return try PdfCanvasRasterizer.open(
|
|
101
|
-
fileURL: url, password: password, poolSize: poolSize)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/// Renders the whole of page 0 at `scale`.
|
|
105
|
-
func renderWholePage(
|
|
106
|
-
_ rasterizer: PdfCanvasRasterizer,
|
|
107
|
-
page: Int = 0,
|
|
108
|
-
scale: Double = 1,
|
|
109
|
-
annotations: Bool = false,
|
|
110
|
-
background: PdfCanvasBackground = .white
|
|
111
|
-
) throws -> PdfCanvasRasterPixels {
|
|
112
|
-
let geometry = try rasterizer.pageGeometry(at: page)
|
|
113
|
-
return try rasterizer.render(
|
|
114
|
-
request(
|
|
115
|
-
page: page, width: geometry.widthPoints, height: geometry.heightPoints,
|
|
116
|
-
scale: scale, annotations: annotations, background: background),
|
|
117
|
-
cancellation: nil, sink: nil)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/// Asserts a pixel, printing a letter map on failure so the log says what happened.
|
|
121
|
-
func assertPixel(
|
|
122
|
-
_ raster: PdfCanvasRasterPixels,
|
|
123
|
-
_ x: Int,
|
|
124
|
-
_ y: Int,
|
|
125
|
-
_ expected: PdfCanvasRasterPixels.Pixel,
|
|
126
|
-
tolerance: Int = 4,
|
|
127
|
-
_ message: String = "",
|
|
128
|
-
file: StaticString = #filePath,
|
|
129
|
-
line: UInt = #line
|
|
130
|
-
) {
|
|
131
|
-
let actual = raster.pixel(x, y)
|
|
132
|
-
XCTAssertTrue(
|
|
133
|
-
actual.isNear(expected, tolerance: tolerance),
|
|
134
|
-
"(\(x),\(y)) is \(actual), expected \(expected). \(message)\n\(raster.map())",
|
|
135
|
-
file: file, line: line)
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/// Max per-channel delta and differing-pixel count between two rasters of equal shape.
|
|
139
|
-
func compare(
|
|
140
|
-
_ a: PdfCanvasRasterPixels, _ b: PdfCanvasRasterPixels,
|
|
141
|
-
offsetX: Int = 0, offsetY: Int = 0
|
|
142
|
-
) -> (differing: Int, maxDelta: Int, total: Int) {
|
|
143
|
-
var differing = 0
|
|
144
|
-
var maxDelta = 0
|
|
145
|
-
for y in 0..<a.height {
|
|
146
|
-
for x in 0..<a.width {
|
|
147
|
-
let pa = a.pixel(x, y)
|
|
148
|
-
let pb = b.pixel(x + offsetX, y + offsetY)
|
|
149
|
-
let d = max(
|
|
150
|
-
abs(pa.r - pb.r),
|
|
151
|
-
max(abs(pa.g - pb.g), max(abs(pa.b - pb.b), abs(pa.a - pb.a))))
|
|
152
|
-
if d != 0 { differing += 1 }
|
|
153
|
-
maxDelta = max(maxDelta, d)
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return (differing, maxDelta, a.width * a.height)
|
|
157
|
-
}
|
|
158
|
-
}
|