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.
- package/README.md +34 -0
- package/VisionCameraZxing.podspec +48 -0
- package/android/CMakeLists.txt +43 -0
- package/android/build.gradle +150 -0
- package/android/fix-prefab.gradle +51 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +7 -0
- package/android/src/main/java/com/margelo/nitro/camera/zxing/VisionCameraZxingPackage.kt +21 -0
- package/cpp/BarcodeValueTypeClassifier.cpp +70 -0
- package/cpp/BarcodeValueTypeClassifier.hpp +14 -0
- package/cpp/FrameImageView.cpp +75 -0
- package/cpp/FrameImageView.hpp +34 -0
- package/cpp/HybridBarcode.cpp +59 -0
- package/cpp/HybridBarcode.hpp +26 -0
- package/cpp/HybridBarcodeScanner.cpp +121 -0
- package/cpp/HybridBarcodeScanner.hpp +26 -0
- package/cpp/HybridBarcodeScannerFactory.cpp +11 -0
- package/cpp/HybridBarcodeScannerFactory.hpp +14 -0
- package/cpp/ImageDownscaler.cpp +34 -0
- package/cpp/ImageDownscaler.hpp +21 -0
- package/cpp/ZXingDecoder.cpp +189 -0
- package/cpp/ZXingDecoder.hpp +72 -0
- package/cpp/zxing-core/LICENSE +202 -0
- package/cpp/zxing-core/README.md +156 -0
- package/cpp/zxing-core/core/CMakeLists.txt +784 -0
- package/cpp/zxing-core/core/Version.h.in +28 -0
- package/cpp/zxing-core/core/ZXingConfig.cmake.in +9 -0
- package/cpp/zxing-core/core/src/Barcode.cpp +255 -0
- package/cpp/zxing-core/core/src/Barcode.h +191 -0
- package/cpp/zxing-core/core/src/BarcodeData.h +100 -0
- package/cpp/zxing-core/core/src/BarcodeFormat.cpp +286 -0
- package/cpp/zxing-core/core/src/BarcodeFormat.h +272 -0
- package/cpp/zxing-core/core/src/BinaryBitmap.cpp +111 -0
- package/cpp/zxing-core/core/src/BinaryBitmap.h +66 -0
- package/cpp/zxing-core/core/src/BitArray.cpp +38 -0
- package/cpp/zxing-core/core/src/BitArray.h +181 -0
- package/cpp/zxing-core/core/src/BitMatrix.cpp +175 -0
- package/cpp/zxing-core/core/src/BitMatrix.h +199 -0
- package/cpp/zxing-core/core/src/BitMatrixCursor.h +253 -0
- package/cpp/zxing-core/core/src/BitMatrixIO.cpp +101 -0
- package/cpp/zxing-core/core/src/BitMatrixIO.h +21 -0
- package/cpp/zxing-core/core/src/BitSource.cpp +77 -0
- package/cpp/zxing-core/core/src/BitSource.h +72 -0
- package/cpp/zxing-core/core/src/ByteArray.h +42 -0
- package/cpp/zxing-core/core/src/CharacterSet.cpp +78 -0
- package/cpp/zxing-core/core/src/CharacterSet.h +58 -0
- package/cpp/zxing-core/core/src/ConcentricFinder.cpp +312 -0
- package/cpp/zxing-core/core/src/ConcentricFinder.h +156 -0
- package/cpp/zxing-core/core/src/Content.cpp +471 -0
- package/cpp/zxing-core/core/src/Content.h +82 -0
- package/cpp/zxing-core/core/src/ContentType.h +19 -0
- package/cpp/zxing-core/core/src/CreateBarcode.cpp +490 -0
- package/cpp/zxing-core/core/src/CreateBarcode.h +132 -0
- package/cpp/zxing-core/core/src/DecoderResult.h +92 -0
- package/cpp/zxing-core/core/src/DetectorResult.h +44 -0
- package/cpp/zxing-core/core/src/ECI.cpp +81 -0
- package/cpp/zxing-core/core/src/ECI.h +78 -0
- package/cpp/zxing-core/core/src/Error.cpp +29 -0
- package/cpp/zxing-core/core/src/Error.h +79 -0
- package/cpp/zxing-core/core/src/Flags.h +165 -0
- package/cpp/zxing-core/core/src/GTIN.cpp +253 -0
- package/cpp/zxing-core/core/src/GTIN.h +58 -0
- package/cpp/zxing-core/core/src/GlobalHistogramBinarizer.cpp +197 -0
- package/cpp/zxing-core/core/src/GlobalHistogramBinarizer.h +34 -0
- package/cpp/zxing-core/core/src/GridSampler.cpp +124 -0
- package/cpp/zxing-core/core/src/GridSampler.h +59 -0
- package/cpp/zxing-core/core/src/HRI.cpp +343 -0
- package/cpp/zxing-core/core/src/HRI.h +16 -0
- package/cpp/zxing-core/core/src/HybridBinarizer.cpp +315 -0
- package/cpp/zxing-core/core/src/HybridBinarizer.h +40 -0
- package/cpp/zxing-core/core/src/ImageView.h +168 -0
- package/cpp/zxing-core/core/src/JSON.cpp +154 -0
- package/cpp/zxing-core/core/src/JSON.h +66 -0
- package/cpp/zxing-core/core/src/LocalGrid.cpp +242 -0
- package/cpp/zxing-core/core/src/LocalGrid.h +91 -0
- package/cpp/zxing-core/core/src/LogMatrix.h +105 -0
- package/cpp/zxing-core/core/src/Matrix.h +125 -0
- package/cpp/zxing-core/core/src/MultiFormatReader.cpp +107 -0
- package/cpp/zxing-core/core/src/MultiFormatReader.h +34 -0
- package/cpp/zxing-core/core/src/MultiFormatWriter.cpp +111 -0
- package/cpp/zxing-core/core/src/MultiFormatWriter.h +62 -0
- package/cpp/zxing-core/core/src/Pattern.h +472 -0
- package/cpp/zxing-core/core/src/PerspectiveTransform.cpp +81 -0
- package/cpp/zxing-core/core/src/PerspectiveTransform.h +47 -0
- package/cpp/zxing-core/core/src/Point.h +185 -0
- package/cpp/zxing-core/core/src/Quadrilateral.h +215 -0
- package/cpp/zxing-core/core/src/Range.h +112 -0
- package/cpp/zxing-core/core/src/ReadBarcode.cpp +335 -0
- package/cpp/zxing-core/core/src/ReadBarcode.h +33 -0
- package/cpp/zxing-core/core/src/Reader.h +32 -0
- package/cpp/zxing-core/core/src/ReaderOptions.h +210 -0
- package/cpp/zxing-core/core/src/ReedSolomon.cpp +100 -0
- package/cpp/zxing-core/core/src/ReedSolomon.h +66 -0
- package/cpp/zxing-core/core/src/RegressionLine.h +161 -0
- package/cpp/zxing-core/core/src/ResultPoint.cpp +20 -0
- package/cpp/zxing-core/core/src/ResultPoint.h +35 -0
- package/cpp/zxing-core/core/src/StdGenerator.h +121 -0
- package/cpp/zxing-core/core/src/StdPrint.h +38 -0
- package/cpp/zxing-core/core/src/StdScope.h +55 -0
- package/cpp/zxing-core/core/src/StructuredAppend.h +19 -0
- package/cpp/zxing-core/core/src/SymbologyIdentifier.h +29 -0
- package/cpp/zxing-core/core/src/TextDecoder.cpp +59 -0
- package/cpp/zxing-core/core/src/TextDecoder.h +23 -0
- package/cpp/zxing-core/core/src/TextEncoder.cpp +75 -0
- package/cpp/zxing-core/core/src/TextEncoder.h +31 -0
- package/cpp/zxing-core/core/src/ThresholdBinarizer.h +58 -0
- package/cpp/zxing-core/core/src/TritMatrix.h +29 -0
- package/cpp/zxing-core/core/src/Utf.cpp +276 -0
- package/cpp/zxing-core/core/src/Utf.h +26 -0
- package/cpp/zxing-core/core/src/WhiteRectDetector.cpp +276 -0
- package/cpp/zxing-core/core/src/WhiteRectDetector.h +36 -0
- package/cpp/zxing-core/core/src/WriteBarcode.cpp +213 -0
- package/cpp/zxing-core/core/src/WriteBarcode.h +72 -0
- package/cpp/zxing-core/core/src/ZXAlgorithms.h +353 -0
- package/cpp/zxing-core/core/src/ZXConfig.h +17 -0
- package/cpp/zxing-core/core/src/ZXTestSupport.h +9 -0
- package/cpp/zxing-core/core/src/ZXVersion.h +14 -0
- package/cpp/zxing-core/core/src/ZXingC.cpp +460 -0
- package/cpp/zxing-core/core/src/ZXingC.h +296 -0
- package/cpp/zxing-core/core/src/ZXingCpp.cpp +18 -0
- package/cpp/zxing-core/core/src/ZXingCpp.h +76 -0
- package/cpp/zxing-core/core/src/ZXingQt.h +606 -0
- package/cpp/zxing-core/core/src/aztec/AZDecoder.cpp +376 -0
- package/cpp/zxing-core/core/src/aztec/AZDecoder.h +20 -0
- package/cpp/zxing-core/core/src/aztec/AZDetector.cpp +508 -0
- package/cpp/zxing-core/core/src/aztec/AZDetector.h +25 -0
- package/cpp/zxing-core/core/src/aztec/AZDetectorResult.h +51 -0
- package/cpp/zxing-core/core/src/aztec/AZEncoder.cpp +318 -0
- package/cpp/zxing-core/core/src/aztec/AZEncoder.h +44 -0
- package/cpp/zxing-core/core/src/aztec/AZEncodingState.h +40 -0
- package/cpp/zxing-core/core/src/aztec/AZHighLevelEncoder.cpp +377 -0
- package/cpp/zxing-core/core/src/aztec/AZHighLevelEncoder.h +36 -0
- package/cpp/zxing-core/core/src/aztec/AZReader.cpp +45 -0
- package/cpp/zxing-core/core/src/aztec/AZReader.h +21 -0
- package/cpp/zxing-core/core/src/aztec/AZToken.cpp +44 -0
- package/cpp/zxing-core/core/src/aztec/AZToken.h +39 -0
- package/cpp/zxing-core/core/src/aztec/AZWriter.cpp +38 -0
- package/cpp/zxing-core/core/src/aztec/AZWriter.h +55 -0
- package/cpp/zxing-core/core/src/datamatrix/DMBitLayout.cpp +194 -0
- package/cpp/zxing-core/core/src/datamatrix/DMBitLayout.h +21 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDataBlock.cpp +63 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDataBlock.h +41 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDecoder.cpp +457 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDecoder.h +19 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDetector.cpp +1230 -0
- package/cpp/zxing-core/core/src/datamatrix/DMDetector.h +23 -0
- package/cpp/zxing-core/core/src/datamatrix/DMECEncoder.cpp +137 -0
- package/cpp/zxing-core/core/src/datamatrix/DMECEncoder.h +26 -0
- package/cpp/zxing-core/core/src/datamatrix/DMEncoderContext.h +128 -0
- package/cpp/zxing-core/core/src/datamatrix/DMHighLevelEncoder.cpp +919 -0
- package/cpp/zxing-core/core/src/datamatrix/DMHighLevelEncoder.h +29 -0
- package/cpp/zxing-core/core/src/datamatrix/DMReader.cpp +40 -0
- package/cpp/zxing-core/core/src/datamatrix/DMReader.h +21 -0
- package/cpp/zxing-core/core/src/datamatrix/DMSymbolInfo.cpp +141 -0
- package/cpp/zxing-core/core/src/datamatrix/DMSymbolInfo.h +78 -0
- package/cpp/zxing-core/core/src/datamatrix/DMSymbolShape.h +17 -0
- package/cpp/zxing-core/core/src/datamatrix/DMVersion.cpp +82 -0
- package/cpp/zxing-core/core/src/datamatrix/DMVersion.h +76 -0
- package/cpp/zxing-core/core/src/datamatrix/DMWriter.cpp +114 -0
- package/cpp/zxing-core/core/src/datamatrix/DMWriter.h +62 -0
- package/cpp/zxing-core/core/src/librscpp/README.md +65 -0
- package/cpp/zxing-core/core/src/librscpp/decode.h +258 -0
- package/cpp/zxing-core/core/src/librscpp/encode.h +124 -0
- package/cpp/zxing-core/core/src/librscpp/field.h +158 -0
- package/cpp/zxing-core/core/src/librscpp/poly.h +194 -0
- package/cpp/zxing-core/core/src/libzint/2of5inter.c +1 -0
- package/cpp/zxing-core/core/src/libzint/2of5inter_based.c +1 -0
- package/cpp/zxing-core/core/src/libzint/aztec.c +1 -0
- package/cpp/zxing-core/core/src/libzint/aztec.h +1 -0
- package/cpp/zxing-core/core/src/libzint/big5.h +1 -0
- package/cpp/zxing-core/core/src/libzint/codabar.c +1 -0
- package/cpp/zxing-core/core/src/libzint/code.c +1 -0
- package/cpp/zxing-core/core/src/libzint/code128.c +1 -0
- package/cpp/zxing-core/core/src/libzint/code128.h +1 -0
- package/cpp/zxing-core/core/src/libzint/common.c +1 -0
- package/cpp/zxing-core/core/src/libzint/common.h +1 -0
- package/cpp/zxing-core/core/src/libzint/dmatrix.c +1 -0
- package/cpp/zxing-core/core/src/libzint/dmatrix.h +1 -0
- package/cpp/zxing-core/core/src/libzint/dxfilmedge.c +1 -0
- package/cpp/zxing-core/core/src/libzint/eci.c +1 -0
- package/cpp/zxing-core/core/src/libzint/eci.h +1 -0
- package/cpp/zxing-core/core/src/libzint/eci_sb.h +1 -0
- package/cpp/zxing-core/core/src/libzint/filemem.c +1 -0
- package/cpp/zxing-core/core/src/libzint/filemem.h +1 -0
- package/cpp/zxing-core/core/src/libzint/fonts/normal_woff2.h +1 -0
- package/cpp/zxing-core/core/src/libzint/fonts/upcean_woff2.h +1 -0
- package/cpp/zxing-core/core/src/libzint/gb18030.h +1 -0
- package/cpp/zxing-core/core/src/libzint/gb2312.h +1 -0
- package/cpp/zxing-core/core/src/libzint/gbk.h +1 -0
- package/cpp/zxing-core/core/src/libzint/general_field.c +1 -0
- package/cpp/zxing-core/core/src/libzint/general_field.h +1 -0
- package/cpp/zxing-core/core/src/libzint/gs1.c +1 -0
- package/cpp/zxing-core/core/src/libzint/gs1.h +1 -0
- package/cpp/zxing-core/core/src/libzint/gs1_lint.h +1 -0
- package/cpp/zxing-core/core/src/libzint/iso3166.h +1 -0
- package/cpp/zxing-core/core/src/libzint/iso4217.h +1 -0
- package/cpp/zxing-core/core/src/libzint/ksx1001.h +1 -0
- package/cpp/zxing-core/core/src/libzint/large.c +1 -0
- package/cpp/zxing-core/core/src/libzint/large.h +1 -0
- package/cpp/zxing-core/core/src/libzint/library.c +1 -0
- package/cpp/zxing-core/core/src/libzint/maxicode.c +1 -0
- package/cpp/zxing-core/core/src/libzint/maxicode.h +1 -0
- package/cpp/zxing-core/core/src/libzint/medical.c +1 -0
- package/cpp/zxing-core/core/src/libzint/output.c +1 -0
- package/cpp/zxing-core/core/src/libzint/output.h +1 -0
- package/cpp/zxing-core/core/src/libzint/pdf417.c +1 -0
- package/cpp/zxing-core/core/src/libzint/pdf417.h +1 -0
- package/cpp/zxing-core/core/src/libzint/pdf417_tabs.h +1 -0
- package/cpp/zxing-core/core/src/libzint/qr.c +1 -0
- package/cpp/zxing-core/core/src/libzint/qr.h +1 -0
- package/cpp/zxing-core/core/src/libzint/raster.c +1 -0
- package/cpp/zxing-core/core/src/libzint/raster_font.h +1 -0
- package/cpp/zxing-core/core/src/libzint/reedsol.c +1 -0
- package/cpp/zxing-core/core/src/libzint/reedsol.h +1 -0
- package/cpp/zxing-core/core/src/libzint/reedsol_logs.h +1 -0
- package/cpp/zxing-core/core/src/libzint/rss.c +1 -0
- package/cpp/zxing-core/core/src/libzint/rss.h +1 -0
- package/cpp/zxing-core/core/src/libzint/sjis.h +1 -0
- package/cpp/zxing-core/core/src/libzint/stubs.c +137 -0
- package/cpp/zxing-core/core/src/libzint/svg.c +1 -0
- package/cpp/zxing-core/core/src/libzint/telepen.c +1 -0
- package/cpp/zxing-core/core/src/libzint/upcean.c +1 -0
- package/cpp/zxing-core/core/src/libzint/vector.c +1 -0
- package/cpp/zxing-core/core/src/libzint/zfiletypes.h +1 -0
- package/cpp/zxing-core/core/src/libzint/zint.h +1 -0
- package/cpp/zxing-core/core/src/libzint/zintconfig.h +1 -0
- package/cpp/zxing-core/core/src/libzueci/README.md +11 -0
- package/cpp/zxing-core/core/src/libzueci/zueci.c +1718 -0
- package/cpp/zxing-core/core/src/libzueci/zueci.h +179 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_big5.h +3884 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_common.h +31 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_gb18030.h +264 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_gb2312.h +2381 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_gbk.h +4047 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_ksx1001.h +2932 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_sb.h +1112 -0
- package/cpp/zxing-core/core/src/libzueci/zueci_sjis.h +2286 -0
- package/cpp/zxing-core/core/src/maxicode/MCBitMatrixParser.cpp +68 -0
- package/cpp/zxing-core/core/src/maxicode/MCBitMatrixParser.h +30 -0
- package/cpp/zxing-core/core/src/maxicode/MCDecoder.cpp +329 -0
- package/cpp/zxing-core/core/src/maxicode/MCDecoder.h +19 -0
- package/cpp/zxing-core/core/src/maxicode/MCReader.cpp +65 -0
- package/cpp/zxing-core/core/src/maxicode/MCReader.h +21 -0
- package/cpp/zxing-core/core/src/oned/ODCodabarReader.cpp +102 -0
- package/cpp/zxing-core/core/src/oned/ODCodabarReader.h +21 -0
- package/cpp/zxing-core/core/src/oned/ODCodabarWriter.cpp +136 -0
- package/cpp/zxing-core/core/src/oned/ODCodabarWriter.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODCode128Patterns.h +130 -0
- package/cpp/zxing-core/core/src/oned/ODCode128Reader.cpp +236 -0
- package/cpp/zxing-core/core/src/oned/ODCode128Reader.h +21 -0
- package/cpp/zxing-core/core/src/oned/ODCode128Writer.cpp +261 -0
- package/cpp/zxing-core/core/src/oned/ODCode128Writer.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODCode39Reader.cpp +213 -0
- package/cpp/zxing-core/core/src/oned/ODCode39Reader.h +26 -0
- package/cpp/zxing-core/core/src/oned/ODCode39Writer.cpp +176 -0
- package/cpp/zxing-core/core/src/oned/ODCode39Writer.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODCode93Patterns.h +80 -0
- package/cpp/zxing-core/core/src/oned/ODCode93Reader.cpp +112 -0
- package/cpp/zxing-core/core/src/oned/ODCode93Reader.h +21 -0
- package/cpp/zxing-core/core/src/oned/ODCode93Writer.cpp +192 -0
- package/cpp/zxing-core/core/src/oned/ODCode93Writer.h +32 -0
- package/cpp/zxing-core/core/src/oned/ODDXFilmEdgeReader.cpp +246 -0
- package/cpp/zxing-core/core/src/oned/ODDXFilmEdgeReader.h +26 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarCommon.cpp +172 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarCommon.h +204 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarExpandedBitDecoder.cpp +253 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarExpandedBitDecoder.h +19 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarExpandedReader.cpp +383 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarExpandedReader.h +25 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarLimitedReader.cpp +163 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarLimitedReader.h +23 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarReader.cpp +240 -0
- package/cpp/zxing-core/core/src/oned/ODDataBarReader.h +25 -0
- package/cpp/zxing-core/core/src/oned/ODEAN13Writer.cpp +62 -0
- package/cpp/zxing-core/core/src/oned/ODEAN13Writer.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODEAN8Writer.cpp +51 -0
- package/cpp/zxing-core/core/src/oned/ODEAN8Writer.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODITFReader.cpp +97 -0
- package/cpp/zxing-core/core/src/oned/ODITFReader.h +33 -0
- package/cpp/zxing-core/core/src/oned/ODITFWriter.cpp +78 -0
- package/cpp/zxing-core/core/src/oned/ODITFWriter.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODMultiUPCEANReader.cpp +323 -0
- package/cpp/zxing-core/core/src/oned/ODMultiUPCEANReader.h +32 -0
- package/cpp/zxing-core/core/src/oned/ODReader.cpp +259 -0
- package/cpp/zxing-core/core/src/oned/ODReader.h +35 -0
- package/cpp/zxing-core/core/src/oned/ODRowReader.h +222 -0
- package/cpp/zxing-core/core/src/oned/ODTelepenReader.cpp +199 -0
- package/cpp/zxing-core/core/src/oned/ODTelepenReader.h +25 -0
- package/cpp/zxing-core/core/src/oned/ODUPCAWriter.cpp +33 -0
- package/cpp/zxing-core/core/src/oned/ODUPCAWriter.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODUPCEANCommon.cpp +80 -0
- package/cpp/zxing-core/core/src/oned/ODUPCEANCommon.h +129 -0
- package/cpp/zxing-core/core/src/oned/ODUPCEWriter.cpp +56 -0
- package/cpp/zxing-core/core/src/oned/ODUPCEWriter.h +34 -0
- package/cpp/zxing-core/core/src/oned/ODWriterHelper.cpp +39 -0
- package/cpp/zxing-core/core/src/oned/ODWriterHelper.h +48 -0
- package/cpp/zxing-core/core/src/pdf417/MicroPDFReader.cpp +796 -0
- package/cpp/zxing-core/core/src/pdf417/MicroPDFReader.h +23 -0
- package/cpp/zxing-core/core/src/pdf417/PDF417.cpp +85 -0
- package/cpp/zxing-core/core/src/pdf417/PDF417.h +81 -0
- package/cpp/zxing-core/core/src/pdf417/PDFBarcodeMetadata.h +53 -0
- package/cpp/zxing-core/core/src/pdf417/PDFBarcodeValue.cpp +48 -0
- package/cpp/zxing-core/core/src/pdf417/PDFBarcodeValue.h +38 -0
- package/cpp/zxing-core/core/src/pdf417/PDFBoundingBox.cpp +116 -0
- package/cpp/zxing-core/core/src/pdf417/PDFBoundingBox.h +75 -0
- package/cpp/zxing-core/core/src/pdf417/PDFCodeword.h +71 -0
- package/cpp/zxing-core/core/src/pdf417/PDFCodewordDecoder.cpp +588 -0
- package/cpp/zxing-core/core/src/pdf417/PDFCodewordDecoder.h +41 -0
- package/cpp/zxing-core/core/src/pdf417/PDFCompaction.h +20 -0
- package/cpp/zxing-core/core/src/pdf417/PDFCustomData.h +32 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDecoder.cpp +725 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDecoder.h +20 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetectionResult.cpp +247 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetectionResult.h +74 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetectionResultColumn.cpp +321 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetectionResultColumn.h +83 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetector.cpp +371 -0
- package/cpp/zxing-core/core/src/pdf417/PDFDetector.h +45 -0
- package/cpp/zxing-core/core/src/pdf417/PDFEncoder.cpp +570 -0
- package/cpp/zxing-core/core/src/pdf417/PDFEncoder.h +182 -0
- package/cpp/zxing-core/core/src/pdf417/PDFHighLevelEncoder.cpp +570 -0
- package/cpp/zxing-core/core/src/pdf417/PDFHighLevelEncoder.h +32 -0
- package/cpp/zxing-core/core/src/pdf417/PDFReader.cpp +333 -0
- package/cpp/zxing-core/core/src/pdf417/PDFReader.h +28 -0
- package/cpp/zxing-core/core/src/pdf417/PDFScanningDecoder.cpp +559 -0
- package/cpp/zxing-core/core/src/pdf417/PDFScanningDecoder.h +41 -0
- package/cpp/zxing-core/core/src/pdf417/PDFWriter.cpp +170 -0
- package/cpp/zxing-core/core/src/pdf417/PDFWriter.h +74 -0
- package/cpp/zxing-core/core/src/pdf417/ZXBigInteger.cpp +623 -0
- package/cpp/zxing-core/core/src/pdf417/ZXBigInteger.h +81 -0
- package/cpp/zxing-core/core/src/pdf417/ZXNullable.h +105 -0
- package/cpp/zxing-core/core/src/qrcode/QRBitMatrixParser.cpp +294 -0
- package/cpp/zxing-core/core/src/qrcode/QRBitMatrixParser.h +41 -0
- package/cpp/zxing-core/core/src/qrcode/QRCodecMode.cpp +95 -0
- package/cpp/zxing-core/core/src/qrcode/QRCodecMode.h +59 -0
- package/cpp/zxing-core/core/src/qrcode/QRDataBlock.cpp +93 -0
- package/cpp/zxing-core/core/src/qrcode/QRDataBlock.h +52 -0
- package/cpp/zxing-core/core/src/qrcode/QRDataMask.h +50 -0
- package/cpp/zxing-core/core/src/qrcode/QRDecoder.cpp +359 -0
- package/cpp/zxing-core/core/src/qrcode/QRDecoder.h +19 -0
- package/cpp/zxing-core/core/src/qrcode/QRDetector.cpp +920 -0
- package/cpp/zxing-core/core/src/qrcode/QRDetector.h +45 -0
- package/cpp/zxing-core/core/src/qrcode/QRECB.h +52 -0
- package/cpp/zxing-core/core/src/qrcode/QREncodeResult.h +33 -0
- package/cpp/zxing-core/core/src/qrcode/QREncoder.cpp +568 -0
- package/cpp/zxing-core/core/src/qrcode/QREncoder.h +21 -0
- package/cpp/zxing-core/core/src/qrcode/QRErrorCorrectionLevel.cpp +51 -0
- package/cpp/zxing-core/core/src/qrcode/QRErrorCorrectionLevel.h +39 -0
- package/cpp/zxing-core/core/src/qrcode/QRFormatInformation.cpp +160 -0
- package/cpp/zxing-core/core/src/qrcode/QRFormatInformation.h +61 -0
- package/cpp/zxing-core/core/src/qrcode/QRMaskUtil.cpp +156 -0
- package/cpp/zxing-core/core/src/qrcode/QRMaskUtil.h +15 -0
- package/cpp/zxing-core/core/src/qrcode/QRMatrixUtil.cpp +318 -0
- package/cpp/zxing-core/core/src/qrcode/QRMatrixUtil.h +25 -0
- package/cpp/zxing-core/core/src/qrcode/QRReader.cpp +149 -0
- package/cpp/zxing-core/core/src/qrcode/QRReader.h +21 -0
- package/cpp/zxing-core/core/src/qrcode/QRVersion.cpp +754 -0
- package/cpp/zxing-core/core/src/qrcode/QRVersion.h +127 -0
- package/cpp/zxing-core/core/src/qrcode/QRWriter.cpp +51 -0
- package/cpp/zxing-core/core/src/qrcode/QRWriter.h +74 -0
- package/cpp/zxing-core/core/version.rc.in +34 -0
- package/cpp/zxing-core/core/zxing.pc.in +8 -0
- package/cpp/zxing-core/wrappers/ios/README.md +25 -0
- package/cpp/zxing-core/wrappers/ios/Sources/Wrapper/Version.h +29 -0
- package/cpp/zxing-core/zxing-cpp.podspec +45 -0
- package/lib/factory.d.ts +10 -0
- package/lib/factory.js +12 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/specs/Barcode.nitro.d.ts +63 -0
- package/lib/specs/Barcode.nitro.js +1 -0
- package/lib/specs/BarcodeFormat.d.ts +11 -0
- package/lib/specs/BarcodeFormat.js +1 -0
- package/lib/specs/BarcodeScanner.nitro.d.ts +89 -0
- package/lib/specs/BarcodeScanner.nitro.js +1 -0
- package/lib/specs/BarcodeScannerFactory.nitro.d.ts +26 -0
- package/lib/specs/BarcodeScannerFactory.nitro.js +1 -0
- package/lib/specs/BarcodeValueType.d.ts +9 -0
- package/lib/specs/BarcodeValueType.js +1 -0
- package/lib/specs/Point.d.ts +14 -0
- package/lib/specs/Point.js +1 -0
- package/lib/specs/Rect.d.ts +22 -0
- package/lib/specs/Rect.js +1 -0
- package/lib/useBarcodeScanner.d.ts +23 -0
- package/lib/useBarcodeScanner.js +25 -0
- package/nitro.json +20 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/VisionCameraZxing+autolinking.cmake +83 -0
- package/nitrogen/generated/android/VisionCameraZxing+autolinking.gradle +27 -0
- package/nitrogen/generated/android/VisionCameraZxingOnLoad.cpp +49 -0
- package/nitrogen/generated/android/VisionCameraZxingOnLoad.hpp +34 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/camera/zxing/VisionCameraZxingOnLoad.kt +35 -0
- package/nitrogen/generated/ios/VisionCameraZxing+autolinking.rb +62 -0
- package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/VisionCameraZxing-Swift-Cxx-Umbrella.hpp +38 -0
- package/nitrogen/generated/ios/VisionCameraZxingAutolinking.mm +35 -0
- package/nitrogen/generated/ios/VisionCameraZxingAutolinking.swift +16 -0
- package/nitrogen/generated/shared/c++/BarcodeFormat.hpp +124 -0
- package/nitrogen/generated/shared/c++/BarcodeScannerOptions.hpp +85 -0
- package/nitrogen/generated/shared/c++/BarcodeValueType.hpp +120 -0
- package/nitrogen/generated/shared/c++/HybridBarcodeScannerSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridBarcodeScannerSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridBarcodeSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridBarcodeSpec.hpp +82 -0
- package/nitrogen/generated/shared/c++/HybridZXingBarcodeScannerFactorySpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridZXingBarcodeScannerFactorySpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/Point.hpp +87 -0
- package/nitrogen/generated/shared/c++/Rect.hpp +95 -0
- package/nitrogen/generated/shared/c++/TargetBarcodeFormat.hpp +124 -0
- package/package.json +108 -0
- package/react-native.config.js +16 -0
- package/src/factory.ts +26 -0
- package/src/index.ts +9 -0
- package/src/specs/Barcode.nitro.ts +70 -0
- package/src/specs/BarcodeFormat.ts +31 -0
- package/src/specs/BarcodeScanner.nitro.ts +91 -0
- package/src/specs/BarcodeScannerFactory.nitro.ts +27 -0
- package/src/specs/BarcodeValueType.ts +25 -0
- package/src/specs/Point.ts +14 -0
- package/src/specs/Rect.ts +22 -0
- 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
|