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,81 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __ONED_READER_H__
|
|
3
|
+
#define __ONED_READER_H__
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* OneDReader.h
|
|
7
|
+
* ZXing
|
|
8
|
+
*
|
|
9
|
+
* Copyright 2010 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/Reader.h>
|
|
25
|
+
|
|
26
|
+
namespace zxing {
|
|
27
|
+
namespace oned {
|
|
28
|
+
|
|
29
|
+
class OneDReader : public Reader {
|
|
30
|
+
private:
|
|
31
|
+
Ref<Result> doDecode(Ref<BinaryBitmap> image, DecodeHints hints);
|
|
32
|
+
|
|
33
|
+
protected:
|
|
34
|
+
static const int INTEGER_MATH_SHIFT = 8;
|
|
35
|
+
|
|
36
|
+
struct Range {
|
|
37
|
+
private:
|
|
38
|
+
int data[2];
|
|
39
|
+
public:
|
|
40
|
+
Range() {}
|
|
41
|
+
Range(int zero, int one) {
|
|
42
|
+
data[0] = zero;
|
|
43
|
+
data[1] = one;
|
|
44
|
+
}
|
|
45
|
+
int& operator [] (int index) {
|
|
46
|
+
return data[index];
|
|
47
|
+
}
|
|
48
|
+
int const& operator [] (int index) const {
|
|
49
|
+
return data[index];
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
static int patternMatchVariance(std::vector<int>& counters,
|
|
54
|
+
std::vector<int> const& pattern,
|
|
55
|
+
int maxIndividualVariance);
|
|
56
|
+
static int patternMatchVariance(std::vector<int>& counters,
|
|
57
|
+
int const pattern[],
|
|
58
|
+
int maxIndividualVariance);
|
|
59
|
+
|
|
60
|
+
protected:
|
|
61
|
+
static const int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT;
|
|
62
|
+
|
|
63
|
+
public:
|
|
64
|
+
|
|
65
|
+
OneDReader();
|
|
66
|
+
virtual Ref<Result> decode(Ref<BinaryBitmap> image, DecodeHints hints);
|
|
67
|
+
|
|
68
|
+
// Implementations must not throw any exceptions. If a barcode is not found on this row,
|
|
69
|
+
// a empty ref should be returned e.g. return Ref<Result>();
|
|
70
|
+
virtual Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row) = 0;
|
|
71
|
+
|
|
72
|
+
static void recordPattern(Ref<BitArray> row,
|
|
73
|
+
int start,
|
|
74
|
+
std::vector<int>& counters);
|
|
75
|
+
virtual ~OneDReader();
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#endif
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OneDResultPoint.cpp
|
|
3
|
+
* ZXing
|
|
4
|
+
*
|
|
5
|
+
* Copyright 2010 ZXing authors All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include "OneDResultPoint.h"
|
|
21
|
+
|
|
22
|
+
namespace zxing {
|
|
23
|
+
namespace oned {
|
|
24
|
+
|
|
25
|
+
OneDResultPoint::OneDResultPoint(float posX, float posY) : ResultPoint(posX,posY) {
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#ifndef __ONED_RESULT_POINT_H__
|
|
2
|
+
#define __ONED_RESULT_POINT_H__
|
|
3
|
+
/*
|
|
4
|
+
* OneDResultPoint.h
|
|
5
|
+
* ZXing
|
|
6
|
+
*
|
|
7
|
+
* Copyright 2010 ZXing authors All rights reserved.
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
#include <zxing/ResultPoint.h>
|
|
22
|
+
#include <cmath>
|
|
23
|
+
|
|
24
|
+
namespace zxing {
|
|
25
|
+
namespace oned {
|
|
26
|
+
|
|
27
|
+
class OneDResultPoint : public ResultPoint {
|
|
28
|
+
|
|
29
|
+
public:
|
|
30
|
+
OneDResultPoint(float posX, float posY);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#endif
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* UPCAReader.cpp
|
|
4
|
+
* ZXing
|
|
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 "UPCAReader.h"
|
|
22
|
+
#include <zxing/ReaderException.h>
|
|
23
|
+
|
|
24
|
+
using zxing::oned::UPCAReader;
|
|
25
|
+
using zxing::Ref;
|
|
26
|
+
using zxing::Result;
|
|
27
|
+
|
|
28
|
+
// VC++
|
|
29
|
+
using zxing::BitArray;
|
|
30
|
+
using zxing::BinaryBitmap;
|
|
31
|
+
using zxing::DecodeHints;
|
|
32
|
+
|
|
33
|
+
UPCAReader::UPCAReader() : ean13Reader() {}
|
|
34
|
+
|
|
35
|
+
Ref<Result> UPCAReader::decodeRow(int rowNumber, Ref<BitArray> row) {
|
|
36
|
+
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Ref<Result> UPCAReader::decodeRow(int rowNumber,
|
|
40
|
+
Ref<BitArray> row,
|
|
41
|
+
Range const& startGuardRange) {
|
|
42
|
+
return maybeReturnResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Ref<Result> UPCAReader::decode(Ref<BinaryBitmap> image, DecodeHints hints) {
|
|
46
|
+
return maybeReturnResult(ean13Reader.decode(image, hints));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
int UPCAReader::decodeMiddle(Ref<BitArray> row,
|
|
50
|
+
Range const& startRange,
|
|
51
|
+
std::string& resultString) {
|
|
52
|
+
return ean13Reader.decodeMiddle(row, startRange, resultString);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
Ref<Result> UPCAReader::maybeReturnResult(Ref<Result> result) {
|
|
56
|
+
if (result.empty()) {
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
const std::string& text = (result->getText())->getText();
|
|
60
|
+
if (text[0] == '0') {
|
|
61
|
+
Ref<String> resultString(new String(text.substr(1)));
|
|
62
|
+
Ref<Result> res(new Result(resultString, result->getRawBytes(), result->getResultPoints(),
|
|
63
|
+
BarcodeFormat::UPC_A));
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
return Ref<Result>();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
zxing::BarcodeFormat UPCAReader::getBarcodeFormat(){
|
|
70
|
+
return BarcodeFormat::UPC_A;
|
|
71
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __UPCA_READER_H__
|
|
3
|
+
#define __UPCA_READER_H__
|
|
4
|
+
/*
|
|
5
|
+
* UPCAReader.h
|
|
6
|
+
* ZXing
|
|
7
|
+
*
|
|
8
|
+
* Copyright 2010 ZXing authors All rights reserved.
|
|
9
|
+
*
|
|
10
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
11
|
+
* you may not use this file except in compliance with the License.
|
|
12
|
+
* You may obtain a copy of the License at
|
|
13
|
+
*
|
|
14
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
15
|
+
*
|
|
16
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
17
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
18
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
19
|
+
* See the License for the specific language governing permissions and
|
|
20
|
+
* limitations under the License.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
#include <zxing/oned/EAN13Reader.h>
|
|
24
|
+
#include <zxing/DecodeHints.h>
|
|
25
|
+
|
|
26
|
+
namespace zxing {
|
|
27
|
+
namespace oned {
|
|
28
|
+
|
|
29
|
+
class UPCAReader : public UPCEANReader {
|
|
30
|
+
|
|
31
|
+
private:
|
|
32
|
+
EAN13Reader ean13Reader;
|
|
33
|
+
static Ref<Result> maybeReturnResult(Ref<Result> result);
|
|
34
|
+
|
|
35
|
+
public:
|
|
36
|
+
UPCAReader();
|
|
37
|
+
|
|
38
|
+
int decodeMiddle(Ref<BitArray> row, Range const& startRange, std::string& resultString);
|
|
39
|
+
|
|
40
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
|
41
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row, Range const& startGuardRange);
|
|
42
|
+
Ref<Result> decode(Ref<BinaryBitmap> image, DecodeHints hints);
|
|
43
|
+
|
|
44
|
+
BarcodeFormat getBarcodeFormat();
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#endif
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* UPCEANReader.cpp
|
|
4
|
+
* ZXing
|
|
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 <zxing/ZXing.h>
|
|
22
|
+
#include <zxing/oned/UPCEANReader.h>
|
|
23
|
+
#include <zxing/oned/OneDResultPoint.h>
|
|
24
|
+
#include <zxing/ReaderException.h>
|
|
25
|
+
#include <zxing/NotFoundException.h>
|
|
26
|
+
#include <zxing/FormatException.h>
|
|
27
|
+
#include <zxing/ChecksumException.h>
|
|
28
|
+
|
|
29
|
+
using std::vector;
|
|
30
|
+
using std::string;
|
|
31
|
+
|
|
32
|
+
using zxing::Ref;
|
|
33
|
+
using zxing::Result;
|
|
34
|
+
using zxing::NotFoundException;
|
|
35
|
+
using zxing::FormatException;
|
|
36
|
+
using zxing::ChecksumException;
|
|
37
|
+
using zxing::oned::UPCEANReader;
|
|
38
|
+
|
|
39
|
+
// VC++
|
|
40
|
+
using zxing::BitArray;
|
|
41
|
+
using zxing::String;
|
|
42
|
+
|
|
43
|
+
#define LEN(v) ((int)(sizeof(v)/sizeof(v[0])))
|
|
44
|
+
|
|
45
|
+
namespace {
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Start/end guard pattern.
|
|
49
|
+
*/
|
|
50
|
+
const int START_END_PATTERN_[] = {1, 1, 1};
|
|
51
|
+
const int START_END_PATTERN_LEN = LEN(START_END_PATTERN_);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Pattern marking the middle of a UPC/EAN pattern, separating the two halves.
|
|
55
|
+
*/
|
|
56
|
+
const int MIDDLE_PATTERN_[] = {1, 1, 1, 1, 1};
|
|
57
|
+
const int MIDDLE_PATTERN_LEN = LEN(MIDDLE_PATTERN_);
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* "Odd", or "L" patterns used to encode UPC/EAN digits.
|
|
61
|
+
*/
|
|
62
|
+
const int L_PATTERNS_[][4] = {
|
|
63
|
+
{3, 2, 1, 1}, // 0
|
|
64
|
+
{2, 2, 2, 1}, // 1
|
|
65
|
+
{2, 1, 2, 2}, // 2
|
|
66
|
+
{1, 4, 1, 1}, // 3
|
|
67
|
+
{1, 1, 3, 2}, // 4
|
|
68
|
+
{1, 2, 3, 1}, // 5
|
|
69
|
+
{1, 1, 1, 4}, // 6
|
|
70
|
+
{1, 3, 1, 2}, // 7
|
|
71
|
+
{1, 2, 1, 3}, // 8
|
|
72
|
+
{3, 1, 1, 2} // 9
|
|
73
|
+
};
|
|
74
|
+
const int L_PATTERNS_LEN = LEN(L_PATTERNS_);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* As above but also including the "even", or "G" patterns used to encode UPC/EAN digits.
|
|
78
|
+
*/
|
|
79
|
+
const int L_AND_G_PATTERNS_[][4] = {
|
|
80
|
+
{3, 2, 1, 1}, // 0
|
|
81
|
+
{2, 2, 2, 1}, // 1
|
|
82
|
+
{2, 1, 2, 2}, // 2
|
|
83
|
+
{1, 4, 1, 1}, // 3
|
|
84
|
+
{1, 1, 3, 2}, // 4
|
|
85
|
+
{1, 2, 3, 1}, // 5
|
|
86
|
+
{1, 1, 1, 4}, // 6
|
|
87
|
+
{1, 3, 1, 2}, // 7
|
|
88
|
+
{1, 2, 1, 3}, // 8
|
|
89
|
+
{3, 1, 1, 2}, // 9
|
|
90
|
+
{1, 1, 2, 3}, // 10 reversed 0
|
|
91
|
+
{1, 2, 2, 2}, // 11 reversed 1
|
|
92
|
+
{2, 2, 1, 2}, // 12 reversed 2
|
|
93
|
+
{1, 1, 4, 1}, // 13 reversed 3
|
|
94
|
+
{2, 3, 1, 1}, // 14 reversed 4
|
|
95
|
+
{1, 3, 2, 1}, // 15 reversed 5
|
|
96
|
+
{4, 1, 1, 1}, // 16 reversed 6
|
|
97
|
+
{2, 1, 3, 1}, // 17 reversed 7
|
|
98
|
+
{3, 1, 2, 1}, // 18 reversed 8
|
|
99
|
+
{2, 1, 1, 3} // 19 reversed 9
|
|
100
|
+
};
|
|
101
|
+
const int L_AND_G_PATTERNS_LEN = LEN(L_AND_G_PATTERNS_);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const int UPCEANReader::MAX_AVG_VARIANCE = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.48f);
|
|
105
|
+
const int UPCEANReader::MAX_INDIVIDUAL_VARIANCE = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.7f);
|
|
106
|
+
|
|
107
|
+
#define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0])
|
|
108
|
+
|
|
109
|
+
const vector<int>
|
|
110
|
+
UPCEANReader::START_END_PATTERN (VECTOR_INIT(START_END_PATTERN_));
|
|
111
|
+
|
|
112
|
+
const vector<int>
|
|
113
|
+
UPCEANReader::MIDDLE_PATTERN (VECTOR_INIT(MIDDLE_PATTERN_));
|
|
114
|
+
const vector<int const*>
|
|
115
|
+
UPCEANReader::L_PATTERNS (VECTOR_INIT(L_PATTERNS_));
|
|
116
|
+
const vector<int const*>
|
|
117
|
+
UPCEANReader::L_AND_G_PATTERNS (VECTOR_INIT(L_AND_G_PATTERNS_));
|
|
118
|
+
|
|
119
|
+
UPCEANReader::UPCEANReader() {}
|
|
120
|
+
|
|
121
|
+
Ref<Result> UPCEANReader::decodeRow(int rowNumber, Ref<BitArray> row) {
|
|
122
|
+
return decodeRow(rowNumber, row, findStartGuardPattern(row));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Ref<Result> UPCEANReader::decodeRow(int rowNumber,
|
|
126
|
+
Ref<BitArray> row,
|
|
127
|
+
Range const& startGuardRange) {
|
|
128
|
+
string& result = decodeRowStringBuffer;
|
|
129
|
+
result.clear();
|
|
130
|
+
int endStart = decodeMiddle(row, startGuardRange, result);
|
|
131
|
+
|
|
132
|
+
Range endRange = decodeEnd(row, endStart);
|
|
133
|
+
|
|
134
|
+
// Make sure there is a quiet zone at least as big as the end pattern after the barcode.
|
|
135
|
+
// The spec might want more whitespace, but in practice this is the maximum we can count on.
|
|
136
|
+
|
|
137
|
+
int end = endRange[1];
|
|
138
|
+
int quietEnd = end + (end - endRange[0]);
|
|
139
|
+
if (quietEnd >= row->getSize() || !row->isRange(end, quietEnd, false)) {
|
|
140
|
+
throw NotFoundException();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// UPC/EAN should never be less than 8 chars anyway
|
|
144
|
+
if (result.length() < 8) {
|
|
145
|
+
throw FormatException();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Ref<String> resultString (new String(result));
|
|
149
|
+
if (!checkChecksum(resultString)) {
|
|
150
|
+
throw ChecksumException();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f;
|
|
154
|
+
float right = (float) (endRange[1] + endRange[0]) / 2.0f;
|
|
155
|
+
BarcodeFormat format = getBarcodeFormat();
|
|
156
|
+
ArrayRef< Ref<ResultPoint> > resultPoints(2);
|
|
157
|
+
resultPoints[0] = Ref<ResultPoint>(new OneDResultPoint(left, (float) rowNumber));
|
|
158
|
+
resultPoints[1] = Ref<ResultPoint>(new OneDResultPoint(right, (float) rowNumber));
|
|
159
|
+
Ref<Result> decodeResult (new Result(resultString, ArrayRef<char>(), resultPoints, format));
|
|
160
|
+
// Java extension and man stuff
|
|
161
|
+
return decodeResult;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
UPCEANReader::Range UPCEANReader::findStartGuardPattern(Ref<BitArray> row) {
|
|
165
|
+
bool foundStart = false;
|
|
166
|
+
Range startRange;
|
|
167
|
+
int nextStart = 0;
|
|
168
|
+
vector<int> counters(START_END_PATTERN.size(), 0);
|
|
169
|
+
// std::cerr << "fsgp " << *row << std::endl;
|
|
170
|
+
while (!foundStart) {
|
|
171
|
+
for(int i=0; i < (int)START_END_PATTERN.size(); ++i) {
|
|
172
|
+
counters[i] = 0;
|
|
173
|
+
}
|
|
174
|
+
startRange = findGuardPattern(row, nextStart, false, START_END_PATTERN, counters);
|
|
175
|
+
// std::cerr << "sr " << startRange[0] << " " << startRange[1] << std::endl;
|
|
176
|
+
int start = startRange[0];
|
|
177
|
+
nextStart = startRange[1];
|
|
178
|
+
// Make sure there is a quiet zone at least as big as the start pattern before the barcode.
|
|
179
|
+
// If this check would run off the left edge of the image, do not accept this barcode,
|
|
180
|
+
// as it is very likely to be a false positive.
|
|
181
|
+
int quietStart = start - (nextStart - start);
|
|
182
|
+
if (quietStart >= 0) {
|
|
183
|
+
foundStart = row->isRange(quietStart, start, false);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return startRange;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
UPCEANReader::Range UPCEANReader::findGuardPattern(Ref<BitArray> row,
|
|
190
|
+
int rowOffset,
|
|
191
|
+
bool whiteFirst,
|
|
192
|
+
vector<int> const& pattern) {
|
|
193
|
+
vector<int> counters (pattern.size(), 0);
|
|
194
|
+
return findGuardPattern(row, rowOffset, whiteFirst, pattern, counters);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
UPCEANReader::Range UPCEANReader::findGuardPattern(Ref<BitArray> row,
|
|
198
|
+
int rowOffset,
|
|
199
|
+
bool whiteFirst,
|
|
200
|
+
vector<int> const& pattern,
|
|
201
|
+
vector<int>& counters) {
|
|
202
|
+
// cerr << "fGP " << rowOffset << " " << whiteFirst << endl;
|
|
203
|
+
if (false) {
|
|
204
|
+
for(int i=0; i < (int)pattern.size(); ++i) {
|
|
205
|
+
std::cerr << pattern[i];
|
|
206
|
+
}
|
|
207
|
+
std::cerr << std::endl;
|
|
208
|
+
}
|
|
209
|
+
int patternLength = pattern.size();
|
|
210
|
+
int width = row->getSize();
|
|
211
|
+
bool isWhite = whiteFirst;
|
|
212
|
+
rowOffset = whiteFirst ? row->getNextUnset(rowOffset) : row->getNextSet(rowOffset);
|
|
213
|
+
int counterPosition = 0;
|
|
214
|
+
int patternStart = rowOffset;
|
|
215
|
+
for (int x = rowOffset; x < width; x++) {
|
|
216
|
+
// std::cerr << "rg " << x << " " << row->get(x) << std::endl;
|
|
217
|
+
if (row->get(x) ^ isWhite) {
|
|
218
|
+
counters[counterPosition]++;
|
|
219
|
+
} else {
|
|
220
|
+
if (counterPosition == patternLength - 1) {
|
|
221
|
+
if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
|
|
222
|
+
return Range(patternStart, x);
|
|
223
|
+
}
|
|
224
|
+
patternStart += counters[0] + counters[1];
|
|
225
|
+
for (int y = 2; y < patternLength; y++) {
|
|
226
|
+
counters[y - 2] = counters[y];
|
|
227
|
+
}
|
|
228
|
+
counters[patternLength - 2] = 0;
|
|
229
|
+
counters[patternLength - 1] = 0;
|
|
230
|
+
counterPosition--;
|
|
231
|
+
} else {
|
|
232
|
+
counterPosition++;
|
|
233
|
+
}
|
|
234
|
+
counters[counterPosition] = 1;
|
|
235
|
+
isWhite = !isWhite;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
throw NotFoundException();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
UPCEANReader::Range UPCEANReader::decodeEnd(Ref<BitArray> row, int endStart) {
|
|
242
|
+
return findGuardPattern(row, endStart, false, START_END_PATTERN);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
int UPCEANReader::decodeDigit(Ref<BitArray> row,
|
|
246
|
+
vector<int> & counters,
|
|
247
|
+
int rowOffset,
|
|
248
|
+
vector<int const*> const& patterns) {
|
|
249
|
+
recordPattern(row, rowOffset, counters);
|
|
250
|
+
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
|
251
|
+
int bestMatch = -1;
|
|
252
|
+
int max = patterns.size();
|
|
253
|
+
for (int i = 0; i < max; i++) {
|
|
254
|
+
int const* pattern (patterns[i]);
|
|
255
|
+
int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE);
|
|
256
|
+
if (variance < bestVariance) {
|
|
257
|
+
bestVariance = variance;
|
|
258
|
+
bestMatch = i;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (bestMatch >= 0) {
|
|
262
|
+
return bestMatch;
|
|
263
|
+
} else {
|
|
264
|
+
throw NotFoundException();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* @return {@link #checkStandardUPCEANChecksum(String)}
|
|
270
|
+
*/
|
|
271
|
+
bool UPCEANReader::checkChecksum(Ref<String> const& s) {
|
|
272
|
+
return checkStandardUPCEANChecksum(s);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Computes the UPC/EAN checksum on a string of digits, and reports
|
|
277
|
+
* whether the checksum is correct or not.
|
|
278
|
+
*
|
|
279
|
+
* @param s string of digits to check
|
|
280
|
+
* @return true iff string of digits passes the UPC/EAN checksum algorithm
|
|
281
|
+
*/
|
|
282
|
+
bool UPCEANReader::checkStandardUPCEANChecksum(Ref<String> const& s_) {
|
|
283
|
+
std::string const& s (s_->getText());
|
|
284
|
+
int length = s.length();
|
|
285
|
+
if (length == 0) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
int sum = 0;
|
|
290
|
+
for (int i = length - 2; i >= 0; i -= 2) {
|
|
291
|
+
int digit = (int) s[i] - (int) '0';
|
|
292
|
+
if (digit < 0 || digit > 9) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
sum += digit;
|
|
296
|
+
}
|
|
297
|
+
sum *= 3;
|
|
298
|
+
for (int i = length - 1; i >= 0; i -= 2) {
|
|
299
|
+
int digit = (int) s[i] - (int) '0';
|
|
300
|
+
if (digit < 0 || digit > 9) {
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
sum += digit;
|
|
304
|
+
}
|
|
305
|
+
return sum % 10 == 0;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
UPCEANReader::~UPCEANReader() {
|
|
309
|
+
}
|