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,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Huy Cuong Nguyen
|
|
3
|
+
*/
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
|
|
6
|
+
#pragma once
|
|
7
|
+
|
|
8
|
+
#include <cstddef>
|
|
9
|
+
#include <stdexcept>
|
|
10
|
+
#include <utility>
|
|
11
|
+
|
|
12
|
+
namespace ZXing {
|
|
13
|
+
|
|
14
|
+
template <typename T>
|
|
15
|
+
class Nullable final
|
|
16
|
+
{
|
|
17
|
+
bool m_hasValue = false;
|
|
18
|
+
T m_value;
|
|
19
|
+
|
|
20
|
+
public:
|
|
21
|
+
Nullable() = default;
|
|
22
|
+
Nullable(const T &value) : m_hasValue(true), m_value(value) {}
|
|
23
|
+
Nullable(T &&value) noexcept : m_hasValue(true), m_value(std::move(value)) {}
|
|
24
|
+
Nullable(std::nullptr_t) {}
|
|
25
|
+
|
|
26
|
+
Nullable<T> & operator=(const T &value) {
|
|
27
|
+
m_hasValue = true;
|
|
28
|
+
m_value = value;
|
|
29
|
+
return *this;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
Nullable<T> & operator=(T &&value) noexcept {
|
|
33
|
+
m_hasValue = true;
|
|
34
|
+
m_value = std::move(value);
|
|
35
|
+
return *this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Nullable<T> & operator=(std::nullptr_t) {
|
|
39
|
+
m_hasValue = false;
|
|
40
|
+
m_value = T();
|
|
41
|
+
return *this;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
operator T() const {
|
|
45
|
+
if (!m_hasValue) {
|
|
46
|
+
throw std::logic_error("Access empty value");
|
|
47
|
+
}
|
|
48
|
+
return m_value;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
bool hasValue() const {
|
|
52
|
+
return m_hasValue;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const T & value() const {
|
|
56
|
+
return m_value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
T & value() {
|
|
60
|
+
return m_value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
friend inline bool operator==(const Nullable &a, const Nullable &b) {
|
|
64
|
+
return a.m_hasValue == b.m_hasValue && (!a.m_hasValue || a.m_value == b.m_value);
|
|
65
|
+
}
|
|
66
|
+
friend inline bool operator!=(const Nullable &a, const Nullable &b) {
|
|
67
|
+
return !(a == b);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
friend inline bool operator==(const Nullable &a, const T &v) {
|
|
71
|
+
return a.m_hasValue && a.m_value == v;
|
|
72
|
+
}
|
|
73
|
+
friend inline bool operator!=(const Nullable &a, const T &v) {
|
|
74
|
+
return !(a == v);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
friend inline bool operator==(const T &v, const Nullable &a) {
|
|
78
|
+
return a.m_hasValue && a.m_value == v;
|
|
79
|
+
}
|
|
80
|
+
friend inline bool operator!=(const T &v, const Nullable &a) {
|
|
81
|
+
return !(v == a);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
friend inline bool operator==(const Nullable &a, std::nullptr_t) {
|
|
85
|
+
return !a.m_hasValue;
|
|
86
|
+
}
|
|
87
|
+
friend inline bool operator!=(const Nullable &a, std::nullptr_t) {
|
|
88
|
+
return a.m_hasValue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
friend inline bool operator==(std::nullptr_t, const Nullable &a) {
|
|
92
|
+
return !a.m_hasValue;
|
|
93
|
+
}
|
|
94
|
+
friend inline bool operator!=(std::nullptr_t, const Nullable &a) {
|
|
95
|
+
return a.m_hasValue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
friend inline void swap(Nullable &a, Nullable &b) noexcept {
|
|
99
|
+
using std::swap;
|
|
100
|
+
swap(a.m_value, b.m_value);
|
|
101
|
+
swap(a.m_hasValue, b.m_hasValue);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
} // ZXing
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Nu-book Inc.
|
|
3
|
+
* Copyright 2016 ZXing authors
|
|
4
|
+
* Copyright 2023 gitlost
|
|
5
|
+
*/
|
|
6
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
|
|
8
|
+
#include "QRBitMatrixParser.h"
|
|
9
|
+
|
|
10
|
+
#include "BitArray.h"
|
|
11
|
+
#include "BitMatrix.h"
|
|
12
|
+
#include "ByteArray.h"
|
|
13
|
+
#include "QRDataMask.h"
|
|
14
|
+
#include "QRFormatInformation.h"
|
|
15
|
+
#include "QRVersion.h"
|
|
16
|
+
|
|
17
|
+
#include <utility>
|
|
18
|
+
|
|
19
|
+
namespace ZXing::QRCode {
|
|
20
|
+
|
|
21
|
+
static bool getBit(const BitMatrix& bitMatrix, int x, int y, bool mirrored = false)
|
|
22
|
+
{
|
|
23
|
+
return mirrored ? bitMatrix.get(y, x) : bitMatrix.get(x, y);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const Version* ReadVersion(const BitMatrix& bitMatrix, Type type)
|
|
27
|
+
{
|
|
28
|
+
assert(Version::HasValidSize(bitMatrix));
|
|
29
|
+
|
|
30
|
+
int number = Version::Number(bitMatrix);
|
|
31
|
+
|
|
32
|
+
switch (type) {
|
|
33
|
+
case Type::Micro: return Version::Micro(number);
|
|
34
|
+
case Type::rMQR: return Version::rMQR(number);
|
|
35
|
+
case Type::Model1: return Version::Model1(number);
|
|
36
|
+
case Type::Model2: return Version::Model2(number);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return nullptr;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
FormatInformation ReadFormatInformation(const BitMatrix& bitMatrix)
|
|
43
|
+
{
|
|
44
|
+
if (Version::HasValidSize(bitMatrix, Type::Micro)) {
|
|
45
|
+
// Read top-left format info bits
|
|
46
|
+
int formatInfoBits = 0;
|
|
47
|
+
for (int x = 1; x < 9; x++)
|
|
48
|
+
AppendBit(formatInfoBits, getBit(bitMatrix, x, 8));
|
|
49
|
+
for (int y = 7; y >= 1; y--)
|
|
50
|
+
AppendBit(formatInfoBits, getBit(bitMatrix, 8, y));
|
|
51
|
+
|
|
52
|
+
return FormatInformation::DecodeMQR(formatInfoBits);
|
|
53
|
+
}
|
|
54
|
+
if (Version::HasValidSize(bitMatrix, Type::rMQR)) {
|
|
55
|
+
// Read top-left format info bits
|
|
56
|
+
uint32_t formatInfoBits1 = 0;
|
|
57
|
+
for (int y = 3; y >= 1; y--)
|
|
58
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, 11, y));
|
|
59
|
+
for (int x = 10; x >= 8; x--)
|
|
60
|
+
for (int y = 5; y >= 1; y--)
|
|
61
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, x, y));
|
|
62
|
+
|
|
63
|
+
// Read bottom-right format info bits
|
|
64
|
+
uint32_t formatInfoBits2 = 0;
|
|
65
|
+
const int width = bitMatrix.width();
|
|
66
|
+
const int height = bitMatrix.height();
|
|
67
|
+
for (int x = 3; x <= 5; x++)
|
|
68
|
+
AppendBit(formatInfoBits2, getBit(bitMatrix, width - x, height - 6));
|
|
69
|
+
for (int x = 6; x <= 8; x++)
|
|
70
|
+
for (int y = 2; y <= 6; y++)
|
|
71
|
+
AppendBit(formatInfoBits2, getBit(bitMatrix, width - x, height - y));
|
|
72
|
+
|
|
73
|
+
return FormatInformation::DecodeRMQR(formatInfoBits1, formatInfoBits2);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Read top-left format info bits
|
|
77
|
+
int formatInfoBits1 = 0;
|
|
78
|
+
for (int x = 0; x < 6; x++)
|
|
79
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, x, 8));
|
|
80
|
+
// .. and skip a bit in the timing pattern ...
|
|
81
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, 7, 8));
|
|
82
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, 8, 8));
|
|
83
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, 8, 7));
|
|
84
|
+
// .. and skip a bit in the timing pattern ...
|
|
85
|
+
for (int y = 5; y >= 0; y--)
|
|
86
|
+
AppendBit(formatInfoBits1, getBit(bitMatrix, 8, y));
|
|
87
|
+
|
|
88
|
+
// Read the top-right/bottom-left pattern including the 'Dark Module' from the bottom-left
|
|
89
|
+
// part that has to be considered separately when looking for mirrored symbols.
|
|
90
|
+
// See also FormatInformation::DecodeQR
|
|
91
|
+
int dimension = bitMatrix.height();
|
|
92
|
+
int formatInfoBits2 = 0;
|
|
93
|
+
for (int y = dimension - 1; y >= dimension - 8; y--)
|
|
94
|
+
AppendBit(formatInfoBits2, getBit(bitMatrix, 8, y));
|
|
95
|
+
for (int x = dimension - 8; x < dimension; x++)
|
|
96
|
+
AppendBit(formatInfoBits2, getBit(bitMatrix, x, 8));
|
|
97
|
+
|
|
98
|
+
return FormatInformation::DecodeQR(formatInfoBits1, formatInfoBits2);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static ByteArray ReadQRCodewords(const BitMatrix& bitMatrix, const Version& version, const FormatInformation& formatInfo)
|
|
102
|
+
{
|
|
103
|
+
BitMatrix functionPattern = version.buildFunctionPattern();
|
|
104
|
+
|
|
105
|
+
ByteArray result;
|
|
106
|
+
result.reserve(version.totalCodewords());
|
|
107
|
+
uint8_t currentByte = 0;
|
|
108
|
+
bool readingUp = true;
|
|
109
|
+
int bitsRead = 0;
|
|
110
|
+
int dimension = bitMatrix.height();
|
|
111
|
+
// Read columns in pairs, from right to left
|
|
112
|
+
for (int x = dimension - 1; x > 0; x -= 2) {
|
|
113
|
+
// Skip whole column with vertical timing pattern.
|
|
114
|
+
if (x == 6)
|
|
115
|
+
x--;
|
|
116
|
+
// Read alternatingly from bottom to top then top to bottom
|
|
117
|
+
for (int row = 0; row < dimension; row++) {
|
|
118
|
+
int y = readingUp ? dimension - 1 - row : row;
|
|
119
|
+
for (int col = 0; col < 2; col++) {
|
|
120
|
+
int xx = x - col;
|
|
121
|
+
// Ignore bits covered by the function pattern
|
|
122
|
+
if (!functionPattern.get(xx, y)) {
|
|
123
|
+
// Read a bit
|
|
124
|
+
AppendBit(currentByte,
|
|
125
|
+
GetDataMaskBit(formatInfo.dataMask, xx, y) != getBit(bitMatrix, xx, y, formatInfo.isMirrored));
|
|
126
|
+
// If we've made a whole byte, save it off
|
|
127
|
+
if (++bitsRead % 8 == 0)
|
|
128
|
+
result.push_back(std::exchange(currentByte, 0));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
readingUp = !readingUp; // switch directions
|
|
133
|
+
}
|
|
134
|
+
if (Size(result) != version.totalCodewords())
|
|
135
|
+
return {};
|
|
136
|
+
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static ByteArray ReadQRCodewordsModel1(const BitMatrix& bitMatrix, const Version& version, const FormatInformation& formatInfo)
|
|
141
|
+
{
|
|
142
|
+
ByteArray result;
|
|
143
|
+
result.reserve(version.totalCodewords());
|
|
144
|
+
int dimension = bitMatrix.height();
|
|
145
|
+
int columns = dimension / 4 + 1 + 2;
|
|
146
|
+
for (int j = 0; j < columns; j++) {
|
|
147
|
+
if (j <= 1) { // vertical symbols on the right side
|
|
148
|
+
int rows = (dimension - 8) / 4;
|
|
149
|
+
for (int i = 0; i < rows; i++) {
|
|
150
|
+
if (j == 0 && i % 2 == 0 && i > 0 && i < rows - 1) // extension
|
|
151
|
+
continue;
|
|
152
|
+
int x = (dimension - 1) - (j * 2);
|
|
153
|
+
int y = (dimension - 1) - (i * 4);
|
|
154
|
+
uint8_t currentByte = 0;
|
|
155
|
+
for (int b = 0; b < 8; b++) {
|
|
156
|
+
AppendBit(currentByte, GetDataMaskBit(formatInfo.dataMask, x - b % 2, y - (b / 2))
|
|
157
|
+
!= getBit(bitMatrix, x - b % 2, y - (b / 2), formatInfo.isMirrored));
|
|
158
|
+
}
|
|
159
|
+
result.push_back(currentByte);
|
|
160
|
+
}
|
|
161
|
+
} else if (columns - j <= 4) { // vertical symbols on the left side
|
|
162
|
+
int rows = (dimension - 16) / 4;
|
|
163
|
+
for (int i = 0; i < rows; i++) {
|
|
164
|
+
int x = (columns - j - 1) * 2 + 1 + (columns - j == 4 ? 1 : 0); // timing
|
|
165
|
+
int y = (dimension - 1) - 8 - (i * 4);
|
|
166
|
+
uint8_t currentByte = 0;
|
|
167
|
+
for (int b = 0; b < 8; b++) {
|
|
168
|
+
AppendBit(currentByte, GetDataMaskBit(formatInfo.dataMask, x - b % 2, y - (b / 2))
|
|
169
|
+
!= getBit(bitMatrix, x - b % 2, y - (b / 2), formatInfo.isMirrored));
|
|
170
|
+
}
|
|
171
|
+
result.push_back(currentByte);
|
|
172
|
+
}
|
|
173
|
+
} else { // horizontal symbols
|
|
174
|
+
int rows = dimension / 2;
|
|
175
|
+
for (int i = 0; i < rows; i++) {
|
|
176
|
+
if (j == 2 && i >= rows - 4) // alignment & finder
|
|
177
|
+
continue;
|
|
178
|
+
if (i == 0 && j % 2 == 1 && j + 1 != columns - 4) // extension
|
|
179
|
+
continue;
|
|
180
|
+
int x = (dimension - 1) - (2 * 2) - (j - 2) * 4;
|
|
181
|
+
int y = (dimension - 1) - (i * 2) - (i >= rows - 3 ? 1 : 0); // timing
|
|
182
|
+
uint8_t currentByte = 0;
|
|
183
|
+
for (int b = 0; b < 8; b++) {
|
|
184
|
+
AppendBit(currentByte, GetDataMaskBit(formatInfo.dataMask, x - b % 4, y - (b / 4))
|
|
185
|
+
!= getBit(bitMatrix, x - b % 4, y - (b / 4), formatInfo.isMirrored));
|
|
186
|
+
}
|
|
187
|
+
result.push_back(currentByte);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
result[0] &= 0xf; // ignore corner
|
|
193
|
+
if (Size(result) != version.totalCodewords())
|
|
194
|
+
return {};
|
|
195
|
+
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static ByteArray ReadMQRCodewords(const BitMatrix& bitMatrix, const QRCode::Version& version, const FormatInformation& formatInfo)
|
|
200
|
+
{
|
|
201
|
+
BitMatrix functionPattern = version.buildFunctionPattern();
|
|
202
|
+
|
|
203
|
+
// D3 in a Version M1 symbol, D11 in a Version M3-L symbol and D9
|
|
204
|
+
// in a Version M3-M symbol is a 2x2 square 4-module block.
|
|
205
|
+
// See ISO 18004:2006 6.7.3.
|
|
206
|
+
bool hasD4mBlock = version.versionNumber() % 2 == 1;
|
|
207
|
+
int d4mBlockIndex =
|
|
208
|
+
version.versionNumber() == 1 ? 3 : (formatInfo.ecLevel == QRCode::ErrorCorrectionLevel::Low ? 11 : 9);
|
|
209
|
+
|
|
210
|
+
ByteArray result;
|
|
211
|
+
result.reserve(version.totalCodewords());
|
|
212
|
+
uint8_t currentByte = 0;
|
|
213
|
+
bool readingUp = true;
|
|
214
|
+
int bitsRead = 0;
|
|
215
|
+
int dimension = bitMatrix.height();
|
|
216
|
+
// Read columns in pairs, from right to left
|
|
217
|
+
for (int x = dimension - 1; x > 0; x -= 2) {
|
|
218
|
+
// Read alternatingly from bottom to top then top to bottom
|
|
219
|
+
for (int row = 0; row < dimension; row++) {
|
|
220
|
+
int y = readingUp ? dimension - 1 - row : row;
|
|
221
|
+
for (int col = 0; col < 2; col++) {
|
|
222
|
+
int xx = x - col;
|
|
223
|
+
// Ignore bits covered by the function pattern
|
|
224
|
+
if (!functionPattern.get(xx, y)) {
|
|
225
|
+
// Read a bit
|
|
226
|
+
AppendBit(currentByte,
|
|
227
|
+
GetDataMaskBit(formatInfo.dataMask, xx, y, true) != getBit(bitMatrix, xx, y, formatInfo.isMirrored));
|
|
228
|
+
++bitsRead;
|
|
229
|
+
// If we've made a whole byte, save it off; save early if 2x2 data block.
|
|
230
|
+
if (bitsRead == 8 || (bitsRead == 4 && hasD4mBlock && Size(result) == d4mBlockIndex - 1)) {
|
|
231
|
+
result.push_back(std::exchange(currentByte, 0));
|
|
232
|
+
bitsRead = 0;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
readingUp = !readingUp; // switch directions
|
|
238
|
+
}
|
|
239
|
+
if (Size(result) != version.totalCodewords())
|
|
240
|
+
return {};
|
|
241
|
+
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static ByteArray ReadRMQRCodewords(const BitMatrix& bitMatrix, const Version& version, const FormatInformation& formatInfo)
|
|
246
|
+
{
|
|
247
|
+
BitMatrix functionPattern = version.buildFunctionPattern();
|
|
248
|
+
|
|
249
|
+
ByteArray result;
|
|
250
|
+
result.reserve(version.totalCodewords());
|
|
251
|
+
uint8_t currentByte = 0;
|
|
252
|
+
bool readingUp = true;
|
|
253
|
+
int bitsRead = 0;
|
|
254
|
+
const int width = bitMatrix.width();
|
|
255
|
+
const int height = bitMatrix.height();
|
|
256
|
+
// Read columns in pairs, from right to left
|
|
257
|
+
for (int x = width - 1 - 1; x > 0; x -= 2) { // Skip right edge alignment
|
|
258
|
+
// Read alternatingly from bottom to top then top to bottom
|
|
259
|
+
for (int row = 0; row < height; row++) {
|
|
260
|
+
int y = readingUp ? height - 1 - row : row;
|
|
261
|
+
for (int col = 0; col < 2; col++) {
|
|
262
|
+
int xx = x - col;
|
|
263
|
+
// Ignore bits covered by the function pattern
|
|
264
|
+
if (!functionPattern.get(xx, y)) {
|
|
265
|
+
// Read a bit
|
|
266
|
+
AppendBit(currentByte,
|
|
267
|
+
GetDataMaskBit(formatInfo.dataMask, xx, y) != getBit(bitMatrix, xx, y, formatInfo.isMirrored));
|
|
268
|
+
// If we've made a whole byte, save it off
|
|
269
|
+
if (++bitsRead % 8 == 0)
|
|
270
|
+
result.push_back(std::exchange(currentByte, 0));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
readingUp = !readingUp; // switch directions
|
|
275
|
+
}
|
|
276
|
+
if (Size(result) != version.totalCodewords())
|
|
277
|
+
return {};
|
|
278
|
+
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
ByteArray ReadCodewords(const BitMatrix& bitMatrix, const Version& version, const FormatInformation& formatInfo)
|
|
283
|
+
{
|
|
284
|
+
switch (version.type()) {
|
|
285
|
+
case Type::Micro: return ReadMQRCodewords(bitMatrix, version, formatInfo);
|
|
286
|
+
case Type::rMQR: return ReadRMQRCodewords(bitMatrix, version, formatInfo);
|
|
287
|
+
case Type::Model1: return ReadQRCodewordsModel1(bitMatrix, version, formatInfo);
|
|
288
|
+
case Type::Model2: return ReadQRCodewords(bitMatrix, version, formatInfo);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return {};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
} // namespace ZXing::QRCode
|
|
@@ -0,0 +1,41 @@
|
|
|
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 "QRErrorCorrectionLevel.h"
|
|
10
|
+
|
|
11
|
+
namespace ZXing {
|
|
12
|
+
|
|
13
|
+
class BitMatrix;
|
|
14
|
+
class ByteArray;
|
|
15
|
+
|
|
16
|
+
namespace QRCode {
|
|
17
|
+
|
|
18
|
+
class Version;
|
|
19
|
+
class FormatInformation;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @brief Reads version information from the QR Code.
|
|
23
|
+
* @return {@link Version} encapsulating the QR Code's version, nullptr if neither location can be parsed
|
|
24
|
+
*/
|
|
25
|
+
const Version* ReadVersion(const BitMatrix& bitMatrix, Type type);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @brief Reads format information from one of its two locations within the QR Code.
|
|
29
|
+
* @return {@link FormatInformation} encapsulating the QR Code's format info, result is invalid if both format
|
|
30
|
+
* information locations cannot be parsed as the valid encoding of format information
|
|
31
|
+
*/
|
|
32
|
+
FormatInformation ReadFormatInformation(const BitMatrix& bitMatrix);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @brief Reads the codewords from the BitMatrix.
|
|
36
|
+
* @return bytes encoded within the QR Code or empty array if the exact number of bytes expected is not read
|
|
37
|
+
*/
|
|
38
|
+
ByteArray ReadCodewords(const BitMatrix& bitMatrix, const Version& version, const FormatInformation& formatInfo);
|
|
39
|
+
|
|
40
|
+
} // QRCode
|
|
41
|
+
} // ZXing
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Nu-book Inc.
|
|
3
|
+
* Copyright 2016 ZXing authors
|
|
4
|
+
* Copyright 2023 gitlost
|
|
5
|
+
*/
|
|
6
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
|
|
8
|
+
#include "QRCodecMode.h"
|
|
9
|
+
|
|
10
|
+
#include "Error.h"
|
|
11
|
+
#include "QRVersion.h"
|
|
12
|
+
#include "ZXAlgorithms.h"
|
|
13
|
+
|
|
14
|
+
#include <array>
|
|
15
|
+
|
|
16
|
+
namespace ZXing::QRCode {
|
|
17
|
+
|
|
18
|
+
CodecMode CodecModeForBits(int bits, Type type)
|
|
19
|
+
{
|
|
20
|
+
if (type == Type::Micro) {
|
|
21
|
+
constexpr CodecMode Bits2Mode[4] = {CodecMode::NUMERIC, CodecMode::ALPHANUMERIC, CodecMode::BYTE, CodecMode::KANJI};
|
|
22
|
+
if (bits < Size(Bits2Mode))
|
|
23
|
+
return Bits2Mode[bits];
|
|
24
|
+
} else if (type == Type::rMQR) {
|
|
25
|
+
constexpr CodecMode Bits2Mode[8] = {
|
|
26
|
+
CodecMode::TERMINATOR, CodecMode::NUMERIC, CodecMode::ALPHANUMERIC, CodecMode::BYTE,
|
|
27
|
+
CodecMode::KANJI, CodecMode::FNC1_FIRST_POSITION, CodecMode::FNC1_SECOND_POSITION, CodecMode::ECI
|
|
28
|
+
};
|
|
29
|
+
if (bits < Size(Bits2Mode))
|
|
30
|
+
return Bits2Mode[bits];
|
|
31
|
+
} else {
|
|
32
|
+
if ((bits >= 0x00 && bits <= 0x05) || (bits >= 0x07 && bits <= 0x09) || bits == 0x0d)
|
|
33
|
+
return static_cast<CodecMode>(bits);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
throw FormatError("Invalid codec mode");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
int CharacterCountBits(CodecMode mode, const Version& version)
|
|
40
|
+
{
|
|
41
|
+
int number = version.versionNumber();
|
|
42
|
+
if (version.isMicro()) {
|
|
43
|
+
switch (mode) {
|
|
44
|
+
case CodecMode::NUMERIC: return std::array{3, 4, 5, 6}[number - 1];
|
|
45
|
+
case CodecMode::ALPHANUMERIC: return std::array{3, 4, 5}[number - 2];
|
|
46
|
+
case CodecMode::BYTE: return std::array{4, 5}[number - 3];
|
|
47
|
+
case CodecMode::KANJI: [[fallthrough]];
|
|
48
|
+
case CodecMode::HANZI: return std::array{3, 4}[number - 3];
|
|
49
|
+
default: return 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (version.isRMQR()) {
|
|
53
|
+
// See ISO/IEC 23941:2022 7.4.1, Table 3 - Number of bits of character count indicator
|
|
54
|
+
constexpr char numeric[32] = {4, 5, 6, 7, 7, 5, 6, 7, 7, 8, 4, 6, 7, 7, 8, 8, 5, 6, 7, 7, 8, 8, 7, 7, 8, 8, 9, 7, 8, 8, 8, 9};
|
|
55
|
+
constexpr char alphanum[32] = {3, 5, 5, 6, 6, 5, 5, 6, 6, 7, 4, 5, 6, 6, 7, 7, 5, 6, 6, 7, 7, 8, 6, 7, 7, 7, 8, 6, 7, 7, 8, 8};
|
|
56
|
+
constexpr char byte[32] = {3, 4, 5, 5, 6, 4, 5, 5, 6, 6, 3, 5, 5, 6, 6, 7, 4, 5, 6, 6, 7, 7, 6, 6, 7, 7, 7, 6, 6, 7, 7, 8};
|
|
57
|
+
constexpr char kanji[32] = {2, 3, 4, 5, 5, 3, 4, 5, 5, 6, 2, 4, 5, 5, 6, 6, 3, 5, 5, 6, 6, 7, 5, 5, 6, 6, 7, 5, 6, 6, 6, 7};
|
|
58
|
+
switch (mode) {
|
|
59
|
+
case CodecMode::NUMERIC: return numeric[number - 1];
|
|
60
|
+
case CodecMode::ALPHANUMERIC: return alphanum[number - 1];
|
|
61
|
+
case CodecMode::BYTE: return byte[number - 1];
|
|
62
|
+
case CodecMode::KANJI: return kanji[number - 1];
|
|
63
|
+
default: return 0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
int i;
|
|
68
|
+
if (number <= 9)
|
|
69
|
+
i = 0;
|
|
70
|
+
else if (number <= 26)
|
|
71
|
+
i = 1;
|
|
72
|
+
else
|
|
73
|
+
i = 2;
|
|
74
|
+
|
|
75
|
+
switch (mode) {
|
|
76
|
+
case CodecMode::NUMERIC: return std::array{10, 12, 14}[i];
|
|
77
|
+
case CodecMode::ALPHANUMERIC: return std::array{9, 11, 13}[i];
|
|
78
|
+
case CodecMode::BYTE: return std::array{8, 16, 16}[i];
|
|
79
|
+
case CodecMode::KANJI: [[fallthrough]];
|
|
80
|
+
case CodecMode::HANZI: return std::array{8, 10, 12}[i];
|
|
81
|
+
default: return 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
int CodecModeBitsLength(const Version& version)
|
|
86
|
+
{
|
|
87
|
+
return version.isMicro() ? version.versionNumber() - 1 : 4 - version.isRMQR();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
int TerminatorBitsLength(const Version& version)
|
|
91
|
+
{
|
|
92
|
+
return version.isMicro() ? version.versionNumber() * 2 + 1 : 4 - version.isRMQR();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
} // namespace ZXing::QRCode
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
namespace ZXing::QRCode {
|
|
10
|
+
|
|
11
|
+
enum class Type;
|
|
12
|
+
class Version;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <p>See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which
|
|
16
|
+
* data can be encoded to bits in the QR code standard.</p>
|
|
17
|
+
*/
|
|
18
|
+
enum class CodecMode
|
|
19
|
+
{
|
|
20
|
+
TERMINATOR = 0x00, // Not really a mode...
|
|
21
|
+
NUMERIC = 0x01,
|
|
22
|
+
ALPHANUMERIC = 0x02,
|
|
23
|
+
STRUCTURED_APPEND = 0x03,
|
|
24
|
+
BYTE = 0x04,
|
|
25
|
+
FNC1_FIRST_POSITION = 0x05,
|
|
26
|
+
ECI = 0x07, // character counts don't apply
|
|
27
|
+
KANJI = 0x08,
|
|
28
|
+
FNC1_SECOND_POSITION = 0x09,
|
|
29
|
+
HANZI = 0x0D, // See GBT 18284-2000; "Hanzi" is a transliteration of this mode name.
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param bits variable number of bits encoding a QR Code data mode
|
|
34
|
+
* @param type type of QR Code
|
|
35
|
+
* @return Mode encoded by these bits
|
|
36
|
+
* @throws FormatError if bits do not correspond to a known mode
|
|
37
|
+
*/
|
|
38
|
+
CodecMode CodecModeForBits(int bits, Type type);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param version version in question
|
|
42
|
+
* @return number of bits used, in this QR Code symbol {@link Version}, to encode the
|
|
43
|
+
* count of characters that will follow encoded in this Mode
|
|
44
|
+
*/
|
|
45
|
+
int CharacterCountBits(CodecMode mode, const Version& version);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param version version in question
|
|
49
|
+
* @return number of bits used to encode a codec mode.
|
|
50
|
+
*/
|
|
51
|
+
int CodecModeBitsLength(const Version& version);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @param version version in question
|
|
55
|
+
* @return number of bits in the Terminator code.
|
|
56
|
+
*/
|
|
57
|
+
int TerminatorBitsLength(const Version& version);
|
|
58
|
+
|
|
59
|
+
} // namespace ZXing::QRCode
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2016 Nu-book Inc.
|
|
3
|
+
* Copyright 2016 ZXing authors
|
|
4
|
+
*/
|
|
5
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
|
|
7
|
+
#include "QRDataBlock.h"
|
|
8
|
+
|
|
9
|
+
#include "ByteArray.h"
|
|
10
|
+
#include "QRErrorCorrectionLevel.h"
|
|
11
|
+
#include "QRVersion.h"
|
|
12
|
+
#include "ZXAlgorithms.h"
|
|
13
|
+
|
|
14
|
+
namespace ZXing::QRCode {
|
|
15
|
+
|
|
16
|
+
std::vector<DataBlock> DataBlock::GetDataBlocks(const ByteArray& rawCodewords, const Version& version, ErrorCorrectionLevel ecLevel)
|
|
17
|
+
{
|
|
18
|
+
if (Size(rawCodewords) != version.totalCodewords())
|
|
19
|
+
return {};
|
|
20
|
+
|
|
21
|
+
// Figure out the number and size of data blocks used by this version and
|
|
22
|
+
// error correction level
|
|
23
|
+
auto& ecBlocks = version.ecBlocksForLevel(ecLevel);
|
|
24
|
+
|
|
25
|
+
// First count the total number of data blocks
|
|
26
|
+
int totalBlocks = ecBlocks.numBlocks();
|
|
27
|
+
if (totalBlocks == 0)
|
|
28
|
+
return {};
|
|
29
|
+
|
|
30
|
+
std::vector<DataBlock> result(totalBlocks);
|
|
31
|
+
// Now establish DataBlocks of the appropriate size and number of data codewords
|
|
32
|
+
int numResultBlocks = 0;
|
|
33
|
+
for (auto& ecBlock : ecBlocks.blockArray()) {
|
|
34
|
+
for (int i = 0; i < ecBlock.count; i++) {
|
|
35
|
+
auto& item = result[numResultBlocks++];
|
|
36
|
+
item._numDataCodewords = ecBlock.dataCodewords;
|
|
37
|
+
item._codewords.resize(ecBlocks.codewordsPerBlock + ecBlock.dataCodewords);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// All blocks have the same amount of data, except that the last n
|
|
42
|
+
// (where n may be 0) have 1 more byte. Figure out where these start.
|
|
43
|
+
int shorterBlocksTotalCodewords = Size(result[0]._codewords);
|
|
44
|
+
int longerBlocksStartAt = Size(result) - 1;
|
|
45
|
+
while (longerBlocksStartAt >= 0) {
|
|
46
|
+
int numCodewords = Size(result[longerBlocksStartAt]._codewords);
|
|
47
|
+
if (numCodewords == shorterBlocksTotalCodewords) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
longerBlocksStartAt--;
|
|
51
|
+
}
|
|
52
|
+
longerBlocksStartAt++;
|
|
53
|
+
|
|
54
|
+
int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.codewordsPerBlock;
|
|
55
|
+
// The last elements of result may be 1 element longer;
|
|
56
|
+
// first fill out as many elements as all of them have
|
|
57
|
+
int rawCodewordsOffset = 0;
|
|
58
|
+
if (version.isModel1()) {
|
|
59
|
+
// in Model 1 symbols the data blocks are concatenated back to back
|
|
60
|
+
for (int j = 0; j < numResultBlocks; j++)
|
|
61
|
+
for (int i = 0; i < shorterBlocksNumDataCodewords; i++)
|
|
62
|
+
result[j]._codewords[i] = rawCodewords[rawCodewordsOffset++];
|
|
63
|
+
} else {
|
|
64
|
+
// in all others, the data blocks are interleaved
|
|
65
|
+
for (int i = 0; i < shorterBlocksNumDataCodewords; i++)
|
|
66
|
+
for (int j = 0; j < numResultBlocks; j++)
|
|
67
|
+
result[j]._codewords[i] = rawCodewords[rawCodewordsOffset++];
|
|
68
|
+
}
|
|
69
|
+
// Fill out the last data block in the longer ones
|
|
70
|
+
for (int j = longerBlocksStartAt; j < numResultBlocks; j++) {
|
|
71
|
+
result[j]._codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++];
|
|
72
|
+
}
|
|
73
|
+
// Now add in error correction blocks
|
|
74
|
+
int max = Size(result[0]._codewords);
|
|
75
|
+
if (version.isModel1()) {
|
|
76
|
+
for (int j = 0; j < numResultBlocks; j++) {
|
|
77
|
+
for (int i = shorterBlocksNumDataCodewords; i < max; i++) {
|
|
78
|
+
int iOffset = j < longerBlocksStartAt ? i : i + 1;
|
|
79
|
+
result[j]._codewords[iOffset] = rawCodewords[rawCodewordsOffset++];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
for (int i = shorterBlocksNumDataCodewords; i < max; i++) {
|
|
84
|
+
for (int j = 0; j < numResultBlocks; j++) {
|
|
85
|
+
int iOffset = j < longerBlocksStartAt ? i : i + 1;
|
|
86
|
+
result[j]._codewords[iOffset] = rawCodewords[rawCodewordsOffset++];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
} // namespace ZXing::QRCode
|