react-native-nitro-zxing 0.1.0-alpha.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 (423) hide show
  1. package/README.md +34 -0
  2. package/VisionCameraZxing.podspec +48 -0
  3. package/android/CMakeLists.txt +43 -0
  4. package/android/build.gradle +150 -0
  5. package/android/fix-prefab.gradle +51 -0
  6. package/android/gradle.properties +5 -0
  7. package/android/src/main/AndroidManifest.xml +3 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +7 -0
  9. package/android/src/main/java/com/margelo/nitro/camera/zxing/VisionCameraZxingPackage.kt +21 -0
  10. package/cpp/BarcodeValueTypeClassifier.cpp +70 -0
  11. package/cpp/BarcodeValueTypeClassifier.hpp +14 -0
  12. package/cpp/FrameImageView.cpp +75 -0
  13. package/cpp/FrameImageView.hpp +34 -0
  14. package/cpp/HybridBarcode.cpp +59 -0
  15. package/cpp/HybridBarcode.hpp +26 -0
  16. package/cpp/HybridBarcodeScanner.cpp +121 -0
  17. package/cpp/HybridBarcodeScanner.hpp +26 -0
  18. package/cpp/HybridBarcodeScannerFactory.cpp +11 -0
  19. package/cpp/HybridBarcodeScannerFactory.hpp +14 -0
  20. package/cpp/ImageDownscaler.cpp +34 -0
  21. package/cpp/ImageDownscaler.hpp +21 -0
  22. package/cpp/ZXingDecoder.cpp +189 -0
  23. package/cpp/ZXingDecoder.hpp +72 -0
  24. package/cpp/zxing-core/LICENSE +202 -0
  25. package/cpp/zxing-core/README.md +156 -0
  26. package/cpp/zxing-core/core/CMakeLists.txt +784 -0
  27. package/cpp/zxing-core/core/Version.h.in +28 -0
  28. package/cpp/zxing-core/core/ZXingConfig.cmake.in +9 -0
  29. package/cpp/zxing-core/core/src/Barcode.cpp +255 -0
  30. package/cpp/zxing-core/core/src/Barcode.h +191 -0
  31. package/cpp/zxing-core/core/src/BarcodeData.h +100 -0
  32. package/cpp/zxing-core/core/src/BarcodeFormat.cpp +286 -0
  33. package/cpp/zxing-core/core/src/BarcodeFormat.h +272 -0
  34. package/cpp/zxing-core/core/src/BinaryBitmap.cpp +111 -0
  35. package/cpp/zxing-core/core/src/BinaryBitmap.h +66 -0
  36. package/cpp/zxing-core/core/src/BitArray.cpp +38 -0
  37. package/cpp/zxing-core/core/src/BitArray.h +181 -0
  38. package/cpp/zxing-core/core/src/BitMatrix.cpp +175 -0
  39. package/cpp/zxing-core/core/src/BitMatrix.h +199 -0
  40. package/cpp/zxing-core/core/src/BitMatrixCursor.h +253 -0
  41. package/cpp/zxing-core/core/src/BitMatrixIO.cpp +101 -0
  42. package/cpp/zxing-core/core/src/BitMatrixIO.h +21 -0
  43. package/cpp/zxing-core/core/src/BitSource.cpp +77 -0
  44. package/cpp/zxing-core/core/src/BitSource.h +72 -0
  45. package/cpp/zxing-core/core/src/ByteArray.h +42 -0
  46. package/cpp/zxing-core/core/src/CharacterSet.cpp +78 -0
  47. package/cpp/zxing-core/core/src/CharacterSet.h +58 -0
  48. package/cpp/zxing-core/core/src/ConcentricFinder.cpp +312 -0
  49. package/cpp/zxing-core/core/src/ConcentricFinder.h +156 -0
  50. package/cpp/zxing-core/core/src/Content.cpp +471 -0
  51. package/cpp/zxing-core/core/src/Content.h +82 -0
  52. package/cpp/zxing-core/core/src/ContentType.h +19 -0
  53. package/cpp/zxing-core/core/src/CreateBarcode.cpp +490 -0
  54. package/cpp/zxing-core/core/src/CreateBarcode.h +132 -0
  55. package/cpp/zxing-core/core/src/DecoderResult.h +92 -0
  56. package/cpp/zxing-core/core/src/DetectorResult.h +44 -0
  57. package/cpp/zxing-core/core/src/ECI.cpp +81 -0
  58. package/cpp/zxing-core/core/src/ECI.h +78 -0
  59. package/cpp/zxing-core/core/src/Error.cpp +29 -0
  60. package/cpp/zxing-core/core/src/Error.h +79 -0
  61. package/cpp/zxing-core/core/src/Flags.h +165 -0
  62. package/cpp/zxing-core/core/src/GTIN.cpp +253 -0
  63. package/cpp/zxing-core/core/src/GTIN.h +58 -0
  64. package/cpp/zxing-core/core/src/GlobalHistogramBinarizer.cpp +197 -0
  65. package/cpp/zxing-core/core/src/GlobalHistogramBinarizer.h +34 -0
  66. package/cpp/zxing-core/core/src/GridSampler.cpp +124 -0
  67. package/cpp/zxing-core/core/src/GridSampler.h +59 -0
  68. package/cpp/zxing-core/core/src/HRI.cpp +343 -0
  69. package/cpp/zxing-core/core/src/HRI.h +16 -0
  70. package/cpp/zxing-core/core/src/HybridBinarizer.cpp +315 -0
  71. package/cpp/zxing-core/core/src/HybridBinarizer.h +40 -0
  72. package/cpp/zxing-core/core/src/ImageView.h +168 -0
  73. package/cpp/zxing-core/core/src/JSON.cpp +154 -0
  74. package/cpp/zxing-core/core/src/JSON.h +66 -0
  75. package/cpp/zxing-core/core/src/LocalGrid.cpp +242 -0
  76. package/cpp/zxing-core/core/src/LocalGrid.h +91 -0
  77. package/cpp/zxing-core/core/src/LogMatrix.h +105 -0
  78. package/cpp/zxing-core/core/src/Matrix.h +125 -0
  79. package/cpp/zxing-core/core/src/MultiFormatReader.cpp +107 -0
  80. package/cpp/zxing-core/core/src/MultiFormatReader.h +34 -0
  81. package/cpp/zxing-core/core/src/MultiFormatWriter.cpp +111 -0
  82. package/cpp/zxing-core/core/src/MultiFormatWriter.h +62 -0
  83. package/cpp/zxing-core/core/src/Pattern.h +472 -0
  84. package/cpp/zxing-core/core/src/PerspectiveTransform.cpp +81 -0
  85. package/cpp/zxing-core/core/src/PerspectiveTransform.h +47 -0
  86. package/cpp/zxing-core/core/src/Point.h +185 -0
  87. package/cpp/zxing-core/core/src/Quadrilateral.h +215 -0
  88. package/cpp/zxing-core/core/src/Range.h +112 -0
  89. package/cpp/zxing-core/core/src/ReadBarcode.cpp +335 -0
  90. package/cpp/zxing-core/core/src/ReadBarcode.h +33 -0
  91. package/cpp/zxing-core/core/src/Reader.h +32 -0
  92. package/cpp/zxing-core/core/src/ReaderOptions.h +210 -0
  93. package/cpp/zxing-core/core/src/ReedSolomon.cpp +100 -0
  94. package/cpp/zxing-core/core/src/ReedSolomon.h +66 -0
  95. package/cpp/zxing-core/core/src/RegressionLine.h +161 -0
  96. package/cpp/zxing-core/core/src/ResultPoint.cpp +20 -0
  97. package/cpp/zxing-core/core/src/ResultPoint.h +35 -0
  98. package/cpp/zxing-core/core/src/StdGenerator.h +121 -0
  99. package/cpp/zxing-core/core/src/StdPrint.h +38 -0
  100. package/cpp/zxing-core/core/src/StdScope.h +55 -0
  101. package/cpp/zxing-core/core/src/StructuredAppend.h +19 -0
  102. package/cpp/zxing-core/core/src/SymbologyIdentifier.h +29 -0
  103. package/cpp/zxing-core/core/src/TextDecoder.cpp +59 -0
  104. package/cpp/zxing-core/core/src/TextDecoder.h +23 -0
  105. package/cpp/zxing-core/core/src/TextEncoder.cpp +75 -0
  106. package/cpp/zxing-core/core/src/TextEncoder.h +31 -0
  107. package/cpp/zxing-core/core/src/ThresholdBinarizer.h +58 -0
  108. package/cpp/zxing-core/core/src/TritMatrix.h +29 -0
  109. package/cpp/zxing-core/core/src/Utf.cpp +276 -0
  110. package/cpp/zxing-core/core/src/Utf.h +26 -0
  111. package/cpp/zxing-core/core/src/WhiteRectDetector.cpp +276 -0
  112. package/cpp/zxing-core/core/src/WhiteRectDetector.h +36 -0
  113. package/cpp/zxing-core/core/src/WriteBarcode.cpp +213 -0
  114. package/cpp/zxing-core/core/src/WriteBarcode.h +72 -0
  115. package/cpp/zxing-core/core/src/ZXAlgorithms.h +353 -0
  116. package/cpp/zxing-core/core/src/ZXConfig.h +17 -0
  117. package/cpp/zxing-core/core/src/ZXTestSupport.h +9 -0
  118. package/cpp/zxing-core/core/src/ZXVersion.h +14 -0
  119. package/cpp/zxing-core/core/src/ZXingC.cpp +460 -0
  120. package/cpp/zxing-core/core/src/ZXingC.h +296 -0
  121. package/cpp/zxing-core/core/src/ZXingCpp.cpp +18 -0
  122. package/cpp/zxing-core/core/src/ZXingCpp.h +76 -0
  123. package/cpp/zxing-core/core/src/ZXingQt.h +606 -0
  124. package/cpp/zxing-core/core/src/aztec/AZDecoder.cpp +376 -0
  125. package/cpp/zxing-core/core/src/aztec/AZDecoder.h +20 -0
  126. package/cpp/zxing-core/core/src/aztec/AZDetector.cpp +508 -0
  127. package/cpp/zxing-core/core/src/aztec/AZDetector.h +25 -0
  128. package/cpp/zxing-core/core/src/aztec/AZDetectorResult.h +51 -0
  129. package/cpp/zxing-core/core/src/aztec/AZEncoder.cpp +318 -0
  130. package/cpp/zxing-core/core/src/aztec/AZEncoder.h +44 -0
  131. package/cpp/zxing-core/core/src/aztec/AZEncodingState.h +40 -0
  132. package/cpp/zxing-core/core/src/aztec/AZHighLevelEncoder.cpp +377 -0
  133. package/cpp/zxing-core/core/src/aztec/AZHighLevelEncoder.h +36 -0
  134. package/cpp/zxing-core/core/src/aztec/AZReader.cpp +45 -0
  135. package/cpp/zxing-core/core/src/aztec/AZReader.h +21 -0
  136. package/cpp/zxing-core/core/src/aztec/AZToken.cpp +44 -0
  137. package/cpp/zxing-core/core/src/aztec/AZToken.h +39 -0
  138. package/cpp/zxing-core/core/src/aztec/AZWriter.cpp +38 -0
  139. package/cpp/zxing-core/core/src/aztec/AZWriter.h +55 -0
  140. package/cpp/zxing-core/core/src/datamatrix/DMBitLayout.cpp +194 -0
  141. package/cpp/zxing-core/core/src/datamatrix/DMBitLayout.h +21 -0
  142. package/cpp/zxing-core/core/src/datamatrix/DMDataBlock.cpp +63 -0
  143. package/cpp/zxing-core/core/src/datamatrix/DMDataBlock.h +41 -0
  144. package/cpp/zxing-core/core/src/datamatrix/DMDecoder.cpp +457 -0
  145. package/cpp/zxing-core/core/src/datamatrix/DMDecoder.h +19 -0
  146. package/cpp/zxing-core/core/src/datamatrix/DMDetector.cpp +1230 -0
  147. package/cpp/zxing-core/core/src/datamatrix/DMDetector.h +23 -0
  148. package/cpp/zxing-core/core/src/datamatrix/DMECEncoder.cpp +137 -0
  149. package/cpp/zxing-core/core/src/datamatrix/DMECEncoder.h +26 -0
  150. package/cpp/zxing-core/core/src/datamatrix/DMEncoderContext.h +128 -0
  151. package/cpp/zxing-core/core/src/datamatrix/DMHighLevelEncoder.cpp +919 -0
  152. package/cpp/zxing-core/core/src/datamatrix/DMHighLevelEncoder.h +29 -0
  153. package/cpp/zxing-core/core/src/datamatrix/DMReader.cpp +40 -0
  154. package/cpp/zxing-core/core/src/datamatrix/DMReader.h +21 -0
  155. package/cpp/zxing-core/core/src/datamatrix/DMSymbolInfo.cpp +141 -0
  156. package/cpp/zxing-core/core/src/datamatrix/DMSymbolInfo.h +78 -0
  157. package/cpp/zxing-core/core/src/datamatrix/DMSymbolShape.h +17 -0
  158. package/cpp/zxing-core/core/src/datamatrix/DMVersion.cpp +82 -0
  159. package/cpp/zxing-core/core/src/datamatrix/DMVersion.h +76 -0
  160. package/cpp/zxing-core/core/src/datamatrix/DMWriter.cpp +114 -0
  161. package/cpp/zxing-core/core/src/datamatrix/DMWriter.h +62 -0
  162. package/cpp/zxing-core/core/src/librscpp/README.md +65 -0
  163. package/cpp/zxing-core/core/src/librscpp/decode.h +258 -0
  164. package/cpp/zxing-core/core/src/librscpp/encode.h +124 -0
  165. package/cpp/zxing-core/core/src/librscpp/field.h +158 -0
  166. package/cpp/zxing-core/core/src/librscpp/poly.h +194 -0
  167. package/cpp/zxing-core/core/src/libzint/2of5inter.c +1 -0
  168. package/cpp/zxing-core/core/src/libzint/2of5inter_based.c +1 -0
  169. package/cpp/zxing-core/core/src/libzint/aztec.c +1 -0
  170. package/cpp/zxing-core/core/src/libzint/aztec.h +1 -0
  171. package/cpp/zxing-core/core/src/libzint/big5.h +1 -0
  172. package/cpp/zxing-core/core/src/libzint/codabar.c +1 -0
  173. package/cpp/zxing-core/core/src/libzint/code.c +1 -0
  174. package/cpp/zxing-core/core/src/libzint/code128.c +1 -0
  175. package/cpp/zxing-core/core/src/libzint/code128.h +1 -0
  176. package/cpp/zxing-core/core/src/libzint/common.c +1 -0
  177. package/cpp/zxing-core/core/src/libzint/common.h +1 -0
  178. package/cpp/zxing-core/core/src/libzint/dmatrix.c +1 -0
  179. package/cpp/zxing-core/core/src/libzint/dmatrix.h +1 -0
  180. package/cpp/zxing-core/core/src/libzint/dxfilmedge.c +1 -0
  181. package/cpp/zxing-core/core/src/libzint/eci.c +1 -0
  182. package/cpp/zxing-core/core/src/libzint/eci.h +1 -0
  183. package/cpp/zxing-core/core/src/libzint/eci_sb.h +1 -0
  184. package/cpp/zxing-core/core/src/libzint/filemem.c +1 -0
  185. package/cpp/zxing-core/core/src/libzint/filemem.h +1 -0
  186. package/cpp/zxing-core/core/src/libzint/fonts/normal_woff2.h +1 -0
  187. package/cpp/zxing-core/core/src/libzint/fonts/upcean_woff2.h +1 -0
  188. package/cpp/zxing-core/core/src/libzint/gb18030.h +1 -0
  189. package/cpp/zxing-core/core/src/libzint/gb2312.h +1 -0
  190. package/cpp/zxing-core/core/src/libzint/gbk.h +1 -0
  191. package/cpp/zxing-core/core/src/libzint/general_field.c +1 -0
  192. package/cpp/zxing-core/core/src/libzint/general_field.h +1 -0
  193. package/cpp/zxing-core/core/src/libzint/gs1.c +1 -0
  194. package/cpp/zxing-core/core/src/libzint/gs1.h +1 -0
  195. package/cpp/zxing-core/core/src/libzint/gs1_lint.h +1 -0
  196. package/cpp/zxing-core/core/src/libzint/iso3166.h +1 -0
  197. package/cpp/zxing-core/core/src/libzint/iso4217.h +1 -0
  198. package/cpp/zxing-core/core/src/libzint/ksx1001.h +1 -0
  199. package/cpp/zxing-core/core/src/libzint/large.c +1 -0
  200. package/cpp/zxing-core/core/src/libzint/large.h +1 -0
  201. package/cpp/zxing-core/core/src/libzint/library.c +1 -0
  202. package/cpp/zxing-core/core/src/libzint/maxicode.c +1 -0
  203. package/cpp/zxing-core/core/src/libzint/maxicode.h +1 -0
  204. package/cpp/zxing-core/core/src/libzint/medical.c +1 -0
  205. package/cpp/zxing-core/core/src/libzint/output.c +1 -0
  206. package/cpp/zxing-core/core/src/libzint/output.h +1 -0
  207. package/cpp/zxing-core/core/src/libzint/pdf417.c +1 -0
  208. package/cpp/zxing-core/core/src/libzint/pdf417.h +1 -0
  209. package/cpp/zxing-core/core/src/libzint/pdf417_tabs.h +1 -0
  210. package/cpp/zxing-core/core/src/libzint/qr.c +1 -0
  211. package/cpp/zxing-core/core/src/libzint/qr.h +1 -0
  212. package/cpp/zxing-core/core/src/libzint/raster.c +1 -0
  213. package/cpp/zxing-core/core/src/libzint/raster_font.h +1 -0
  214. package/cpp/zxing-core/core/src/libzint/reedsol.c +1 -0
  215. package/cpp/zxing-core/core/src/libzint/reedsol.h +1 -0
  216. package/cpp/zxing-core/core/src/libzint/reedsol_logs.h +1 -0
  217. package/cpp/zxing-core/core/src/libzint/rss.c +1 -0
  218. package/cpp/zxing-core/core/src/libzint/rss.h +1 -0
  219. package/cpp/zxing-core/core/src/libzint/sjis.h +1 -0
  220. package/cpp/zxing-core/core/src/libzint/stubs.c +137 -0
  221. package/cpp/zxing-core/core/src/libzint/svg.c +1 -0
  222. package/cpp/zxing-core/core/src/libzint/telepen.c +1 -0
  223. package/cpp/zxing-core/core/src/libzint/upcean.c +1 -0
  224. package/cpp/zxing-core/core/src/libzint/vector.c +1 -0
  225. package/cpp/zxing-core/core/src/libzint/zfiletypes.h +1 -0
  226. package/cpp/zxing-core/core/src/libzint/zint.h +1 -0
  227. package/cpp/zxing-core/core/src/libzint/zintconfig.h +1 -0
  228. package/cpp/zxing-core/core/src/libzueci/README.md +11 -0
  229. package/cpp/zxing-core/core/src/libzueci/zueci.c +1718 -0
  230. package/cpp/zxing-core/core/src/libzueci/zueci.h +179 -0
  231. package/cpp/zxing-core/core/src/libzueci/zueci_big5.h +3884 -0
  232. package/cpp/zxing-core/core/src/libzueci/zueci_common.h +31 -0
  233. package/cpp/zxing-core/core/src/libzueci/zueci_gb18030.h +264 -0
  234. package/cpp/zxing-core/core/src/libzueci/zueci_gb2312.h +2381 -0
  235. package/cpp/zxing-core/core/src/libzueci/zueci_gbk.h +4047 -0
  236. package/cpp/zxing-core/core/src/libzueci/zueci_ksx1001.h +2932 -0
  237. package/cpp/zxing-core/core/src/libzueci/zueci_sb.h +1112 -0
  238. package/cpp/zxing-core/core/src/libzueci/zueci_sjis.h +2286 -0
  239. package/cpp/zxing-core/core/src/maxicode/MCBitMatrixParser.cpp +68 -0
  240. package/cpp/zxing-core/core/src/maxicode/MCBitMatrixParser.h +30 -0
  241. package/cpp/zxing-core/core/src/maxicode/MCDecoder.cpp +329 -0
  242. package/cpp/zxing-core/core/src/maxicode/MCDecoder.h +19 -0
  243. package/cpp/zxing-core/core/src/maxicode/MCReader.cpp +65 -0
  244. package/cpp/zxing-core/core/src/maxicode/MCReader.h +21 -0
  245. package/cpp/zxing-core/core/src/oned/ODCodabarReader.cpp +102 -0
  246. package/cpp/zxing-core/core/src/oned/ODCodabarReader.h +21 -0
  247. package/cpp/zxing-core/core/src/oned/ODCodabarWriter.cpp +136 -0
  248. package/cpp/zxing-core/core/src/oned/ODCodabarWriter.h +34 -0
  249. package/cpp/zxing-core/core/src/oned/ODCode128Patterns.h +130 -0
  250. package/cpp/zxing-core/core/src/oned/ODCode128Reader.cpp +236 -0
  251. package/cpp/zxing-core/core/src/oned/ODCode128Reader.h +21 -0
  252. package/cpp/zxing-core/core/src/oned/ODCode128Writer.cpp +261 -0
  253. package/cpp/zxing-core/core/src/oned/ODCode128Writer.h +34 -0
  254. package/cpp/zxing-core/core/src/oned/ODCode39Reader.cpp +213 -0
  255. package/cpp/zxing-core/core/src/oned/ODCode39Reader.h +26 -0
  256. package/cpp/zxing-core/core/src/oned/ODCode39Writer.cpp +176 -0
  257. package/cpp/zxing-core/core/src/oned/ODCode39Writer.h +34 -0
  258. package/cpp/zxing-core/core/src/oned/ODCode93Patterns.h +80 -0
  259. package/cpp/zxing-core/core/src/oned/ODCode93Reader.cpp +112 -0
  260. package/cpp/zxing-core/core/src/oned/ODCode93Reader.h +21 -0
  261. package/cpp/zxing-core/core/src/oned/ODCode93Writer.cpp +192 -0
  262. package/cpp/zxing-core/core/src/oned/ODCode93Writer.h +32 -0
  263. package/cpp/zxing-core/core/src/oned/ODDXFilmEdgeReader.cpp +246 -0
  264. package/cpp/zxing-core/core/src/oned/ODDXFilmEdgeReader.h +26 -0
  265. package/cpp/zxing-core/core/src/oned/ODDataBarCommon.cpp +172 -0
  266. package/cpp/zxing-core/core/src/oned/ODDataBarCommon.h +204 -0
  267. package/cpp/zxing-core/core/src/oned/ODDataBarExpandedBitDecoder.cpp +253 -0
  268. package/cpp/zxing-core/core/src/oned/ODDataBarExpandedBitDecoder.h +19 -0
  269. package/cpp/zxing-core/core/src/oned/ODDataBarExpandedReader.cpp +383 -0
  270. package/cpp/zxing-core/core/src/oned/ODDataBarExpandedReader.h +25 -0
  271. package/cpp/zxing-core/core/src/oned/ODDataBarLimitedReader.cpp +163 -0
  272. package/cpp/zxing-core/core/src/oned/ODDataBarLimitedReader.h +23 -0
  273. package/cpp/zxing-core/core/src/oned/ODDataBarReader.cpp +240 -0
  274. package/cpp/zxing-core/core/src/oned/ODDataBarReader.h +25 -0
  275. package/cpp/zxing-core/core/src/oned/ODEAN13Writer.cpp +62 -0
  276. package/cpp/zxing-core/core/src/oned/ODEAN13Writer.h +34 -0
  277. package/cpp/zxing-core/core/src/oned/ODEAN8Writer.cpp +51 -0
  278. package/cpp/zxing-core/core/src/oned/ODEAN8Writer.h +34 -0
  279. package/cpp/zxing-core/core/src/oned/ODITFReader.cpp +97 -0
  280. package/cpp/zxing-core/core/src/oned/ODITFReader.h +33 -0
  281. package/cpp/zxing-core/core/src/oned/ODITFWriter.cpp +78 -0
  282. package/cpp/zxing-core/core/src/oned/ODITFWriter.h +34 -0
  283. package/cpp/zxing-core/core/src/oned/ODMultiUPCEANReader.cpp +323 -0
  284. package/cpp/zxing-core/core/src/oned/ODMultiUPCEANReader.h +32 -0
  285. package/cpp/zxing-core/core/src/oned/ODReader.cpp +259 -0
  286. package/cpp/zxing-core/core/src/oned/ODReader.h +35 -0
  287. package/cpp/zxing-core/core/src/oned/ODRowReader.h +222 -0
  288. package/cpp/zxing-core/core/src/oned/ODTelepenReader.cpp +199 -0
  289. package/cpp/zxing-core/core/src/oned/ODTelepenReader.h +25 -0
  290. package/cpp/zxing-core/core/src/oned/ODUPCAWriter.cpp +33 -0
  291. package/cpp/zxing-core/core/src/oned/ODUPCAWriter.h +34 -0
  292. package/cpp/zxing-core/core/src/oned/ODUPCEANCommon.cpp +80 -0
  293. package/cpp/zxing-core/core/src/oned/ODUPCEANCommon.h +129 -0
  294. package/cpp/zxing-core/core/src/oned/ODUPCEWriter.cpp +56 -0
  295. package/cpp/zxing-core/core/src/oned/ODUPCEWriter.h +34 -0
  296. package/cpp/zxing-core/core/src/oned/ODWriterHelper.cpp +39 -0
  297. package/cpp/zxing-core/core/src/oned/ODWriterHelper.h +48 -0
  298. package/cpp/zxing-core/core/src/pdf417/MicroPDFReader.cpp +796 -0
  299. package/cpp/zxing-core/core/src/pdf417/MicroPDFReader.h +23 -0
  300. package/cpp/zxing-core/core/src/pdf417/PDF417.cpp +85 -0
  301. package/cpp/zxing-core/core/src/pdf417/PDF417.h +81 -0
  302. package/cpp/zxing-core/core/src/pdf417/PDFBarcodeMetadata.h +53 -0
  303. package/cpp/zxing-core/core/src/pdf417/PDFBarcodeValue.cpp +48 -0
  304. package/cpp/zxing-core/core/src/pdf417/PDFBarcodeValue.h +38 -0
  305. package/cpp/zxing-core/core/src/pdf417/PDFBoundingBox.cpp +116 -0
  306. package/cpp/zxing-core/core/src/pdf417/PDFBoundingBox.h +75 -0
  307. package/cpp/zxing-core/core/src/pdf417/PDFCodeword.h +71 -0
  308. package/cpp/zxing-core/core/src/pdf417/PDFCodewordDecoder.cpp +588 -0
  309. package/cpp/zxing-core/core/src/pdf417/PDFCodewordDecoder.h +41 -0
  310. package/cpp/zxing-core/core/src/pdf417/PDFCompaction.h +20 -0
  311. package/cpp/zxing-core/core/src/pdf417/PDFCustomData.h +32 -0
  312. package/cpp/zxing-core/core/src/pdf417/PDFDecoder.cpp +725 -0
  313. package/cpp/zxing-core/core/src/pdf417/PDFDecoder.h +20 -0
  314. package/cpp/zxing-core/core/src/pdf417/PDFDetectionResult.cpp +247 -0
  315. package/cpp/zxing-core/core/src/pdf417/PDFDetectionResult.h +74 -0
  316. package/cpp/zxing-core/core/src/pdf417/PDFDetectionResultColumn.cpp +321 -0
  317. package/cpp/zxing-core/core/src/pdf417/PDFDetectionResultColumn.h +83 -0
  318. package/cpp/zxing-core/core/src/pdf417/PDFDetector.cpp +371 -0
  319. package/cpp/zxing-core/core/src/pdf417/PDFDetector.h +45 -0
  320. package/cpp/zxing-core/core/src/pdf417/PDFEncoder.cpp +570 -0
  321. package/cpp/zxing-core/core/src/pdf417/PDFEncoder.h +182 -0
  322. package/cpp/zxing-core/core/src/pdf417/PDFHighLevelEncoder.cpp +570 -0
  323. package/cpp/zxing-core/core/src/pdf417/PDFHighLevelEncoder.h +32 -0
  324. package/cpp/zxing-core/core/src/pdf417/PDFReader.cpp +333 -0
  325. package/cpp/zxing-core/core/src/pdf417/PDFReader.h +28 -0
  326. package/cpp/zxing-core/core/src/pdf417/PDFScanningDecoder.cpp +559 -0
  327. package/cpp/zxing-core/core/src/pdf417/PDFScanningDecoder.h +41 -0
  328. package/cpp/zxing-core/core/src/pdf417/PDFWriter.cpp +170 -0
  329. package/cpp/zxing-core/core/src/pdf417/PDFWriter.h +74 -0
  330. package/cpp/zxing-core/core/src/pdf417/ZXBigInteger.cpp +623 -0
  331. package/cpp/zxing-core/core/src/pdf417/ZXBigInteger.h +81 -0
  332. package/cpp/zxing-core/core/src/pdf417/ZXNullable.h +105 -0
  333. package/cpp/zxing-core/core/src/qrcode/QRBitMatrixParser.cpp +294 -0
  334. package/cpp/zxing-core/core/src/qrcode/QRBitMatrixParser.h +41 -0
  335. package/cpp/zxing-core/core/src/qrcode/QRCodecMode.cpp +95 -0
  336. package/cpp/zxing-core/core/src/qrcode/QRCodecMode.h +59 -0
  337. package/cpp/zxing-core/core/src/qrcode/QRDataBlock.cpp +93 -0
  338. package/cpp/zxing-core/core/src/qrcode/QRDataBlock.h +52 -0
  339. package/cpp/zxing-core/core/src/qrcode/QRDataMask.h +50 -0
  340. package/cpp/zxing-core/core/src/qrcode/QRDecoder.cpp +359 -0
  341. package/cpp/zxing-core/core/src/qrcode/QRDecoder.h +19 -0
  342. package/cpp/zxing-core/core/src/qrcode/QRDetector.cpp +920 -0
  343. package/cpp/zxing-core/core/src/qrcode/QRDetector.h +45 -0
  344. package/cpp/zxing-core/core/src/qrcode/QRECB.h +52 -0
  345. package/cpp/zxing-core/core/src/qrcode/QREncodeResult.h +33 -0
  346. package/cpp/zxing-core/core/src/qrcode/QREncoder.cpp +568 -0
  347. package/cpp/zxing-core/core/src/qrcode/QREncoder.h +21 -0
  348. package/cpp/zxing-core/core/src/qrcode/QRErrorCorrectionLevel.cpp +51 -0
  349. package/cpp/zxing-core/core/src/qrcode/QRErrorCorrectionLevel.h +39 -0
  350. package/cpp/zxing-core/core/src/qrcode/QRFormatInformation.cpp +160 -0
  351. package/cpp/zxing-core/core/src/qrcode/QRFormatInformation.h +61 -0
  352. package/cpp/zxing-core/core/src/qrcode/QRMaskUtil.cpp +156 -0
  353. package/cpp/zxing-core/core/src/qrcode/QRMaskUtil.h +15 -0
  354. package/cpp/zxing-core/core/src/qrcode/QRMatrixUtil.cpp +318 -0
  355. package/cpp/zxing-core/core/src/qrcode/QRMatrixUtil.h +25 -0
  356. package/cpp/zxing-core/core/src/qrcode/QRReader.cpp +149 -0
  357. package/cpp/zxing-core/core/src/qrcode/QRReader.h +21 -0
  358. package/cpp/zxing-core/core/src/qrcode/QRVersion.cpp +754 -0
  359. package/cpp/zxing-core/core/src/qrcode/QRVersion.h +127 -0
  360. package/cpp/zxing-core/core/src/qrcode/QRWriter.cpp +51 -0
  361. package/cpp/zxing-core/core/src/qrcode/QRWriter.h +74 -0
  362. package/cpp/zxing-core/core/version.rc.in +34 -0
  363. package/cpp/zxing-core/core/zxing.pc.in +8 -0
  364. package/cpp/zxing-core/wrappers/ios/README.md +25 -0
  365. package/cpp/zxing-core/wrappers/ios/Sources/Wrapper/Version.h +29 -0
  366. package/cpp/zxing-core/zxing-cpp.podspec +45 -0
  367. package/lib/factory.d.ts +10 -0
  368. package/lib/factory.js +12 -0
  369. package/lib/index.d.ts +9 -0
  370. package/lib/index.js +9 -0
  371. package/lib/specs/Barcode.nitro.d.ts +63 -0
  372. package/lib/specs/Barcode.nitro.js +1 -0
  373. package/lib/specs/BarcodeFormat.d.ts +11 -0
  374. package/lib/specs/BarcodeFormat.js +1 -0
  375. package/lib/specs/BarcodeScanner.nitro.d.ts +89 -0
  376. package/lib/specs/BarcodeScanner.nitro.js +1 -0
  377. package/lib/specs/BarcodeScannerFactory.nitro.d.ts +26 -0
  378. package/lib/specs/BarcodeScannerFactory.nitro.js +1 -0
  379. package/lib/specs/BarcodeValueType.d.ts +9 -0
  380. package/lib/specs/BarcodeValueType.js +1 -0
  381. package/lib/specs/Point.d.ts +14 -0
  382. package/lib/specs/Point.js +1 -0
  383. package/lib/specs/Rect.d.ts +22 -0
  384. package/lib/specs/Rect.js +1 -0
  385. package/lib/useBarcodeScanner.d.ts +23 -0
  386. package/lib/useBarcodeScanner.js +25 -0
  387. package/nitro.json +20 -0
  388. package/nitrogen/generated/.gitattributes +1 -0
  389. package/nitrogen/generated/android/VisionCameraZxing+autolinking.cmake +83 -0
  390. package/nitrogen/generated/android/VisionCameraZxing+autolinking.gradle +27 -0
  391. package/nitrogen/generated/android/VisionCameraZxingOnLoad.cpp +49 -0
  392. package/nitrogen/generated/android/VisionCameraZxingOnLoad.hpp +34 -0
  393. package/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/zxing/VisionCameraZxingOnLoad.kt +35 -0
  394. package/nitrogen/generated/ios/VisionCameraZxing+autolinking.rb +62 -0
  395. package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Bridge.cpp +17 -0
  396. package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Bridge.hpp +27 -0
  397. package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Umbrella.hpp +38 -0
  398. package/nitrogen/generated/ios/VisionCameraZxingAutolinking.mm +35 -0
  399. package/nitrogen/generated/ios/VisionCameraZxingAutolinking.swift +16 -0
  400. package/nitrogen/generated/shared/c++/BarcodeFormat.hpp +124 -0
  401. package/nitrogen/generated/shared/c++/BarcodeScannerOptions.hpp +85 -0
  402. package/nitrogen/generated/shared/c++/BarcodeValueType.hpp +120 -0
  403. package/nitrogen/generated/shared/c++/HybridBarcodeScannerSpec.cpp +23 -0
  404. package/nitrogen/generated/shared/c++/HybridBarcodeScannerSpec.hpp +74 -0
  405. package/nitrogen/generated/shared/c++/HybridBarcodeSpec.cpp +27 -0
  406. package/nitrogen/generated/shared/c++/HybridBarcodeSpec.hpp +82 -0
  407. package/nitrogen/generated/shared/c++/HybridZXingBarcodeScannerFactorySpec.cpp +21 -0
  408. package/nitrogen/generated/shared/c++/HybridZXingBarcodeScannerFactorySpec.hpp +67 -0
  409. package/nitrogen/generated/shared/c++/Point.hpp +87 -0
  410. package/nitrogen/generated/shared/c++/Rect.hpp +95 -0
  411. package/nitrogen/generated/shared/c++/TargetBarcodeFormat.hpp +124 -0
  412. package/package.json +108 -0
  413. package/react-native.config.js +16 -0
  414. package/src/factory.ts +26 -0
  415. package/src/index.ts +9 -0
  416. package/src/specs/Barcode.nitro.ts +70 -0
  417. package/src/specs/BarcodeFormat.ts +31 -0
  418. package/src/specs/BarcodeScanner.nitro.ts +91 -0
  419. package/src/specs/BarcodeScannerFactory.nitro.ts +27 -0
  420. package/src/specs/BarcodeValueType.ts +25 -0
  421. package/src/specs/Point.ts +14 -0
  422. package/src/specs/Rect.ts +22 -0
  423. package/src/useBarcodeScanner.ts +36 -0
