@reekon-tools/react-native-pdf-canvas 0.1.1 → 0.2.1

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.
Files changed (121) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +57 -0
  3. package/PdfCanvas.podspec +77 -40
  4. package/README.md +218 -1316
  5. package/android/build.gradle +67 -54
  6. package/android/consumer-rules.pro +7 -0
  7. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasNativeTest.java +254 -0
  8. package/android/src/androidTest/java/tools/reekon/pdfcanvas/TestPdfs.java +60 -468
  9. package/android/src/main/cpp/CMakeLists.txt +54 -0
  10. package/android/src/main/cpp/pdfcanvas-jni.cpp +262 -0
  11. package/android/src/main/java/tools/reekon/pdfcanvas/PdfCanvasNative.java +167 -0
  12. package/android/src/main/java/tools/reekon/pdfcanvas/PdfErrorCode.java +14 -4
  13. package/android/src/main/java/tools/reekon/pdfcanvas/PdfRasterException.java +10 -4
  14. package/android/src/reactnative/java/tools/reekon/pdfcanvas/rn/PdfCanvasModule.java +160 -376
  15. package/android/tools/compile-gate.sh +81 -101
  16. package/dist/controller.d.ts +14 -0
  17. package/dist/controller.js +4 -3
  18. package/dist/rasterizer/index.native.d.ts +8 -12
  19. package/dist/rasterizer/index.native.js +15 -21
  20. package/dist/rasterizer/native-bridge.d.ts +51 -75
  21. package/dist/rasterizer/native-bridge.js +49 -33
  22. package/dist/rasterizer/native.d.ts +45 -0
  23. package/dist/rasterizer/native.js +123 -0
  24. package/dist/react/usePdfDocument.d.ts +5 -5
  25. package/dist/react/usePdfLayer.d.ts +10 -1
  26. package/dist/react/usePdfLayer.js +10 -2
  27. package/dist/testing/scenes.d.ts +3 -3
  28. package/dist/testing/scenes.js +4 -4
  29. package/dist/types.d.ts +36 -42
  30. package/ios/Sources/PdfCanvasBridge/PdfCanvasModule.mm +234 -536
  31. package/native/.clangd +5 -0
  32. package/native/CMakeLists.txt +89 -0
  33. package/native/core/include/pdfcanvas/document.h +90 -0
  34. package/native/core/include/pdfcanvas/error.h +47 -0
  35. package/native/core/include/pdfcanvas/jsi.h +18 -0
  36. package/native/core/include/pdfcanvas/jsi_config.h +30 -0
  37. package/native/core/include/pdfcanvas/library.h +28 -0
  38. package/native/core/include/pdfcanvas/pixels.h +92 -0
  39. package/native/core/include/pdfcanvas/service.h +87 -0
  40. package/native/core/include/pdfcanvas/slots.h +113 -0
  41. package/native/core/include/pdfcanvas/types.h +110 -0
  42. package/native/core/pdfcanvas-core.cmake +22 -0
  43. package/native/core/src/document.cpp +516 -0
  44. package/native/core/src/error.cpp +29 -0
  45. package/native/core/src/jsi.cpp +66 -0
  46. package/native/core/src/library.cpp +52 -0
  47. package/native/core/src/pixels.cpp +45 -0
  48. package/native/core/src/service.cpp +156 -0
  49. package/native/core/src/slots.cpp +139 -0
  50. package/native/tests/fixtures.cpp +451 -0
  51. package/native/tests/fixtures.h +96 -0
  52. package/native/tests/harness.h +122 -0
  53. package/native/tests/main.cpp +64 -0
  54. package/native/tests/pixels_util.h +126 -0
  55. package/native/tests/test_document.cpp +485 -0
  56. package/native/tests/test_service.cpp +130 -0
  57. package/native/tests/test_slots.cpp +250 -0
  58. package/package.json +27 -7
  59. package/react-native.config.js +5 -2
  60. package/scripts/fetch-pdfium.mjs +559 -0
  61. package/scripts/pdfium-manifest.json +48 -0
  62. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasCancellationTest.java +0 -226
  63. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasConcurrencyTest.java +0 -239
  64. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasDeviceTimingTest.java +0 -251
  65. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasFailureTest.java +0 -221
  66. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasJsiTransportTest.java +0 -783
  67. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasPhaseTimingTest.java +0 -1388
  68. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasPoisonGuardTest.java +0 -98
  69. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasQuirksTest.java +0 -324
  70. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PdfCanvasRasterizerTest.java +0 -775
  71. package/android/src/androidTest/java/tools/reekon/pdfcanvas/PoisonsTheProcess.java +0 -20
  72. package/android/src/jsi/cpp/CMakeLists.txt +0 -33
  73. package/android/src/jsi/cpp/pdfcanvas-jsi.cpp +0 -469
  74. package/android/src/jsi/java/tools/reekon/pdfcanvas/jsi/PdfCanvasPixelBridge.java +0 -140
  75. package/android/src/main/java/tools/reekon/pdfcanvas/PageGeometry.java +0 -45
  76. package/android/src/main/java/tools/reekon/pdfcanvas/PdfCanvasRasterizer.java +0 -564
  77. package/android/src/main/java/tools/reekon/pdfcanvas/PdfPlatformQuirks.java +0 -277
  78. package/android/src/main/java/tools/reekon/pdfcanvas/PdfPreflight.java +0 -214
  79. package/android/src/main/java/tools/reekon/pdfcanvas/PdfRendererPool.java +0 -234
  80. package/android/src/main/java/tools/reekon/pdfcanvas/RasterCancellation.java +0 -47
  81. package/android/src/main/java/tools/reekon/pdfcanvas/RasterPixels.java +0 -143
  82. package/android/src/main/java/tools/reekon/pdfcanvas/RasterRequest.java +0 -95
  83. package/dist/rasterizer/android.d.ts +0 -121
  84. package/dist/rasterizer/android.js +0 -126
  85. package/dist/rasterizer/ios.d.ts +0 -84
  86. package/dist/rasterizer/ios.js +0 -155
  87. package/ios/Package.swift +0 -58
  88. package/ios/Sources/PdfCanvasCore/PdfCanvasCancellation.m +0 -38
  89. package/ios/Sources/PdfCanvasCore/PdfCanvasDocumentPool.m +0 -389
  90. package/ios/Sources/PdfCanvasCore/PdfCanvasErrorCode.m +0 -57
  91. package/ios/Sources/PdfCanvasCore/PdfCanvasPageGeometry.m +0 -44
  92. package/ios/Sources/PdfCanvasCore/PdfCanvasPageTransform.m +0 -82
  93. package/ios/Sources/PdfCanvasCore/PdfCanvasPixelSink.m +0 -37
  94. package/ios/Sources/PdfCanvasCore/PdfCanvasPreflight.m +0 -158
  95. package/ios/Sources/PdfCanvasCore/PdfCanvasRasterPixels.m +0 -80
  96. package/ios/Sources/PdfCanvasCore/PdfCanvasRasterRequest.m +0 -65
  97. package/ios/Sources/PdfCanvasCore/PdfCanvasRasterizer.m +0 -548
  98. package/ios/Sources/PdfCanvasCore/include/PdfCanvasCancellation.h +0 -48
  99. package/ios/Sources/PdfCanvasCore/include/PdfCanvasCore.h +0 -26
  100. package/ios/Sources/PdfCanvasCore/include/PdfCanvasDocumentPool.h +0 -122
  101. package/ios/Sources/PdfCanvasCore/include/PdfCanvasErrorCode.h +0 -80
  102. package/ios/Sources/PdfCanvasCore/include/PdfCanvasPageGeometry.h +0 -79
  103. package/ios/Sources/PdfCanvasCore/include/PdfCanvasPageTransform.h +0 -129
  104. package/ios/Sources/PdfCanvasCore/include/PdfCanvasPixelSink.h +0 -100
  105. package/ios/Sources/PdfCanvasCore/include/PdfCanvasPreflight.h +0 -65
  106. package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterPixels.h +0 -111
  107. package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterRequest.h +0 -85
  108. package/ios/Sources/PdfCanvasCore/include/PdfCanvasRasterizer.h +0 -163
  109. package/ios/Sources/PdfCanvasSlots/PdfCanvasSlots.mm +0 -297
  110. package/ios/Sources/PdfCanvasSlots/include/PdfCanvasSlots.h +0 -140
  111. package/ios/Tests/PdfCanvasCoreTests/ConcurrencyTests.swift +0 -358
  112. package/ios/Tests/PdfCanvasCoreTests/FailureTests.swift +0 -262
  113. package/ios/Tests/PdfCanvasCoreTests/GeometryTests.swift +0 -173
  114. package/ios/Tests/PdfCanvasCoreTests/PreviewTests.swift +0 -114
  115. package/ios/Tests/PdfCanvasCoreTests/RasterAssertions.swift +0 -158
  116. package/ios/Tests/PdfCanvasCoreTests/RasterizerTests.swift +0 -544
  117. package/ios/Tests/PdfCanvasCoreTests/SinkTests.swift +0 -287
  118. package/ios/Tests/PdfCanvasCoreTests/SlotsTests.swift +0 -396
  119. package/ios/Tests/PdfCanvasCoreTests/TestPdfs.swift +0 -639
  120. package/ios/Tests/PdfCanvasCoreTests/TimingTests.swift +0 -179
  121. 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
- }