zxing_cpp 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile +3 -0
- data/Manifest.txt +331 -0
- data/README.rdoc +138 -0
- data/Rakefile +28 -0
- data/bin/zxd +87 -0
- data/bin/zxe +53 -0
- data/ext/zxing/extconf.rb +27 -0
- data/ext/zxing/zxing-cpp/.gitignore +4 -0
- data/ext/zxing/zxing-cpp/AUTHORS +115 -0
- data/ext/zxing/zxing-cpp/CMakeLists.txt +84 -0
- data/ext/zxing/zxing-cpp/COPYING +201 -0
- data/ext/zxing/zxing-cpp/NOTICE +65 -0
- data/ext/zxing/zxing-cpp/README.md +50 -0
- data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.cpp +112 -0
- data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.h +40 -0
- data/ext/zxing/zxing-cpp/cli/src/jpgd.cpp +3174 -0
- data/ext/zxing/zxing-cpp/cli/src/jpgd.h +319 -0
- data/ext/zxing/zxing-cpp/cli/src/lodepng.cpp +6261 -0
- data/ext/zxing/zxing-cpp/cli/src/lodepng.h +1695 -0
- data/ext/zxing/zxing-cpp/cli/src/main.cpp +297 -0
- data/ext/zxing/zxing-cpp/cmake/FindCPPUNIT.cmake +54 -0
- data/ext/zxing/zxing-cpp/cmake/FindIconv.cmake +57 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/.gitignore +6 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.cc +405 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.hh +215 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.cc +70 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.hh +25 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerLibrary.hh +8 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.cc +50 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.hh +72 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.cc +697 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.hh +418 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.cc +125 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.hh +122 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/ChangeLog +146 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/Makefile +73 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/NumberlikeArray.hh +177 -0
- data/ext/zxing/zxing-cpp/core/src/bigint/README +71 -0
- data/ext/zxing/zxing-cpp/core/src/win32/zxing/iconv.h +14 -0
- data/ext/zxing/zxing-cpp/core/src/win32/zxing/stdint.h +247 -0
- data/ext/zxing/zxing-cpp/core/src/win32/zxing/win_iconv.c +2035 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.cpp +40 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.h +60 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.cpp +45 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.h +50 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.cpp +70 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.h +56 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.cpp +28 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.h +34 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.cpp +142 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.h +85 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Exception.cpp +43 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Exception.h +51 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.cpp +41 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.h +37 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/IllegalStateException.h +35 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.cpp +68 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.cpp +86 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.h +59 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.cpp +124 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/NotFoundException.h +35 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Reader.cpp +31 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Reader.h +40 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ReaderException.h +37 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Result.cpp +61 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/Result.h +55 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ResultIO.cpp +34 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.cpp +108 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.h +55 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.cpp +26 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.h +39 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/ZXing.h +133 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.cpp +54 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.cpp +68 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.cpp +489 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.h +69 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.cpp +548 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.h +92 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/Array.h +170 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.cpp +155 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.h +81 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArrayIO.cpp +31 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.cpp +143 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.h +91 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.cpp +76 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.h +74 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.cpp +104 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.h +53 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/Counted.h +140 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.cpp +46 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.h +51 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.cpp +39 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.h +43 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp +212 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp +80 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.h +53 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +81 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +46 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.cpp +122 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.h +45 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.cpp +226 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.h +67 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.cpp +27 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.h +36 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.cpp +107 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/Point.h +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.cpp +61 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.h +51 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.cpp +198 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.h +52 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/JavaMath.h +43 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MathUtils.h +57 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp +174 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h +62 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp +330 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h +59 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp +150 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.h +73 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp +218 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h +56 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +174 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +30 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h +33 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp +54 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.h +45 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.cpp +199 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.h +87 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +361 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +59 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp +113 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +416 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +104 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp +93 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp +46 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.h +43 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.cpp +446 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.h +94 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp +23 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.h +23 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.cpp +75 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.h +42 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp +137 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h +51 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp +29 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.h +41 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp +58 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h +36 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h +37 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp +236 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.cpp +340 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.h +57 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.cpp +496 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.cpp +328 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.h +63 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.cpp +293 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.h +58 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.cpp +85 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.cpp +65 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.h +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.cpp +337 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.h +54 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp +96 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.h +38 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +110 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h +41 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.cpp +227 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.h +81 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.cpp +28 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.h +35 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.cpp +71 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.h +50 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.cpp +309 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.h +88 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.cpp +146 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.h +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.cpp +170 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.h +49 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp +997 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h +84 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp +563 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h +84 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.cpp +118 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.h +62 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp +214 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h +71 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp +120 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h +72 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp +284 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h +68 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.cpp +664 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.h +106 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp +714 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.h +122 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +65 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h +52 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.cpp +117 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.h +54 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.cpp +52 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.cpp +560 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.h +85 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +183 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h +56 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp +118 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.h +50 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.cpp +159 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.h +50 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +425 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +72 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.cpp +107 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.h +46 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.cpp +90 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.h +57 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +47 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h +45 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +208 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +68 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.cpp +314 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.h +69 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp +69 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.h +48 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +559 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h +76 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +41 -0
- data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h +47 -0
- data/ext/zxing/zxing-cpp/core/tests/src/TestRunner.cpp +30 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.cpp +216 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.h +61 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.cpp +106 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.h +55 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.cpp +49 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.h +42 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.cpp +58 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.h +46 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.cpp +69 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.h +47 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +129 -0
- data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h +62 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +47 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +45 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.cpp +88 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.h +47 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.cpp +88 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.h +49 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp +132 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.h +91 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.cpp +52 -0
- data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.h +47 -0
- data/ext/zxing/zxing.cc +224 -0
- data/lib/zxing.rb +50 -0
- data/lib/zxing/.gitignore +2 -0
- data/lib/zxing/aztec.rb +5 -0
- data/lib/zxing/aztec/aztec_reader.rb +14 -0
- data/lib/zxing/bad_image_exception.rb +4 -0
- data/lib/zxing/binarizer.rb +8 -0
- data/lib/zxing/binary_bitmap.rb +15 -0
- data/lib/zxing/checksum_exception.rb +4 -0
- data/lib/zxing/common.rb +7 -0
- data/lib/zxing/common/bit_matrix.rb +9 -0
- data/lib/zxing/common/hybrid_binarizer.rb +17 -0
- data/lib/zxing/common/illegal_argument_exception.rb +4 -0
- data/lib/zxing/datamatrix.rb +5 -0
- data/lib/zxing/datamatrix/data_matrix_reader.rb +14 -0
- data/lib/zxing/decodable.rb +11 -0
- data/lib/zxing/exception.rb +4 -0
- data/lib/zxing/ffi.rb +20 -0
- data/lib/zxing/ffi/aztec.rb +6 -0
- data/lib/zxing/ffi/aztec/aztec_reader.rb +9 -0
- data/lib/zxing/ffi/binarizer.rb +25 -0
- data/lib/zxing/ffi/binary_bitmap.rb +15 -0
- data/lib/zxing/ffi/common.rb +8 -0
- data/lib/zxing/ffi/common/bit_matrix.rb +12 -0
- data/lib/zxing/ffi/common/greyscale_luminance_source.rb +30 -0
- data/lib/zxing/ffi/common/hybrid_binarizer.rb +10 -0
- data/lib/zxing/ffi/datamatrix.rb +6 -0
- data/lib/zxing/ffi/datamatrix/data_matrix_reader.rb +9 -0
- data/lib/zxing/ffi/library.rb +102 -0
- data/lib/zxing/ffi/luminance_source.rb +18 -0
- data/lib/zxing/ffi/multi_format_reader.rb +9 -0
- data/lib/zxing/ffi/oned.rb +6 -0
- data/lib/zxing/ffi/oned/code_39_reader.rb +10 -0
- data/lib/zxing/ffi/qrcode.rb +8 -0
- data/lib/zxing/ffi/qrcode/decoder.rb +10 -0
- data/lib/zxing/ffi/qrcode/detector.rb +10 -0
- data/lib/zxing/ffi/reader.rb +58 -0
- data/lib/zxing/ffi/result.rb +23 -0
- data/lib/zxing/format_exception.rb +4 -0
- data/lib/zxing/illegal_argument_exception.rb +4 -0
- data/lib/zxing/image.rb +15 -0
- data/lib/zxing/luminance_source.rb +18 -0
- data/lib/zxing/multi_format_reader.rb +11 -0
- data/lib/zxing/not_found_exception.rb +4 -0
- data/lib/zxing/oned.rb +5 -0
- data/lib/zxing/oned/code_39_reader.rb +15 -0
- data/lib/zxing/qrcode.rb +8 -0
- data/lib/zxing/qrcode/decoder.rb +14 -0
- data/lib/zxing/qrcode/detector.rb +14 -0
- data/lib/zxing/qrcode/encoder.rb +8 -0
- data/lib/zxing/qrcode/encoder/byte_matrix.rb +18 -0
- data/lib/zxing/qrcode/encoder/encoder.rb +9 -0
- data/lib/zxing/qrcode/encoder/qrcode.rb +18 -0
- data/lib/zxing/reader.rb +8 -0
- data/lib/zxing/reader_exception.rb +4 -0
- data/lib/zxing/reed_solomon_exception.rb +2 -0
- data/lib/zxing/result.rb +18 -0
- data/lib/zxing/rmagick.rb +5 -0
- data/lib/zxing/rmagick/image.rb +104 -0
- data/lib/zxing/version.rb +33 -0
- data/test/qrcode.png +0 -0
- data/test/test_helper.rb +5 -0
- data/test/test_zxing.rb +58 -0
- data/test/vendor.rb +360 -0
- data/test/zxing/test_decodable.rb +38 -0
- data/zxing_cpp.gemspec +48 -0
- metadata +473 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __DECODED_BIT_STREAM_PARSER_PD_H__
|
|
3
|
+
#define __DECODED_BIT_STREAM_PARSER_PD_H__
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Copyright 2010 ZXing authors All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#include <bigint/BigInteger.hh>
|
|
22
|
+
#include <zxing/common/Array.h>
|
|
23
|
+
#include <zxing/common/Str.h>
|
|
24
|
+
#include <zxing/common/DecoderResult.h>
|
|
25
|
+
|
|
26
|
+
namespace zxing {
|
|
27
|
+
namespace pdf417 {
|
|
28
|
+
|
|
29
|
+
class DecodedBitStreamParser {
|
|
30
|
+
protected:
|
|
31
|
+
enum Mode {
|
|
32
|
+
ALPHA,
|
|
33
|
+
LOWER,
|
|
34
|
+
MIXED,
|
|
35
|
+
PUNCT,
|
|
36
|
+
ALPHA_SHIFT,
|
|
37
|
+
PUNCT_SHIFT
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
private:
|
|
41
|
+
|
|
42
|
+
static const int TEXT_COMPACTION_MODE_LATCH;
|
|
43
|
+
static const int BYTE_COMPACTION_MODE_LATCH;
|
|
44
|
+
static const int NUMERIC_COMPACTION_MODE_LATCH;
|
|
45
|
+
static const int BYTE_COMPACTION_MODE_LATCH_6;
|
|
46
|
+
static const int BEGIN_MACRO_PDF417_CONTROL_BLOCK;
|
|
47
|
+
static const int BEGIN_MACRO_PDF417_OPTIONAL_FIELD;
|
|
48
|
+
static const int MACRO_PDF417_TERMINATOR;
|
|
49
|
+
static const int MODE_SHIFT_TO_BYTE_COMPACTION_MODE;
|
|
50
|
+
static const int MAX_NUMERIC_CODEWORDS;
|
|
51
|
+
|
|
52
|
+
static const int PL;
|
|
53
|
+
static const int LL;
|
|
54
|
+
static const int AS;
|
|
55
|
+
static const int ML;
|
|
56
|
+
static const int AL;
|
|
57
|
+
static const int PS;
|
|
58
|
+
static const int PAL;
|
|
59
|
+
static const int EXP900_SIZE;
|
|
60
|
+
|
|
61
|
+
static const char PUNCT_CHARS[];
|
|
62
|
+
static const char MIXED_CHARS[];
|
|
63
|
+
|
|
64
|
+
static ArrayRef<BigInteger> EXP900;
|
|
65
|
+
static ArrayRef<BigInteger> initEXP900();
|
|
66
|
+
|
|
67
|
+
static int textCompaction(ArrayRef<int> codewords, int codeIndex, Ref<String> result);
|
|
68
|
+
static void decodeTextCompaction(ArrayRef<int> textCompactionData,
|
|
69
|
+
ArrayRef<int> byteCompactionData,
|
|
70
|
+
int length,
|
|
71
|
+
Ref<String> result);
|
|
72
|
+
static int byteCompaction(int mode, ArrayRef<int> codewords, int codeIndex, Ref<String> result);
|
|
73
|
+
static int numericCompaction(ArrayRef<int> codewords, int codeIndex, Ref<String> result);
|
|
74
|
+
static Ref<String> decodeBase900toBase10(ArrayRef<int> codewords, int count);
|
|
75
|
+
|
|
76
|
+
public:
|
|
77
|
+
DecodedBitStreamParser();
|
|
78
|
+
static Ref<DecoderResult> decode(ArrayRef<int> codewords);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
} /* namespace pdf417 */
|
|
82
|
+
} /* namespace zxing */
|
|
83
|
+
|
|
84
|
+
#endif // __DECODED_BIT_STREAM_PARSER_PD_H__
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2010, 2012 ZXing authors All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
* 2012-06-27 hfn: PDF417 Reed-Solomon error correction, using following Java
|
|
18
|
+
* source code:
|
|
19
|
+
* http://code.google.com/p/zxing/issues/attachmentText?id=817&aid=8170033000&name=pdf417-java-reed-solomon-error-correction-2.patch&token=0819f5d7446ae2814fd91385eeec6a11
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
#include <zxing/pdf417/PDF417Reader.h>
|
|
23
|
+
#include <zxing/pdf417/decoder/Decoder.h>
|
|
24
|
+
#include <zxing/pdf417/decoder/BitMatrixParser.h>
|
|
25
|
+
#include <zxing/pdf417/decoder/DecodedBitStreamParser.h>
|
|
26
|
+
#include <zxing/ReaderException.h>
|
|
27
|
+
#include <zxing/common/reedsolomon/ReedSolomonException.h>
|
|
28
|
+
|
|
29
|
+
using zxing::pdf417::decoder::Decoder;
|
|
30
|
+
using zxing::pdf417::decoder::ec::ErrorCorrection;
|
|
31
|
+
using zxing::Ref;
|
|
32
|
+
using zxing::DecoderResult;
|
|
33
|
+
|
|
34
|
+
// VC++
|
|
35
|
+
|
|
36
|
+
using zxing::BitMatrix;
|
|
37
|
+
using zxing::DecodeHints;
|
|
38
|
+
using zxing::ArrayRef;
|
|
39
|
+
|
|
40
|
+
const int Decoder::MAX_ERRORS = 3;
|
|
41
|
+
const int Decoder::MAX_EC_CODEWORDS = 512;
|
|
42
|
+
|
|
43
|
+
Ref<DecoderResult> Decoder::decode(Ref<BitMatrix> bits, DecodeHints const& hints) {
|
|
44
|
+
(void)hints;
|
|
45
|
+
// Construct a parser to read the data codewords and error-correction level
|
|
46
|
+
BitMatrixParser parser(bits);
|
|
47
|
+
ArrayRef<int> codewords(parser.readCodewords());
|
|
48
|
+
if (codewords->size() == 0) {
|
|
49
|
+
throw FormatException("PDF:Decoder:decode: cannot read codewords");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
int ecLevel = parser.getECLevel();
|
|
53
|
+
int numECCodewords = 1 << (ecLevel + 1);
|
|
54
|
+
ArrayRef<int> erasures = parser.getErasures();
|
|
55
|
+
|
|
56
|
+
correctErrors(codewords, erasures, numECCodewords);
|
|
57
|
+
verifyCodewordCount(codewords, numECCodewords);
|
|
58
|
+
|
|
59
|
+
// Decode the codewords
|
|
60
|
+
return DecodedBitStreamParser::decode(codewords);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Verify that all is OK with the codeword array.
|
|
65
|
+
*
|
|
66
|
+
* @param codewords
|
|
67
|
+
* @return an index to the first data codeword.
|
|
68
|
+
* @throws FormatException
|
|
69
|
+
*/
|
|
70
|
+
void Decoder::verifyCodewordCount(ArrayRef<int> codewords, int numECCodewords) {
|
|
71
|
+
int cwsize = codewords->size();
|
|
72
|
+
if (cwsize < 4) {
|
|
73
|
+
// Codeword array size should be at least 4 allowing for
|
|
74
|
+
// Count CW, At least one Data CW, Error Correction CW, Error Correction CW
|
|
75
|
+
throw FormatException("PDF:Decoder:verifyCodewordCount: codeword array too small!");
|
|
76
|
+
}
|
|
77
|
+
// The first codeword, the Symbol Length Descriptor, shall always encode the total number of data
|
|
78
|
+
// codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad
|
|
79
|
+
// codewords, but excluding the number of error correction codewords.
|
|
80
|
+
int numberOfCodewords = codewords[0];
|
|
81
|
+
if (numberOfCodewords > cwsize) {
|
|
82
|
+
throw FormatException("PDF:Decoder:verifyCodewordCount: bad codeword number descriptor!");
|
|
83
|
+
}
|
|
84
|
+
if (numberOfCodewords == 0) {
|
|
85
|
+
// Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords)
|
|
86
|
+
if (numECCodewords < cwsize) {
|
|
87
|
+
codewords[0] = cwsize - numECCodewords;
|
|
88
|
+
} else {
|
|
89
|
+
throw FormatException("PDF:Decoder:verifyCodewordCount: bad error correction cw number!");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Correct errors whenever it is possible using Reed-Solomom algorithm
|
|
96
|
+
*
|
|
97
|
+
* @param codewords, erasures, numECCodewords
|
|
98
|
+
* @return 0.
|
|
99
|
+
* @throws FormatException
|
|
100
|
+
*/
|
|
101
|
+
void Decoder::correctErrors(ArrayRef<int> codewords,
|
|
102
|
+
ArrayRef<int> erasures, int numECCodewords) {
|
|
103
|
+
if (erasures->size() > numECCodewords / 2 + MAX_ERRORS ||
|
|
104
|
+
numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) {
|
|
105
|
+
throw FormatException("PDF:Decoder:correctErrors: Too many errors or EC Codewords corrupted");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
Ref<ErrorCorrection> errorCorrection(new ErrorCorrection);
|
|
109
|
+
errorCorrection->decode(codewords, numECCodewords, erasures);
|
|
110
|
+
|
|
111
|
+
// 2012-06-27 HFN if, despite of error correction, there are still codewords with invalid
|
|
112
|
+
// value, throw an exception here:
|
|
113
|
+
for (int i = 0; i < codewords->size(); i++) {
|
|
114
|
+
if (codewords[i]<0) {
|
|
115
|
+
throw FormatException("PDF:Decoder:correctErrors: Error correction did not succeed!");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#ifndef __DECOCER_PDF_H__
|
|
2
|
+
#define __DECOCER_PDF_H__
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Decoder.h
|
|
6
|
+
* zxing
|
|
7
|
+
*
|
|
8
|
+
* Created by Hartmut Neubauer, 2012-05-25
|
|
9
|
+
* Copyright 2010,2012 ZXing authors All rights reserved.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
* you may not use this file except in compliance with the License.
|
|
13
|
+
* You may obtain a copy of the License at
|
|
14
|
+
*
|
|
15
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
*
|
|
17
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
* See the License for the specific language governing permissions and
|
|
21
|
+
* limitations under the License.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
#include <zxing/pdf417/decoder/ec/ErrorCorrection.h>
|
|
25
|
+
#include <zxing/pdf417/decoder/ec/ModulusGF.h>
|
|
26
|
+
#include <zxing/common/Counted.h>
|
|
27
|
+
#include <zxing/common/Array.h>
|
|
28
|
+
#include <zxing/common/DecoderResult.h>
|
|
29
|
+
#include <zxing/common/BitMatrix.h>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
namespace zxing {
|
|
33
|
+
namespace pdf417 {
|
|
34
|
+
namespace decoder {
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* <p>The main class which implements PDF417 Code decoding -- as
|
|
38
|
+
* opposed to locating and extracting the PDF417 Code from an image.</p>
|
|
39
|
+
*
|
|
40
|
+
* <p> 2012-06-27 HFN Reed-Solomon error correction activated, see class PDF417RSDecoder. </p>
|
|
41
|
+
* <p> 2012-09-19 HFN Reed-Solomon error correction via ErrorCorrection/ModulusGF/ModulusPoly. </p>
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
class Decoder {
|
|
45
|
+
private:
|
|
46
|
+
static const int MAX_ERRORS;
|
|
47
|
+
static const int MAX_EC_CODEWORDS;
|
|
48
|
+
|
|
49
|
+
void correctErrors(ArrayRef<int> codewords,
|
|
50
|
+
ArrayRef<int> erasures, int numECCodewords);
|
|
51
|
+
static void verifyCodewordCount(ArrayRef<int> codewords, int numECCodewords);
|
|
52
|
+
|
|
53
|
+
public:
|
|
54
|
+
|
|
55
|
+
Ref<DecoderResult> decode(Ref<BitMatrix> bits, DecodeHints const &hints);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#endif // __DECOCER_PDF_H__
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2012 ZXing authors
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
* 2012-09-19 HFN translation from Java into C++
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include <zxing/pdf417/decoder/ec/ErrorCorrection.h>
|
|
21
|
+
#include <zxing/pdf417/decoder/ec/ModulusPoly.h>
|
|
22
|
+
#include <zxing/pdf417/decoder/ec/ModulusGF.h>
|
|
23
|
+
|
|
24
|
+
using std::vector;
|
|
25
|
+
using zxing::Ref;
|
|
26
|
+
using zxing::ArrayRef;
|
|
27
|
+
using zxing::pdf417::decoder::ec::ErrorCorrection;
|
|
28
|
+
using zxing::pdf417::decoder::ec::ModulusPoly;
|
|
29
|
+
using zxing::pdf417::decoder::ec::ModulusGF;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* <p>PDF417 error correction implementation.</p>
|
|
33
|
+
*
|
|
34
|
+
* <p>This <a href="http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction#Example">example</a>
|
|
35
|
+
* is quite useful in understanding the algorithm.</p>
|
|
36
|
+
*
|
|
37
|
+
* @author Sean Owen
|
|
38
|
+
* @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
ErrorCorrection::ErrorCorrection()
|
|
43
|
+
: field_(ModulusGF::PDF417_GF)
|
|
44
|
+
{
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
void ErrorCorrection::decode(ArrayRef<int> received,
|
|
48
|
+
int numECCodewords,
|
|
49
|
+
ArrayRef<int> erasures)
|
|
50
|
+
{
|
|
51
|
+
Ref<ModulusPoly> poly (new ModulusPoly(field_, received));
|
|
52
|
+
ArrayRef<int> S( new Array<int>(numECCodewords));
|
|
53
|
+
bool error = false;
|
|
54
|
+
for (int i = numECCodewords; i > 0; i--) {
|
|
55
|
+
int eval = poly->evaluateAt(field_.exp(i));
|
|
56
|
+
S[numECCodewords - i] = eval;
|
|
57
|
+
if (eval != 0) {
|
|
58
|
+
error = true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (error) {
|
|
63
|
+
|
|
64
|
+
Ref<ModulusPoly> knownErrors = field_.getOne();
|
|
65
|
+
for (int i=0;i<erasures->size();i++) {
|
|
66
|
+
int b = field_.exp(received->size() - 1 - erasures[i]);
|
|
67
|
+
// Add (1 - bx) term:
|
|
68
|
+
ArrayRef<int> one_minus_b_x(new Array<int>(2));
|
|
69
|
+
one_minus_b_x[1]=field_.subtract(0,b);
|
|
70
|
+
one_minus_b_x[0]=1;
|
|
71
|
+
Ref<ModulusPoly> term (new ModulusPoly(field_,one_minus_b_x));
|
|
72
|
+
knownErrors = knownErrors->multiply(term);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
Ref<ModulusPoly> syndrome (new ModulusPoly(field_, S));
|
|
76
|
+
//syndrome = syndrome.multiply(knownErrors);
|
|
77
|
+
|
|
78
|
+
vector<Ref<ModulusPoly> > sigmaOmega (
|
|
79
|
+
runEuclideanAlgorithm(field_.buildMonomial(numECCodewords, 1), syndrome, numECCodewords));
|
|
80
|
+
Ref<ModulusPoly> sigma = sigmaOmega[0];
|
|
81
|
+
Ref<ModulusPoly> omega = sigmaOmega[1];
|
|
82
|
+
|
|
83
|
+
//sigma = sigma.multiply(knownErrors);
|
|
84
|
+
|
|
85
|
+
ArrayRef<int> errorLocations = findErrorLocations(sigma);
|
|
86
|
+
ArrayRef<int> errorMagnitudes = findErrorMagnitudes(omega, sigma, errorLocations);
|
|
87
|
+
|
|
88
|
+
for (int i = 0; i < errorLocations->size(); i++) {
|
|
89
|
+
int position = received->size() - 1 - field_.log(errorLocations[i]);
|
|
90
|
+
if (position < 0) {
|
|
91
|
+
throw ReedSolomonException("Bad error location!");
|
|
92
|
+
}
|
|
93
|
+
received[position] = field_.subtract(received[position], errorMagnitudes[i]);
|
|
94
|
+
#if (defined (DEBUG) && defined _WIN32)
|
|
95
|
+
{
|
|
96
|
+
WCHAR szmsg[256];
|
|
97
|
+
swprintf(szmsg,L"ErrorCorrection::decode: fix @ %d, new value = %d\n",
|
|
98
|
+
position, received[position]);
|
|
99
|
+
OutputDebugString(szmsg);
|
|
100
|
+
}
|
|
101
|
+
#endif
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
vector<Ref<ModulusPoly> > ErrorCorrection::runEuclideanAlgorithm(Ref<ModulusPoly> a, Ref<ModulusPoly> b, int R)
|
|
107
|
+
{
|
|
108
|
+
// Assume a's degree is >= b's
|
|
109
|
+
if (a->getDegree() < b->getDegree()) {
|
|
110
|
+
Ref<ModulusPoly> temp = a;
|
|
111
|
+
a = b;
|
|
112
|
+
b = temp;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
Ref<ModulusPoly> rLast ( a);
|
|
116
|
+
Ref<ModulusPoly> r ( b);
|
|
117
|
+
Ref<ModulusPoly> tLast ( field_.getZero());
|
|
118
|
+
Ref<ModulusPoly> t ( field_.getOne());
|
|
119
|
+
|
|
120
|
+
// Run Euclidean algorithm until r's degree is less than R/2
|
|
121
|
+
while (r->getDegree() >= R / 2) {
|
|
122
|
+
Ref<ModulusPoly> rLastLast (rLast);
|
|
123
|
+
Ref<ModulusPoly> tLastLast (tLast);
|
|
124
|
+
rLast = r;
|
|
125
|
+
tLast = t;
|
|
126
|
+
|
|
127
|
+
// Divide rLastLast by rLast, with quotient in q and remainder in r
|
|
128
|
+
if (rLast->isZero()) {
|
|
129
|
+
// Oops, Euclidean algorithm already terminated?
|
|
130
|
+
throw ReedSolomonException("Euclidean algorithm already terminated?");
|
|
131
|
+
}
|
|
132
|
+
r = rLastLast;
|
|
133
|
+
Ref<ModulusPoly> q (field_.getZero());
|
|
134
|
+
int denominatorLeadingTerm = rLast->getCoefficient(rLast->getDegree());
|
|
135
|
+
int dltInverse = field_.inverse(denominatorLeadingTerm);
|
|
136
|
+
while (r->getDegree() >= rLast->getDegree() && !r->isZero()) {
|
|
137
|
+
int degreeDiff = r->getDegree() - rLast->getDegree();
|
|
138
|
+
int scale = field_.multiply(r->getCoefficient(r->getDegree()), dltInverse);
|
|
139
|
+
q = q->add(field_.buildMonomial(degreeDiff, scale));
|
|
140
|
+
r = r->subtract(rLast->multiplyByMonomial(degreeDiff, scale));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
t = q->multiply(tLast)->subtract(tLastLast)->negative();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
int sigmaTildeAtZero = t->getCoefficient(0);
|
|
147
|
+
if (sigmaTildeAtZero == 0) {
|
|
148
|
+
throw ReedSolomonException("sigmaTilde = 0!");
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
int inverse = field_.inverse(sigmaTildeAtZero);
|
|
152
|
+
Ref<ModulusPoly> sigma (t->multiply(inverse));
|
|
153
|
+
Ref<ModulusPoly> omega (r->multiply(inverse));
|
|
154
|
+
vector<Ref<ModulusPoly> > v(2);
|
|
155
|
+
v[0] = sigma;
|
|
156
|
+
v[1] = omega;
|
|
157
|
+
return v;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
ArrayRef<int> ErrorCorrection::findErrorLocations(Ref<ModulusPoly> errorLocator) {
|
|
161
|
+
// This is a direct application of Chien's search
|
|
162
|
+
int numErrors = errorLocator->getDegree();
|
|
163
|
+
ArrayRef<int> result( new Array<int>(numErrors));
|
|
164
|
+
int e = 0;
|
|
165
|
+
for (int i = 1; i < field_.getSize() && e < numErrors; i++) {
|
|
166
|
+
if (errorLocator->evaluateAt(i) == 0) {
|
|
167
|
+
result[e] = field_.inverse(i);
|
|
168
|
+
e++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (e != numErrors) {
|
|
172
|
+
#if (defined (DEBUG) && defined _WIN32)
|
|
173
|
+
char sz[128];
|
|
174
|
+
sprintf(sz,"Error number inconsistency, %d/%d!",e,numErrors);
|
|
175
|
+
throw ReedSolomonException(sz);
|
|
176
|
+
#else
|
|
177
|
+
throw ReedSolomonException("Error number inconsistency!");
|
|
178
|
+
#endif
|
|
179
|
+
}
|
|
180
|
+
#if (defined (DEBUG) && defined _WIN32)
|
|
181
|
+
{
|
|
182
|
+
WCHAR szmsg[256];
|
|
183
|
+
swprintf(szmsg,L"ErrorCorrection::findErrorLocations: found %d errors.\n",
|
|
184
|
+
e);
|
|
185
|
+
OutputDebugString(szmsg);
|
|
186
|
+
}
|
|
187
|
+
#endif
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
ArrayRef<int> ErrorCorrection::findErrorMagnitudes(Ref<ModulusPoly> errorEvaluator,
|
|
192
|
+
Ref<ModulusPoly> errorLocator,
|
|
193
|
+
ArrayRef<int> errorLocations) {
|
|
194
|
+
int i;
|
|
195
|
+
int errorLocatorDegree = errorLocator->getDegree();
|
|
196
|
+
ArrayRef<int> formalDerivativeCoefficients (new Array<int>(errorLocatorDegree));
|
|
197
|
+
for (i = 1; i <= errorLocatorDegree; i++) {
|
|
198
|
+
formalDerivativeCoefficients[errorLocatorDegree - i] =
|
|
199
|
+
field_.multiply(i, errorLocator->getCoefficient(i));
|
|
200
|
+
}
|
|
201
|
+
Ref<ModulusPoly> formalDerivative (new ModulusPoly(field_, formalDerivativeCoefficients));
|
|
202
|
+
|
|
203
|
+
// This is directly applying Forney's Formula
|
|
204
|
+
int s = errorLocations->size();
|
|
205
|
+
ArrayRef<int> result ( new Array<int>(s));
|
|
206
|
+
for (i = 0; i < s; i++) {
|
|
207
|
+
int xiInverse = field_.inverse(errorLocations[i]);
|
|
208
|
+
int numerator = field_.subtract(0, errorEvaluator->evaluateAt(xiInverse));
|
|
209
|
+
int denominator = field_.inverse(formalDerivative->evaluateAt(xiInverse));
|
|
210
|
+
result[i] = field_.multiply(numerator, denominator);
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
|