@@ -0,0 +1,66 @@
1
+ /*
2
+ * Copyright 2025 Axel Waggershauser
3
+ */
4
+ // SPDX-License-Identifier: Apache-2.0
5
+
6
+ #pragma once
7
+
8
+ #include "ZXAlgorithms.h"
9
+
10
+ #include <cstring>
11
+ #ifdef __cpp_lib_format // not available on gcc 12
12
+ #include <format>
13
+ #endif
14
+ #include <optional>
15
+ #include <string>
16
+ #include <string_view>
17
+
18
+ namespace ZXing {
19
+
20
+ std::string JsonEscapeStr(std::string_view str);
21
+ std::string JsonUnEscapeStr(std::string_view str);
22
+
23
+ template<typename T>
24
+ inline std::string JsonProp(std::string_view key, const T& val, const T& ignore = {})
25
+ {
26
+ #define ZX_JSON_KEY_VAL(...) StrCat("\"", key, "\":", __VA_ARGS__, ',')
27
+ #if !defined(__cpp_lib_to_chars) || !defined(__cpp_lib_format) // not available on older macOS / gcc 12
28
+ #define ZX_JSON_FMT_FLOAT(val) (std::to_string(int(val)) + '.' + std::to_string(int(val * 100) % 100))
29
+ #else
30
+ #define ZX_JSON_FMT_FLOAT(val) std::format("{:.2f}", val)
31
+ #endif
32
+
33
+ if constexpr (std::is_same_v<T, bool>)
34
+ return val != ignore ? ZX_JSON_KEY_VAL(val ? "true" : "false") : "";
35
+ else if constexpr (std::is_floating_point_v<T>)
36
+ return val != ignore ? ZX_JSON_KEY_VAL(ZX_JSON_FMT_FLOAT(val)) : "";
37
+ else if constexpr (std::is_integral_v<T>)
38
+ return val != ignore ? ZX_JSON_KEY_VAL(std::to_string(val)) : "";
39
+ else if constexpr (std::is_convertible_v<T, std::string_view>)
40
+ return std::string_view(val) != std::string_view(ignore) ? ZX_JSON_KEY_VAL("\"", JsonEscapeStr(val), "\"") : "";
41
+ else
42
+ static_assert("unsupported JSON value type");
43
+ #undef ZX_JSON_KEY_VAL
44
+ }
45
+
46
+ // Finds the (potentially escaped / raw) value of the provided key
47
+ std::string_view JsonFind(std::string_view json, std::string_view key);
48
+
49
+ template <typename T>
50
+ inline std::optional<T> JsonGet(std::string_view json, std::string_view key)
51
+ {
52
+ auto str = JsonFind(json, key);
53
+ if (!str.data())
54
+ return std::nullopt;
55
+
56
+ if constexpr (std::is_same_v<bool, T>)
57
+ return str.empty() || Contains("1tT", str.front()) ? std::optional(true) : std::nullopt;
58
+ else if constexpr (std::is_arithmetic_v<T>)
59
+ return str.empty() ? std::nullopt : std::optional(FromString<T>(str));
60
+ else if constexpr (std::is_same_v<std::string, T>)
61
+ return JsonUnEscapeStr(str);
62
+ else
63
+ static_assert("unsupported JSON value type");
64
+ }
65
+
66
+ } // ZXing
@@ -0,0 +1,242 @@
1
+ // Copyright 2026 Axel Waggershauser
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ #include "LocalGrid.h"
5
+
6
+ #include "LogMatrix.h"
7
+ #include "StdGenerator.h"
8
+ #include "ZXAlgorithms.h"
9
+
10
+ #include <algorithm>
11
+ #include <optional>
12
+ #include <ranges>
13
+ #include <span>
14
+ #include <vector>
15
+
16
+ #ifndef PRINT_DEBUG
17
+ #define printf(...){}
18
+ #endif
19
+
20
+ namespace ZXing {
21
+
22
+ // returns the average of the largest cluster of values where cluster is defined as values that are within threshold of each other
23
+ double clusterAvg(std::ranges::range auto& v, double threshold)
24
+ {
25
+ std::ranges::sort(v);
26
+ size_t bestStart = 0, bestLen = 0, start = 0;
27
+ for (size_t end = 0; end < v.size(); ++end) {
28
+ while (v[end] - v[start] >= threshold)
29
+ ++start;
30
+ if (end - start + 1 > bestLen) {
31
+ bestLen = end - start + 1;
32
+ bestStart = start;
33
+ }
34
+ }
35
+ double sum = 0;
36
+ for (size_t i = bestStart; i < bestStart + bestLen; ++i)
37
+ sum += v[i];
38
+ sum /= bestLen;
39
+
40
+ #ifdef PRINT_DEBUG
41
+ printf("ds: ");
42
+ for (auto d : v)
43
+ printf("%5.2f ", d);
44
+ printf(" -> len: %zu, avg: %5.2f\n", bestLen, sum);
45
+ #endif
46
+ return sum;
47
+ };
48
+
49
+ void LocalGrid::adjustOriginAndStep(PointF& step, int radius, const std::span<const PointF> offsets)
50
+ {
51
+ auto modSize = length(step);
52
+ int limit = int(6 * modSize);
53
+ auto dir = bresenhamDirection(step);
54
+ modSize /= length(dir); // mod size in terms of steps in the given direction
55
+ printf("step: (%.2f, %.2f) %.2f: ", step.x, step.y, modSize);
56
+
57
+ auto nearestHalfResidual = [](double n, double s) { return n - (std::round((n - s / 2) / s) * s + s / 2); };
58
+
59
+ struct DistMod {
60
+ double dist, modSize;
61
+ };
62
+ thread_local std::vector<DistMod> distMod;
63
+ distMod.clear();
64
+ distMod.reserve(offsets.size() * radius + 1);
65
+ for (int r = 0; r <= radius; ++r)
66
+ for (auto offset : offsets) {
67
+ auto start = origin + r * offset;
68
+ auto startC = centered(start);
69
+ int stepsPos = BitMatrixCursorF(*img, startC, dir).stepToEdge(1, limit);
70
+ int stepsNeg = BitMatrixCursorF(*img, startC, -dir).stepToEdge(1, limit);
71
+ auto distPos = stepsPos - dot(start - startC, dir) - 0.5; // +0.5 because the center of the pixel is at .5, .5
72
+ auto distNeg = stepsNeg - dot(start - startC, -dir) - 0.5;
73
+
74
+ if (stepsPos && stepsNeg) {
75
+ int blockSize = stepsPos + stepsNeg - 1;
76
+ auto localModSize = blockSize / std::max(1.0, std::round(blockSize / modSize));
77
+ distMod.emplace_back(distPos, blockSize / modSize < 5 ? localModSize : 0.0);
78
+ // if (r == 0 && (std::min(distNeg, distPos) < modSize / 4)) {
79
+ // origin += (distNeg < distPos ? 1 : -1) * modSize / 4 * dir;
80
+ // continue;
81
+ // }
82
+ }
83
+ else if (stepsPos)
84
+ distMod.emplace_back(distPos, 0.0);
85
+ else if (stepsNeg)
86
+ distMod.emplace_back(-distNeg, 0.0);
87
+
88
+ printf("+%.2f -%.2f (%.1f) | ", distPos, distNeg, distMod.empty() ? 0.0 : distMod.back().modSize);
89
+
90
+ if (r == 0)
91
+ break; // only do the center point once
92
+ }
93
+
94
+ // calcuate the average local module size from the points where we found one...
95
+ double localModSize = 0.0;
96
+ int n = 0;
97
+ for (const auto& t : distMod | std::views::filter([](const DistMod& t) { return t.modSize > 0; }))
98
+ localModSize += t.modSize, ++n;
99
+ if (n == 0)
100
+ return;
101
+ localModSize /= n;
102
+ printf("\nlocal mod size: %.2f\n", localModSize);
103
+
104
+ // ... and use it for the points where we didn't find one
105
+ thread_local std::vector<double> d;
106
+ d.clear();
107
+ d.reserve(distMod.size());
108
+ for (auto& t : distMod) {
109
+ if (t.modSize == 0.0)
110
+ t.modSize = localModSize;
111
+ d.push_back(t.dist < 0 ? -nearestHalfResidual(-t.dist, t.modSize) : nearestHalfResidual(t.dist, t.modSize));
112
+ printf("%.2f (%.1f) -> %.2f | ", t.dist, t.modSize, d.back());
113
+ }
114
+ printf("\n");
115
+
116
+ origin += clusterAvg(d, modSize / 2) * dir;
117
+
118
+ // if we found local mod sizes for each point (hopefully at the timing pattern crosses), we update the step size
119
+ if (n == Size(distMod) && std::abs(localModSize - modSize) > modSize * 0.1) {
120
+ step = localModSize / modSize * step;
121
+ printf(" adjusted mod size from %.2f to %.2f\n", modSize, localModSize);
122
+ }
123
+ }
124
+
125
+ LocalGrid::LocalGrid(const BitMatrix& image, const PerspectiveTransform& mod2Pix, PointI p, PointI dim, PointI offset)
126
+ : img(&image), dim(dim), center(p)
127
+ {
128
+ origin = mod2Pix(centered(p));
129
+ stepX = mod2Pix(centered(p) + PointF{1, 0}) - origin;
130
+ stepY = mod2Pix(centered(p) + PointF{0, 1}) - origin;
131
+
132
+ printf("LocalGrid @ (%d, %d), initial origin: (%.2f, %.2f), offset: (%d, %d), stepX: (%.2f, %.2f), stepY: (%.2f, %.2f)\n",
133
+ center.x, center.y, origin.x, origin.y, offset.x, offset.y, stepX.x, stepX.y, stepY.x, stepY.y);
134
+ log(origin, 3);
135
+
136
+ auto offsets = std::array{-stepX, -stepY, stepX, stepY}; // works better for DataMatrix (especially near the symbol edges)
137
+ // auto offsets = std::array{-stepX - stepY, stepX - stepY, stepX + stepY, -stepX + stepY};
138
+ // auto offsets = std::array{-stepX, -stepY, stepX, stepY, -stepX - stepY, stepX - stepY, stepX + stepY, -stepX + stepY};
139
+
140
+ // evaluate the image at origin + offset (allows to effectively work near the border of the symbol)
141
+ origin = getPos(PointF(offset));
142
+ for (int i = 0; i < 2; ++i) {
143
+ adjustOriginAndStep(stepX, 2, offsets);
144
+ adjustOriginAndStep(stepY, 2, offsets);
145
+ printf("\n");
146
+ }
147
+ origin = getPos(PointF(-offset));
148
+ }
149
+
150
+ bool LocalGrid::isTimingPatternCross(PointI p, bool isBlack, int radius, int errorThreshold)
151
+ {
152
+ // TODO: look into replacing this with something along the lines of CheckSymmetricAztecCenterPattern
153
+ auto wrapOffset = [&](int center, int offset, int dim) {
154
+ int pos = center + offset;
155
+ return pos < 0 ? radius - pos : (pos >= dim ? -(radius + (pos - dim) + 1) : offset);
156
+ };
157
+
158
+ int errors = 0;
159
+ for (int r = 0; r <= radius; ++r) {
160
+ auto check = [&](int x, int y) {
161
+ x = wrapOffset(center.x, x, dim.x);
162
+ y = wrapOffset(center.y, y, dim.y);
163
+ auto d = PointI(x, y);
164
+ errors += !findValue(p + d, d, Value((x + y) % 2 == (isBlack ? 0 : 1)));
165
+ };
166
+ check(-r, 0);
167
+ check(r, 0);
168
+ check(0, -r);
169
+ check(0, r);
170
+ if (errors > errorThreshold)
171
+ return false;
172
+ }
173
+ return errors <= errorThreshold;
174
+ };
175
+
176
+ std::optional<PointF> LocalGrid::findTimingPatternCross(bool isBlack, int radius)
177
+ {
178
+ for (auto p : Spiral(3)) {
179
+ // check if there is a timing pattern cross candidate centered at p with half the radius
180
+ if (isTimingPatternCross(p, isBlack, radius / 2)) {
181
+ auto original = origin;
182
+ origin = getPos(p);
183
+ // adjust origin and step with full radius and only in the direction of the timing pattern
184
+ printf("timing pattern:\n");
185
+ adjustOriginAndStep(stepX, radius, std::array{-stepX, stepX});
186
+ adjustOriginAndStep(stepY, radius, std::array{-stepY, stepY});
187
+
188
+ // check again, now with the full radius, to make sure we are correctly aligned to the timing pattern
189
+ if (isTimingPatternCross(PointI{0, 0}, isBlack, radius))
190
+ return origin;
191
+
192
+ origin = original;
193
+ }
194
+ }
195
+ return {};
196
+ }
197
+
198
+ bool LocalGrid::findPattern(int radius, PointI timingStart, Directions timingDirs, PointI blackStart, Directions blackDirs,
199
+ PointI whiteStart, Directions whiteDirs)
200
+ {
201
+ auto isPatternAt = [&](PointI p) {
202
+ for (int r = 0; r <= radius; ++r) {
203
+ for (auto d : timingDirs)
204
+ if (!findValue(p + timingStart + r * d, d, Value(r % 2 == 1)))
205
+ return false;
206
+ for (auto d : blackDirs)
207
+ if (!findValue(p + blackStart + r * d, d, Value(true)))
208
+ return false;
209
+ for (auto d : whiteDirs)
210
+ if (!findValue(p + whiteStart + r * d, d, Value(false)))
211
+ return false;
212
+ }
213
+ return true;
214
+ };
215
+
216
+ for (auto p : Spiral(3)) {
217
+ if (isPatternAt(p)) {
218
+ auto original = origin;
219
+ origin = getPos(PointF(p));
220
+ // adjust origin and step with full radius and only in the direction of the timing pattern
221
+ printf("found pattern at (%.2f, %.2f)\n", origin.x, origin.y);
222
+ std::vector<PointF> stepsX, stepsY;
223
+ for (auto d : timingDirs)
224
+ d.y == 0 ? stepsX.push_back(d.x * stepX) : stepsY.push_back(d.y * stepY);
225
+
226
+ if (!stepsX.empty())
227
+ adjustOriginAndStep(stepX, radius, stepsX);
228
+ if (!stepsY.empty())
229
+ adjustOriginAndStep(stepY, radius, stepsY);
230
+ if ((!stepsX.empty() || !stepsY.empty()) && !isPatternAt(PointI{0, 0})) {
231
+ origin = original;
232
+ printf("pattern lost after adjusting for timing pattern, reverting origin\n");
233
+ }
234
+ printf("\n");
235
+ return true;
236
+ }
237
+ }
238
+ printf("\n");
239
+ return false;
240
+ }
241
+
242
+ } // namespace ZXing
@@ -0,0 +1,91 @@
1
+ // Copyright 2026 Axel Waggershauser
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ #pragma once
5
+
6
+ #include "BitMatrixCursor.h"
7
+ #include "BitMatrix.h"
8
+ #include "LogMatrix.h"
9
+ #include "Point.h"
10
+ #include "PerspectiveTransform.h"
11
+
12
+ #include <optional>
13
+ #include <span>
14
+
15
+ namespace ZXing {
16
+
17
+ /**
18
+ * @brief Represents a local grid for sampling and analyzing regions within a BitMatrix image.
19
+ *
20
+ * The LocalGrid class tries to find the center of a module and step vectors that point to the next module in x and y direction.
21
+ * It provides methods to get the position of a point in the grid and to sample values from the image at those positions.
22
+ * It supports searching for timing pattern crosses and specific (alignment) patterns within the grid, which updates the origin and
23
+ * step vectors accordingly.
24
+ */
25
+ class LocalGrid
26
+ {
27
+ const BitMatrix* img;
28
+ PointF origin, stepX, stepY;
29
+ PointI dim, center;
30
+
31
+ using Value = BitMatrixCursorF::Value;
32
+
33
+ void adjustOriginAndStep(PointF& dir, int radius, std::span<const PointF> offsets);
34
+ bool isTimingPatternCross(PointI p, bool isBlack, int radius, int errorThreshold = 0);
35
+ bool findValue(PointI p, PointI dir, Value v)
36
+ {
37
+ // check if there is a value v at p or a quarter module before or after p or p is outside the image
38
+ auto d = PointF(dir.x ? 0.25 : 0.0, dir.y ? 0.25 : 0.0);
39
+ return !img->isIn(getPos(p)) || get(p) == v || get(p + d) == v || get(p - d) == v;
40
+ };
41
+
42
+ public:
43
+
44
+ /**
45
+ * @brief Constructs a LocalGrid object for mapping a region of a BitMatrix using a perspective transform.
46
+ *
47
+ * @param image The source BitMatrix representing the image data.
48
+ * @param mod2Pix The (global) PerspectiveTransform used to map module coordinates to pixel coordinates.
49
+ * @param p The logical position of the grid origin in module coordinates.
50
+ * @param dim The dimensions (width and height) of the (global) grid in modules.
51
+ * @param offset Optional offset in modules to specify the starting position of the search for the module center.
52
+ */
53
+ LocalGrid(const BitMatrix& image, const PerspectiveTransform& mod2Pix, PointI p, PointI dim, PointI offset = {});
54
+
55
+ inline PointF getPos(PointF p = {}) const { return origin + p.x * stepX + p.y * stepY; }
56
+ inline PointF getPos(PointI p) const { return getPos(PointF(p.x, p.y)); }
57
+
58
+ inline Value get(PointF p) const
59
+ {
60
+ auto q = getPos(p);
61
+ log(q, 4);
62
+ return img->isIn(q) ? Value{img->get(q)} : Value{};
63
+ }
64
+
65
+ inline Value get(PointI p) const { return get(PointF(p.x, p.y)); }
66
+
67
+ /**
68
+ * @brief Finds the center of a timing pattern cross in the local grid.
69
+ *
70
+ * This function searches for the center point of a timing pattern cross, which is a key feature in Aztec code detection, within a
71
+ * specified radius.
72
+ *
73
+ * @param isBlack Indicates whether the central module of the timing pattern cross is expected to be black or white.
74
+ * @param radius The length of the timing pattern cross arms.
75
+ * @return An optional PointF representing the center of the timing pattern cross if found; std::nullopt otherwise.
76
+ */
77
+ std::optional<PointF> findTimingPatternCross(bool isBlack, int radius);
78
+
79
+ using Directions = std::span<const PointI>;
80
+
81
+ /**
82
+ * @brief Searches for a specific pattern within a grid based on provided parameters.
83
+ *
84
+ * This function attempts to locate a pattern in the grid by starting from given points
85
+ * and following specified directions for timing, black, and white modules.
86
+ */
87
+ bool findPattern(int radius, PointI timingStart, Directions timingDirs, PointI blackStart, Directions blackDirs, PointI whiteStart,
88
+ Directions whiteDirs);
89
+ };
90
+
91
+ } // namespace ZXing
@@ -0,0 +1,105 @@
1
+ /*
2
+ * Copyright 2020 Axel Waggershauser
3
+ */
4
+ // SPDX-License-Identifier: Apache-2.0
5
+
6
+ #pragma once
7
+
8
+ #include "BitMatrix.h"
9
+ #include "Matrix.h"
10
+ #include "Point.h"
11
+
12
+ #include <cassert>
13
+ #include <cstdint>
14
+ #include <cstdio>
15
+ #include <string>
16
+
17
+ namespace ZXing {
18
+
19
+ #ifdef PRINT_DEBUG
20
+
21
+ class LogMatrix
22
+ {
23
+ using LogBuffer = Matrix<int8_t>;
24
+ LogBuffer _log;
25
+ const BitMatrix* _image = nullptr;
26
+ int _scale = 1;
27
+
28
+ public:
29
+ void init(const BitMatrix* image, int scale = 1)
30
+ {
31
+ _image = image;
32
+ _scale = scale;
33
+ _log = LogBuffer(_image->width() * _scale, _image->height() * _scale);
34
+ }
35
+
36
+ void write(const char* fn)
37
+ {
38
+ assert(_image);
39
+ FILE* f = fopen(fn, "wb");
40
+
41
+ // Write PPM header, P5 == grey, P6 == rgb
42
+ fprintf(f, "P6\n%d %d\n255\n", _log.width(), _log.height());
43
+
44
+ // Write pixels
45
+ for (int y = 0; y < _log.height(); ++y)
46
+ for (int x = 0; x < _log.width(); ++x) {
47
+ unsigned char pix[3];
48
+ unsigned char &r = pix[0], &g = pix[1], &b = pix[2];
49
+ r = g = b = _image->get(x / _scale, y / _scale) ? 0 : 255;
50
+ if (_scale > 1 && x % _scale == _scale / 2 && y % _scale == _scale / 2)
51
+ r = g = b = r ? 240 : 45;
52
+ switch (_log.get(x, y)) {
53
+ case -1: r = g = b = _scale > 1 ? 255 - r : (r ? 50 : 230); break;
54
+ case 1: r = g = b = _scale > 1 ? 128 : (r ? 230 : 50); break;
55
+ case 2: r = b = 50, g = 220; break;
56
+ case 3: g = r = 100, b = 250; break;
57
+ case 4: g = b = 100, r = 250; break;
58
+ }
59
+ fwrite(&pix, 3, 1, f);
60
+ }
61
+ fclose(f);
62
+ }
63
+
64
+ template <typename T>
65
+ void operator()(const PointT<T>& p, int color = 1)
66
+ {
67
+ if (_image && _image->isIn(p))
68
+ _log.set(static_cast<int>(p.x * _scale), static_cast<int>(p.y * _scale), color);
69
+ }
70
+
71
+ void operator()(const PointT<int>& p, int color)
72
+ {
73
+ operator()(centered(p), color);
74
+ }
75
+
76
+ template <typename T>
77
+ void operator()(const std::vector<PointT<T>>& points, int color = 2)
78
+ {
79
+ for (auto p : points)
80
+ operator()(p, color);
81
+ }
82
+ };
83
+
84
+ extern LogMatrix log;
85
+
86
+ class LogMatrixWriter
87
+ {
88
+ LogMatrix &log;
89
+ std::string fn;
90
+
91
+ public:
92
+ LogMatrixWriter(LogMatrix& log, const BitMatrix& image, int scale, std::string fn) : log(log), fn(fn)
93
+ {
94
+ log.init(&image, scale);
95
+ }
96
+ ~LogMatrixWriter() { log.write(fn.c_str()); }
97
+ };
98
+
99
+ #else
100
+
101
+ template<typename T> void log(PointT<T>, int = 0) {}
102
+
103
+ #endif
104
+
105
+ } // namespace ZXing
@@ -0,0 +1,125 @@
1
+ /*
2
+ * Copyright 2016 Huy Cuong Nguyen
3
+ * Copyright 2016 ZXing authors
4
+ */
5
+ // SPDX-License-Identifier: Apache-2.0
6
+
7
+ #pragma once
8
+
9
+ #include "Point.h"
10
+
11
+ #include <stdexcept>
12
+ #include <algorithm>
13
+ #include <cassert>
14
+ #include <vector>
15
+
16
+ namespace ZXing {
17
+
18
+ template <class T>
19
+ class Matrix
20
+ {
21
+ public:
22
+ using value_t = T;
23
+
24
+ private:
25
+ int _width = 0;
26
+ int _height = 0;
27
+ std::vector<value_t> _data;
28
+
29
+ // Nothing wrong to support it, just to make it explicit, instead of by mistake.
30
+ // Use copy() below.
31
+ Matrix(const Matrix &) = default;
32
+
33
+ public:
34
+ Matrix() = default;
35
+
36
+ #if defined(__llvm__) || (defined(__GNUC__) && (__GNUC__ > 7))
37
+ __attribute__((no_sanitize("signed-integer-overflow")))
38
+ #endif
39
+ Matrix(int width, int height, value_t val = {}) : _width(width), _height(height), _data(_width * _height, val) {
40
+ if (width != 0 && int(_data.size()) / width != height)
41
+ throw std::invalid_argument("Invalid size: width * height is too big");
42
+ }
43
+
44
+ Matrix(Matrix&&) noexcept = default;
45
+ Matrix& operator=(Matrix&&) noexcept = default;
46
+ Matrix& operator=(const Matrix &) = delete;
47
+
48
+ Matrix copy() const {
49
+ return *this;
50
+ }
51
+
52
+ int height() const {
53
+ return _height;
54
+ }
55
+
56
+ int width() const {
57
+ return _width;
58
+ }
59
+
60
+ int size() const {
61
+ return int(_data.size());
62
+ }
63
+
64
+ value_t& operator()(int x, int y)
65
+ {
66
+ assert(x >= 0 && x < _width && y >= 0 && y < _height);
67
+ return _data[y * _width + x];
68
+ }
69
+
70
+ const T& operator()(int x, int y) const
71
+ {
72
+ assert(x >= 0 && x < _width && y >= 0 && y < _height);
73
+ return _data[y * _width + x];
74
+ }
75
+
76
+ value_t& operator()(PointI p) {
77
+ return operator()(p.x, p.y);
78
+ }
79
+
80
+ const T& operator()(PointI p) const {
81
+ return operator()(p.x, p.y);
82
+ }
83
+
84
+ const value_t& get(int x, int y) const {
85
+ return operator()(x, y);
86
+ }
87
+
88
+ value_t& set(int x, int y, value_t value) {
89
+ return operator()(x, y) = value;
90
+ }
91
+
92
+ const value_t& get(PointI p) const {
93
+ return operator()(p.x, p.y);
94
+ }
95
+
96
+ value_t& set(PointI p, value_t value) {
97
+ return operator()(p.x, p.y) = value;
98
+ }
99
+
100
+ const value_t* data() const {
101
+ return _data.data();
102
+ }
103
+
104
+ const value_t* begin() const {
105
+ return _data.data();
106
+ }
107
+
108
+ const value_t* end() const {
109
+ return _data.data() + _width * _height;
110
+ }
111
+
112
+ value_t* begin() {
113
+ return _data.data();
114
+ }
115
+
116
+ value_t* end() {
117
+ return _data.data() + _width * _height;
118
+ }
119
+
120
+ void clear(value_t value = {}) {
121
+ std::fill(_data.begin(), _data.end(), value);
122
+ }
123
+ };
124
+
125
+ } // ZXing