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,335 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2019 Axel Waggershauser
|
|
3
|
+
*/
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
|
|
6
|
+
#include "ReadBarcode.h"
|
|
7
|
+
#include "ReaderOptions.h"
|
|
8
|
+
#include "BarcodeData.h"
|
|
9
|
+
#include "Version.h"
|
|
10
|
+
|
|
11
|
+
#include <utility>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
#ifdef ZXING_READERS
|
|
15
|
+
#include "GlobalHistogramBinarizer.h"
|
|
16
|
+
#include "HybridBinarizer.h"
|
|
17
|
+
#include "MultiFormatReader.h"
|
|
18
|
+
#include "Pattern.h"
|
|
19
|
+
#include "ThresholdBinarizer.h"
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
#include <climits>
|
|
23
|
+
#include <memory>
|
|
24
|
+
#include <stdexcept>
|
|
25
|
+
|
|
26
|
+
namespace ZXing {
|
|
27
|
+
|
|
28
|
+
// ==============================================================================
|
|
29
|
+
// ReaderOptions implementation
|
|
30
|
+
// ==============================================================================
|
|
31
|
+
|
|
32
|
+
struct ReaderOptions::Data
|
|
33
|
+
{
|
|
34
|
+
bool tryHarder : 1 = true;
|
|
35
|
+
bool tryRotate : 1 = true;
|
|
36
|
+
bool tryInvert : 1 = true;
|
|
37
|
+
bool tryDownscale : 1 = true;
|
|
38
|
+
#ifdef ZXING_EXPERIMENTAL_API
|
|
39
|
+
bool tryDenoise : 1 = false;
|
|
40
|
+
#endif
|
|
41
|
+
bool isPure : 1 = false;
|
|
42
|
+
bool validateOptionalChecksum : 1 = false;
|
|
43
|
+
bool returnErrors : 1 = false;
|
|
44
|
+
uint8_t downscaleFactor : 3 = 3; // values 2, 3, 4
|
|
45
|
+
EanAddOnSymbol eanAddOnSymbol : 2 = EanAddOnSymbol::Ignore;
|
|
46
|
+
Binarizer binarizer : 2 = Binarizer::LocalAverage;
|
|
47
|
+
TextMode textMode : 3 = TextMode::HRI;
|
|
48
|
+
CharacterSet characterSet : 6 = CharacterSet::Unknown;
|
|
49
|
+
|
|
50
|
+
uint8_t minLineCount = 2;
|
|
51
|
+
uint8_t maxNumberOfSymbols = 0xff;
|
|
52
|
+
uint16_t downscaleThreshold = 500;
|
|
53
|
+
BarcodeFormats formats = {};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
ReaderOptions::ReaderOptions() : d(std::make_unique<Data>()) {}
|
|
57
|
+
ReaderOptions::~ReaderOptions() = default;
|
|
58
|
+
|
|
59
|
+
// copy
|
|
60
|
+
ReaderOptions::ReaderOptions(const ReaderOptions& other) : d(std::make_unique<Data>(*other.d)) {}
|
|
61
|
+
ReaderOptions& ReaderOptions::operator=(const ReaderOptions& other)
|
|
62
|
+
{
|
|
63
|
+
if (this != &other)
|
|
64
|
+
d = std::make_unique<Data>(*other.d);
|
|
65
|
+
return *this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// move
|
|
69
|
+
ReaderOptions::ReaderOptions(ReaderOptions&&) noexcept = default;
|
|
70
|
+
ReaderOptions& ReaderOptions::operator=(ReaderOptions&&) noexcept = default;
|
|
71
|
+
|
|
72
|
+
const BarcodeFormats& ReaderOptions::formats() const noexcept { return d->formats; }
|
|
73
|
+
ReaderOptions& ReaderOptions::formats(BarcodeFormats&& v) & { return (void)(d->formats = std::move(v)), *this; }
|
|
74
|
+
ReaderOptions&& ReaderOptions::formats(BarcodeFormats&& v) && { return (void)(d->formats = std::move(v)), std::move(*this); }
|
|
75
|
+
|
|
76
|
+
#define ZX_PROPERTY(TYPE, NAME, SETTER) \
|
|
77
|
+
TYPE ReaderOptions::NAME() const noexcept { return d->NAME; } \
|
|
78
|
+
ReaderOptions& ReaderOptions::NAME(TYPE v) & { return (void)(d->NAME = std::move(v)), *this; } \
|
|
79
|
+
ReaderOptions&& ReaderOptions::NAME(TYPE v) && { return (void)(d->NAME = std::move(v)), std::move(*this); }
|
|
80
|
+
|
|
81
|
+
ZX_PROPERTY(bool, tryHarder, setTryHarder)
|
|
82
|
+
ZX_PROPERTY(bool, tryRotate, setTryRotate)
|
|
83
|
+
ZX_PROPERTY(bool, tryInvert, setTryInvert)
|
|
84
|
+
ZX_PROPERTY(bool, tryDownscale, setTryDownscale)
|
|
85
|
+
#ifdef ZXING_EXPERIMENTAL_API
|
|
86
|
+
ZX_PROPERTY(bool, tryDenoise, setTryDenoise)
|
|
87
|
+
#endif
|
|
88
|
+
ZX_PROPERTY(Binarizer, binarizer, setBinarizer)
|
|
89
|
+
ZX_PROPERTY(bool, isPure, setIsPure)
|
|
90
|
+
ZX_PROPERTY(uint16_t, downscaleThreshold, setDownscaleThreshold)
|
|
91
|
+
ZX_PROPERTY(uint8_t, downscaleFactor, setDownscaleFactor)
|
|
92
|
+
ZX_PROPERTY(uint8_t, minLineCount, setMinLineCount)
|
|
93
|
+
ZX_PROPERTY(uint8_t, maxNumberOfSymbols, setMaxNumberOfSymbols)
|
|
94
|
+
ZX_PROPERTY(bool, validateOptionalChecksum, setValidateOptionalChecksum)
|
|
95
|
+
ZX_PROPERTY(bool, returnErrors, setReturnErrors)
|
|
96
|
+
ZX_PROPERTY(EanAddOnSymbol, eanAddOnSymbol, setEanAddOnSymbol)
|
|
97
|
+
ZX_PROPERTY(TextMode, textMode, setTextMode)
|
|
98
|
+
ZX_PROPERTY(CharacterSet, characterSet, setCharacterSet)
|
|
99
|
+
|
|
100
|
+
#undef ZX_PROPERTY
|
|
101
|
+
|
|
102
|
+
ReaderOptions& ReaderOptions::characterSet(std::string_view v) &
|
|
103
|
+
{
|
|
104
|
+
d->characterSet = CharacterSetFromString(v);
|
|
105
|
+
return *this;
|
|
106
|
+
}
|
|
107
|
+
ReaderOptions&& ReaderOptions::characterSet(std::string_view v) &&
|
|
108
|
+
{
|
|
109
|
+
d->characterSet = CharacterSetFromString(v);
|
|
110
|
+
return std::move(*this);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
bool ReaderOptions::hasFormat(const BarcodeFormats& formats) const noexcept
|
|
114
|
+
{
|
|
115
|
+
return d->formats.empty() || std::any_of(formats.begin(), formats.end(), [this](BarcodeFormat bt) { return bt <= d->formats; });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
bool ReaderOptions::hasAnyFormat(const BarcodeFormats& formats) const noexcept
|
|
119
|
+
{
|
|
120
|
+
return d->formats.empty() || std::any_of(formats.begin(), formats.end(), [this](BarcodeFormat bt) { return bt & d->formats; });
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ==============================================================================
|
|
124
|
+
// ReadBarcode implementation
|
|
125
|
+
// ==============================================================================
|
|
126
|
+
|
|
127
|
+
#ifdef ZXING_READERS
|
|
128
|
+
|
|
129
|
+
class LumImage : public Image
|
|
130
|
+
{
|
|
131
|
+
public:
|
|
132
|
+
using Image::Image;
|
|
133
|
+
|
|
134
|
+
uint8_t* data() { return const_cast<uint8_t*>(Image::data()); }
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
template<typename P>
|
|
138
|
+
static LumImage ExtractLum(const ImageView& iv, P projection)
|
|
139
|
+
{
|
|
140
|
+
LumImage res(iv.width(), iv.height());
|
|
141
|
+
|
|
142
|
+
auto* dst = res.data();
|
|
143
|
+
for(int y = 0; y < iv.height(); ++y)
|
|
144
|
+
for(int x = 0, w = iv.width(); x < w; ++x)
|
|
145
|
+
*dst++ = projection(iv.data(x, y));
|
|
146
|
+
|
|
147
|
+
return res;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
class LumImagePyramid
|
|
151
|
+
{
|
|
152
|
+
std::vector<LumImage> buffers;
|
|
153
|
+
|
|
154
|
+
template<int N>
|
|
155
|
+
void addLayer()
|
|
156
|
+
{
|
|
157
|
+
auto siv = layers.back();
|
|
158
|
+
buffers.emplace_back(siv.width() / N, siv.height() / N);
|
|
159
|
+
layers.push_back(buffers.back());
|
|
160
|
+
auto& div = buffers.back();
|
|
161
|
+
auto* d = div.data();
|
|
162
|
+
|
|
163
|
+
for (int dy = 0; dy < div.height(); ++dy)
|
|
164
|
+
for (int dx = 0; dx < div.width(); ++dx) {
|
|
165
|
+
int sum = (N * N) / 2;
|
|
166
|
+
for (int ty = 0; ty < N; ++ty)
|
|
167
|
+
for (int tx = 0; tx < N; ++tx)
|
|
168
|
+
sum += *siv.data(dx * N + tx, dy * N + ty);
|
|
169
|
+
*d++ = sum / (N * N);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
void addLayer(int factor)
|
|
174
|
+
{
|
|
175
|
+
// help the compiler's auto-vectorizer by hard-coding the scale factor
|
|
176
|
+
switch (factor) {
|
|
177
|
+
case 2: addLayer<2>(); break;
|
|
178
|
+
case 3: addLayer<3>(); break;
|
|
179
|
+
case 4: addLayer<4>(); break;
|
|
180
|
+
default: throw std::invalid_argument("Invalid ReaderOptions::downscaleFactor"); break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public:
|
|
185
|
+
std::vector<ImageView> layers;
|
|
186
|
+
|
|
187
|
+
LumImagePyramid(const ImageView& iv, int threshold, int factor)
|
|
188
|
+
{
|
|
189
|
+
if (factor < 2)
|
|
190
|
+
throw std::invalid_argument("Invalid ReaderOptions::downscaleFactor");
|
|
191
|
+
|
|
192
|
+
layers.push_back(iv);
|
|
193
|
+
// TODO: if only matrix codes were considered, then using std::min would be sufficient (see #425)
|
|
194
|
+
while (threshold > 0 && std::max(layers.back().width(), layers.back().height()) > threshold &&
|
|
195
|
+
std::min(layers.back().width(), layers.back().height()) >= factor)
|
|
196
|
+
addLayer(factor);
|
|
197
|
+
#if 0
|
|
198
|
+
// Reversing the layers means we'd start with the smallest. that can make sense if we are only looking for a
|
|
199
|
+
// single symbol. If we start with the higher resolution, we get better (high res) position information.
|
|
200
|
+
// TODO: see if masking out higher res layers based on found symbols in lower res helps overall performance.
|
|
201
|
+
std::reverse(layers.begin(), layers.end());
|
|
202
|
+
#endif
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
ImageView SetupLumImageView(ImageView iv, LumImage& lum, const ReaderOptions& opts)
|
|
207
|
+
{
|
|
208
|
+
if (iv.format() == ImageFormat::None)
|
|
209
|
+
throw std::invalid_argument("Invalid image format");
|
|
210
|
+
|
|
211
|
+
if (opts.binarizer() == Binarizer::GlobalHistogram || opts.binarizer() == Binarizer::LocalAverage) {
|
|
212
|
+
// manually spell out the 3 most common pixel formats to get at least gcc to vectorize the code
|
|
213
|
+
if (iv.format() == ImageFormat::RGB && iv.pixStride() == 3) {
|
|
214
|
+
lum = ExtractLum(iv, [](const uint8_t* src) { return RGBToLum(src[0], src[1], src[2]); });
|
|
215
|
+
} else if (iv.format() == ImageFormat::RGBA && iv.pixStride() == 4) {
|
|
216
|
+
lum = ExtractLum(iv, [](const uint8_t* src) { return RGBToLum(src[0], src[1], src[2]); });
|
|
217
|
+
} else if (iv.format() == ImageFormat::BGR && iv.pixStride() == 3) {
|
|
218
|
+
lum = ExtractLum(iv, [](const uint8_t* src) { return RGBToLum(src[2], src[1], src[0]); });
|
|
219
|
+
} else if (iv.format() != ImageFormat::Lum) {
|
|
220
|
+
lum = ExtractLum(iv, [r = RedIndex(iv.format()), g = GreenIndex(iv.format()), b = BlueIndex(iv.format())](
|
|
221
|
+
const uint8_t* src) { return RGBToLum(src[r], src[g], src[b]); });
|
|
222
|
+
} else if (iv.pixStride() != 1) {
|
|
223
|
+
// GlobalHistogram and LocalAverage need dense line memory layout
|
|
224
|
+
lum = ExtractLum(iv, [](const uint8_t* src) { return *src; });
|
|
225
|
+
}
|
|
226
|
+
if (lum.data())
|
|
227
|
+
return lum;
|
|
228
|
+
}
|
|
229
|
+
return iv;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
std::unique_ptr<BinaryBitmap> CreateBitmap(ZXing::Binarizer binarizer, const ImageView& iv)
|
|
233
|
+
{
|
|
234
|
+
switch (binarizer) {
|
|
235
|
+
case Binarizer::BoolCast: return std::make_unique<ThresholdBinarizer>(iv, 0);
|
|
236
|
+
case Binarizer::FixedThreshold: return std::make_unique<ThresholdBinarizer>(iv, 127);
|
|
237
|
+
case Binarizer::GlobalHistogram: return std::make_unique<GlobalHistogramBinarizer>(iv);
|
|
238
|
+
case Binarizer::LocalAverage: return std::make_unique<HybridBinarizer>(iv);
|
|
239
|
+
}
|
|
240
|
+
return {}; // silence gcc warning
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
Barcode ReadBarcode(const ImageView& _iv, const ReaderOptions& opts)
|
|
244
|
+
{
|
|
245
|
+
return FirstOrDefault(ReadBarcodes(_iv, ReaderOptions(opts).maxNumberOfSymbols(1)));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
Barcodes ReadBarcodes(const ImageView& _iv, const ReaderOptions& opts)
|
|
249
|
+
{
|
|
250
|
+
if (sizeof(PatternType) < 4 && (_iv.width() > 0xffff || _iv.height() > 0xffff))
|
|
251
|
+
throw std::invalid_argument("Maximum image width/height is 65535");
|
|
252
|
+
|
|
253
|
+
if (!_iv.data() || _iv.width() * _iv.height() == 0)
|
|
254
|
+
throw std::invalid_argument("ImageView is null/empty");
|
|
255
|
+
|
|
256
|
+
LumImage lum;
|
|
257
|
+
ImageView iv = SetupLumImageView(_iv, lum, opts);
|
|
258
|
+
MultiFormatReader reader(opts);
|
|
259
|
+
|
|
260
|
+
if (opts.isPure())
|
|
261
|
+
return {FirstOrDefault(reader.read(*CreateBitmap(opts.binarizer(), iv), 1)).setReaderOptions(opts)};
|
|
262
|
+
|
|
263
|
+
std::unique_ptr<MultiFormatReader> closedReader;
|
|
264
|
+
#ifdef ZXING_EXPERIMENTAL_API
|
|
265
|
+
using enum BarcodeFormat;
|
|
266
|
+
BarcodeFormats formatsBenefittingFromClosing = Aztec | DataMatrix | QRCode;
|
|
267
|
+
ReaderOptions closedOptions = opts;
|
|
268
|
+
if (opts.tryDenoise() && opts.hasAnyFormat(formatsBenefittingFromClosing) && _iv.height() >= 3) {
|
|
269
|
+
closedOptions.formats(opts.formats().empty() ? formatsBenefittingFromClosing : formatsBenefittingFromClosing & opts.formats());
|
|
270
|
+
closedReader = std::make_unique<MultiFormatReader>(closedOptions);
|
|
271
|
+
}
|
|
272
|
+
#endif
|
|
273
|
+
LumImagePyramid pyramid(iv, opts.downscaleThreshold() * opts.tryDownscale(), opts.downscaleFactor());
|
|
274
|
+
|
|
275
|
+
Barcodes res;
|
|
276
|
+
int maxSymbols = opts.maxNumberOfSymbols() ? opts.maxNumberOfSymbols() : INT_MAX;
|
|
277
|
+
for (auto&& iv : pyramid.layers) {
|
|
278
|
+
auto bitmap = CreateBitmap(opts.binarizer(), iv);
|
|
279
|
+
for (int close = 0; close <= (closedReader ? 1 : 0); ++close) {
|
|
280
|
+
if (close) {
|
|
281
|
+
// if we already inverted the image in the first round, we need to undo that first
|
|
282
|
+
if (bitmap->inverted())
|
|
283
|
+
bitmap->invert();
|
|
284
|
+
bitmap->close();
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// TODO: check if closing after invert would be beneficial
|
|
288
|
+
for (int invert = 0; invert <= static_cast<int>(opts.tryInvert() && !close); ++invert) {
|
|
289
|
+
if (invert)
|
|
290
|
+
bitmap->invert();
|
|
291
|
+
auto rs = (close ? *closedReader : reader).read(*bitmap, maxSymbols);
|
|
292
|
+
for (auto& r : rs) {
|
|
293
|
+
if (iv.width() != _iv.width())
|
|
294
|
+
r.d->position = Scale(r.position(), _iv.width() / iv.width());
|
|
295
|
+
if (!Contains(res, r)) {
|
|
296
|
+
r.setReaderOptions(opts);
|
|
297
|
+
r.d->isInverted = bitmap->inverted();
|
|
298
|
+
res.push_back(std::move(r));
|
|
299
|
+
--maxSymbols;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (maxSymbols <= 0)
|
|
303
|
+
return res;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (opts.returnErrors()) {
|
|
309
|
+
// if symbols overlap and one is in error remove it
|
|
310
|
+
for (auto a = res.begin(); a != res.end(); ++a)
|
|
311
|
+
for (auto b = std::next(a); b != res.end(); ++b)
|
|
312
|
+
if (HaveIntersectingBoundingBoxes(a->position(), b->position()) && (a->error() != b->error()))
|
|
313
|
+
*(a->error() ? a : b) = BarcodeData();
|
|
314
|
+
|
|
315
|
+
std::erase_if(res, [](auto&& r) { return r.format() == BarcodeFormat::None; });
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return res;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
#else // ZXING_READERS
|
|
322
|
+
|
|
323
|
+
Barcode ReadBarcode(const ImageView&, const ReaderOptions&)
|
|
324
|
+
{
|
|
325
|
+
throw std::runtime_error("This build of zxing-cpp does not support reading barcodes.");
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
Barcodes ReadBarcodes(const ImageView&, const ReaderOptions&)
|
|
329
|
+
{
|
|
330
|
+
throw std::runtime_error("This build of zxing-cpp does not support reading barcodes.");
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
#endif // ZXING_READERS
|
|
334
|
+
|
|
335
|
+
} // ZXing
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2019 Axel Waggershauser
|
|
3
|
+
*/
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
|
|
6
|
+
#pragma once
|
|
7
|
+
|
|
8
|
+
#include "ReaderOptions.h"
|
|
9
|
+
#include "ImageView.h"
|
|
10
|
+
#include "Barcode.h"
|
|
11
|
+
|
|
12
|
+
namespace ZXing {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Read barcode from an ImageView
|
|
16
|
+
*
|
|
17
|
+
* @param image view of the image data including layout and format
|
|
18
|
+
* @param options optional ReaderOptions to parameterize / speed up detection
|
|
19
|
+
* @return Barcode found, if any, otherwise a Barcode with empty content and format ZXing::BarcodeFormat::None
|
|
20
|
+
*/
|
|
21
|
+
Barcode ReadBarcode(const ImageView& image, const ReaderOptions& options = {});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Read barcodes from an ImageView
|
|
25
|
+
*
|
|
26
|
+
* @param image view of the image data including layout and format
|
|
27
|
+
* @param options optional ReaderOptions to parameterize / speed up detection
|
|
28
|
+
* @return List of Barcode found, may be empty
|
|
29
|
+
*/
|
|
30
|
+
Barcodes ReadBarcodes(const ImageView& image, const ReaderOptions& options = {});
|
|
31
|
+
|
|
32
|
+
} // ZXing
|
|
33
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Nu-book Inc.
|
|
3
|
+
* Copyright 2016 ZXing authors
|
|
4
|
+
*/
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include "ReaderOptions.h"
|
|
10
|
+
#include "BarcodeData.h"
|
|
11
|
+
|
|
12
|
+
namespace ZXing {
|
|
13
|
+
|
|
14
|
+
class BinaryBitmap;
|
|
15
|
+
class ReaderOptions;
|
|
16
|
+
|
|
17
|
+
class Reader
|
|
18
|
+
{
|
|
19
|
+
protected:
|
|
20
|
+
const ReaderOptions& _opts;
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
const bool supportsInversion;
|
|
24
|
+
|
|
25
|
+
explicit Reader(const ReaderOptions& opts, bool supportsInversion = false) : _opts(opts), supportsInversion(supportsInversion) {}
|
|
26
|
+
explicit Reader(ReaderOptions&& opts) = delete;
|
|
27
|
+
virtual ~Reader() = default;
|
|
28
|
+
|
|
29
|
+
virtual BarcodesData read(const BinaryBitmap& image, int maxSymbols) const = 0;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
} // ZXing
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Nu-book Inc.
|
|
3
|
+
* Copyright 2016 ZXing authors
|
|
4
|
+
* Copyright 2020 Axel Waggershauser
|
|
5
|
+
*/
|
|
6
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "BarcodeFormat.h"
|
|
11
|
+
#include "CharacterSet.h"
|
|
12
|
+
#include "Version.h"
|
|
13
|
+
|
|
14
|
+
#include <string_view>
|
|
15
|
+
#include <utility>
|
|
16
|
+
#include <memory>
|
|
17
|
+
|
|
18
|
+
namespace ZXing {
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @brief Specify which algorithm to use for the grayscale to binary transformation.
|
|
22
|
+
*
|
|
23
|
+
* The difference is how to get to a threshold value T which results in a bit value R(esult) = L(uminance) <= T(hreshold).
|
|
24
|
+
*/
|
|
25
|
+
enum class Binarizer : unsigned char // needs to be unsigned for the bitfield below to work, uint8_t fails as well
|
|
26
|
+
{
|
|
27
|
+
LocalAverage, ///< T = average of neighboring pixels for matrix and GlobalHistogram for linear (HybridBinarizer)
|
|
28
|
+
GlobalHistogram, ///< T = valley between the 2 largest peaks in the histogram (per line in linear case)
|
|
29
|
+
FixedThreshold, ///< T = 127
|
|
30
|
+
BoolCast, ///< T = 0, fastest possible
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @brief Specify whether to ignore, read or require EAN-2/5 add-on symbols while scanning EAN/UPC codes.
|
|
35
|
+
*/
|
|
36
|
+
enum class EanAddOnSymbol : unsigned char // see above
|
|
37
|
+
{
|
|
38
|
+
Ignore, ///< Ignore any Add-On symbol during read/scan
|
|
39
|
+
Read, ///< Read EAN-2/EAN-5 Add-On symbol if found
|
|
40
|
+
Require, ///< Require EAN-2/EAN-5 Add-On symbol to be present
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief Specify how the decoded byte content of a barcode should be transcoded to text.
|
|
45
|
+
*
|
|
46
|
+
* @see Barcode::text(), ReaderOptions::textMode().
|
|
47
|
+
*/
|
|
48
|
+
enum class TextMode : unsigned char // see above
|
|
49
|
+
{
|
|
50
|
+
Plain, ///< bytes() transcoded to unicode based on ECI info or guessed charset (the default mode prior to 2.0)
|
|
51
|
+
ECI, ///< standard content following the ECI protocol with every character set ECI segment transcoded to unicode
|
|
52
|
+
HRI, ///< Human Readable Interpretation (dependent on the ContentType)
|
|
53
|
+
Escaped, ///< Use the EscapeNonGraphical() function (e.g. ASCII 29 will be transcoded to "<GS>")
|
|
54
|
+
Hex, ///< bytes() transcoded to ASCII string of HEX values
|
|
55
|
+
HexECI, ///< bytesECI() transcoded to ASCII string of HEX values
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @brief Configuration options for barcode reading and decoding behavior.
|
|
60
|
+
*
|
|
61
|
+
* ReaderOptions encapsulates a set of flags and parameters that control
|
|
62
|
+
* how barcode detection and decoding is performed. It provides
|
|
63
|
+
* fluent setters that support chaining. Both `name(val)` and `setName(val)`
|
|
64
|
+
* forms are available for convenience and compatibility.
|
|
65
|
+
*
|
|
66
|
+
* The class is intended to be passed to the ReadBarcodes function to
|
|
67
|
+
* influence scanning heuristics, performance vs. accuracy trade-offs, output
|
|
68
|
+
* formatting, and symbol filtering. Instances can be reused across multiple
|
|
69
|
+
* read operations.
|
|
70
|
+
*
|
|
71
|
+
* The default settings are optimized for detection rate and can be tuned
|
|
72
|
+
* for speed or specific use-cases.
|
|
73
|
+
*
|
|
74
|
+
* @see BarcodeFormats, Binarizer, TextMode, CharacterSet, ReadBarcodes
|
|
75
|
+
*/
|
|
76
|
+
class ReaderOptions
|
|
77
|
+
{
|
|
78
|
+
struct Data;
|
|
79
|
+
std::unique_ptr<Data> d;
|
|
80
|
+
|
|
81
|
+
public:
|
|
82
|
+
ReaderOptions();
|
|
83
|
+
~ReaderOptions();
|
|
84
|
+
ReaderOptions(const ReaderOptions&);
|
|
85
|
+
ReaderOptions& operator=(const ReaderOptions&);
|
|
86
|
+
ReaderOptions(ReaderOptions&&) noexcept;
|
|
87
|
+
ReaderOptions& operator=(ReaderOptions&&) noexcept;
|
|
88
|
+
|
|
89
|
+
#define ZX_PROPERTY(TYPE, NAME, SETTER, ...) \
|
|
90
|
+
TYPE NAME() const noexcept; \
|
|
91
|
+
__VA_ARGS__ ReaderOptions& NAME(TYPE v) &; \
|
|
92
|
+
__VA_ARGS__ ReaderOptions&& NAME(TYPE v) &&; \
|
|
93
|
+
__VA_ARGS__ inline ReaderOptions& SETTER(TYPE v) & { return NAME(v); } \
|
|
94
|
+
__VA_ARGS__ inline ReaderOptions&& SETTER(TYPE v) && { return std::move(*this).NAME(v); }
|
|
95
|
+
|
|
96
|
+
/// Specify a set of BarcodeFormats that should be searched for, the default is all supported formats.
|
|
97
|
+
const BarcodeFormats& formats() const noexcept;
|
|
98
|
+
ReaderOptions& formats(BarcodeFormats&& v) &;
|
|
99
|
+
ReaderOptions&& formats(BarcodeFormats&& v) &&;
|
|
100
|
+
ReaderOptions& formats(const BarcodeFormats& v) & { return formats(BarcodeFormats(v)); }
|
|
101
|
+
ReaderOptions&& formats(const BarcodeFormats& v) && { return std::move(*this).formats(BarcodeFormats(v)); }
|
|
102
|
+
inline ReaderOptions& setFormats(BarcodeFormats&& v) & { return formats(std::move(v)); }
|
|
103
|
+
inline ReaderOptions&& setFormats(BarcodeFormats&& v) && { return std::move(*this).formats(std::move(v)); }
|
|
104
|
+
inline ReaderOptions& setFormats(const BarcodeFormats& v) & { return formats(BarcodeFormats(v)); }
|
|
105
|
+
inline ReaderOptions&& setFormats(const BarcodeFormats& v) && { return std::move(*this).formats(BarcodeFormats(v)); }
|
|
106
|
+
|
|
107
|
+
/// Spend more time to try to find a barcode; optimize for accuracy instead of not speed (default: true).
|
|
108
|
+
ZX_PROPERTY(bool, tryHarder, setTryHarder)
|
|
109
|
+
|
|
110
|
+
/// Try detecting codes in 90, 180 and 270 degree rotated images (default: true).
|
|
111
|
+
ZX_PROPERTY(bool, tryRotate, setTryRotate)
|
|
112
|
+
|
|
113
|
+
/// Try detecting inverted ("reversed reflectance") codes if the format allows for those (default: true).
|
|
114
|
+
ZX_PROPERTY(bool, tryInvert, setTryInvert)
|
|
115
|
+
|
|
116
|
+
/// Try detecting code in downscaled images (depending on image size) (default: true).
|
|
117
|
+
ZX_PROPERTY(bool, tryDownscale, setTryDownscale)
|
|
118
|
+
|
|
119
|
+
#ifdef ZXING_EXPERIMENTAL_API
|
|
120
|
+
/// Also try detecting code after denoising (currently morphological closing filter for 2D formats only).
|
|
121
|
+
ZX_PROPERTY(bool, tryDenoise, setTryDenoise)
|
|
122
|
+
#endif
|
|
123
|
+
|
|
124
|
+
/// Binarizer to use for grayscale to binary transformation (default: Binarizer::LocalAverage).
|
|
125
|
+
ZX_PROPERTY(Binarizer, binarizer, setBinarizer)
|
|
126
|
+
|
|
127
|
+
/// Set to true if the input contains nothing but a single perfectly aligned barcode (generated image).
|
|
128
|
+
ZX_PROPERTY(bool, isPure, setIsPure)
|
|
129
|
+
|
|
130
|
+
/// Image size ( min(width, height) ) threshold at which to start downscaled scanning.
|
|
131
|
+
ZX_PROPERTY(uint16_t, downscaleThreshold, setDownscaleThreshold)
|
|
132
|
+
|
|
133
|
+
/// Scale factor used during downscaling, meaningful values are 2, 3 and 4.
|
|
134
|
+
ZX_PROPERTY(uint8_t, downscaleFactor, setDownscaleFactor)
|
|
135
|
+
|
|
136
|
+
/// The number of scan lines in a linear barcode that have to be equal to accept the result (default: 2).
|
|
137
|
+
ZX_PROPERTY(uint8_t, minLineCount, setMinLineCount)
|
|
138
|
+
|
|
139
|
+
/// The maximum number of symbols (barcodes) to detect / look for with ReadBarcodes().
|
|
140
|
+
ZX_PROPERTY(uint8_t, maxNumberOfSymbols, setMaxNumberOfSymbols)
|
|
141
|
+
|
|
142
|
+
/// Validate optional checksums where applicable (e.g. Code39, ITF) (default: false).
|
|
143
|
+
ZX_PROPERTY(bool, validateOptionalChecksum, setValidateOptionalChecksum)
|
|
144
|
+
|
|
145
|
+
/// If true, return the barcodes with errors as well (e.g. checksum errors, see Barcode::error()) (default: false).
|
|
146
|
+
ZX_PROPERTY(bool, returnErrors, setReturnErrors)
|
|
147
|
+
|
|
148
|
+
/// Specify whether to ignore, read or require EAN-2/5 add-on symbols while scanning EAN/UPC codes.
|
|
149
|
+
ZX_PROPERTY(EanAddOnSymbol, eanAddOnSymbol, setEanAddOnSymbol)
|
|
150
|
+
|
|
151
|
+
/// Specifies the TextMode that controls the return of the Barcode::text() function (default: TextMode::HRI).
|
|
152
|
+
ZX_PROPERTY(TextMode, textMode, setTextMode)
|
|
153
|
+
|
|
154
|
+
/// Specifies fallback character set to use instead of auto-detecting it (when applicable).
|
|
155
|
+
ZX_PROPERTY(CharacterSet, characterSet, setCharacterSet)
|
|
156
|
+
ReaderOptions& characterSet(std::string_view v) &;
|
|
157
|
+
ReaderOptions&& characterSet(std::string_view v) &&;
|
|
158
|
+
inline ReaderOptions& setCharacterSet(std::string_view v) & { return characterSet(v); }
|
|
159
|
+
inline ReaderOptions&& setCharacterSet(std::string_view v) && { return std::move(*this).characterSet(v); }
|
|
160
|
+
|
|
161
|
+
#undef ZX_PROPERTY
|
|
162
|
+
|
|
163
|
+
/// @cond DEPRECATED
|
|
164
|
+
|
|
165
|
+
// Silence deprecated-declarations warnings, only happening here for deprecated inline functions
|
|
166
|
+
#ifdef __GNUC__
|
|
167
|
+
#pragma GCC diagnostic push
|
|
168
|
+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
169
|
+
#elif defined(_MSC_VER)
|
|
170
|
+
#pragma warning(push)
|
|
171
|
+
#pragma warning(disable : 4996)
|
|
172
|
+
#endif
|
|
173
|
+
|
|
174
|
+
#define ZX_DEPRECATED_PROPERTY(TYPE, NAME, SETTER, GET_IMPL, SET_IMPL) \
|
|
175
|
+
[[deprecated]] inline TYPE NAME() const noexcept { return GET_IMPL; } \
|
|
176
|
+
[[deprecated]] ReaderOptions& NAME(TYPE v) & { SET_IMPL; return *this; } \
|
|
177
|
+
[[deprecated]] ReaderOptions&& NAME(TYPE v) && { SET_IMPL; return std::move(*this); } \
|
|
178
|
+
[[deprecated]] inline ReaderOptions& SETTER(TYPE v) & { return NAME(v); } \
|
|
179
|
+
[[deprecated]] inline ReaderOptions&& SETTER(TYPE v) && { return std::move(*this).NAME(v); }
|
|
180
|
+
|
|
181
|
+
/// @deprecated (does nothing). See BarcodeFormat::Code39Ext and ::Code39Std to select full ASCII or standard Code39 mode.
|
|
182
|
+
ZX_DEPRECATED_PROPERTY(bool, tryCode39ExtendedMode, setTryCode39ExtendedMode, true, (void)v)
|
|
183
|
+
|
|
184
|
+
/// @deprecated (use validateOptionalChecksum). The Code39 symbol has a valid checksum iff symbologyIdentifier()[2] is an odd digit
|
|
185
|
+
ZX_DEPRECATED_PROPERTY(bool, validateCode39CheckSum, setValidateCode39CheckSum, validateOptionalChecksum(),
|
|
186
|
+
validateOptionalChecksum(v))
|
|
187
|
+
|
|
188
|
+
/// @deprecated (use validateOptionalChecksum). The ITF symbol has a valid checksum iff symbologyIdentifier()[2] == '1'.
|
|
189
|
+
ZX_DEPRECATED_PROPERTY(bool, validateITFCheckSum, setValidateITFCheckSum, validateOptionalChecksum(), validateOptionalChecksum(v))
|
|
190
|
+
|
|
191
|
+
#undef ZX_DEPRECATED_PROPERTY
|
|
192
|
+
|
|
193
|
+
#ifdef __GNUC__
|
|
194
|
+
#pragma GCC diagnostic pop
|
|
195
|
+
#elif defined(_MSC_VER)
|
|
196
|
+
#pragma warning(pop)
|
|
197
|
+
#endif
|
|
198
|
+
|
|
199
|
+
/// @endcond
|
|
200
|
+
|
|
201
|
+
#ifdef ZXING_INTERNAL
|
|
202
|
+
/// Check if a specific format is explicitly enabled in the formats set
|
|
203
|
+
bool hasFormat(const BarcodeFormats& formats) const noexcept;
|
|
204
|
+
|
|
205
|
+
/// Check if any format is explicitly or implicitly enabled in the formats set
|
|
206
|
+
bool hasAnyFormat(const BarcodeFormats& formats) const noexcept;
|
|
207
|
+
#endif
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
} // ZXing
|