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