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,54 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __ITF_READER_H__
|
|
3
|
+
#define __ITF_READER_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 <zxing/oned/OneDReader.h>
|
|
22
|
+
#include <zxing/common/BitArray.h>
|
|
23
|
+
#include <zxing/Result.h>
|
|
24
|
+
|
|
25
|
+
namespace zxing {
|
|
26
|
+
namespace oned {
|
|
27
|
+
|
|
28
|
+
class ITFReader : public OneDReader {
|
|
29
|
+
private:
|
|
30
|
+
enum {MAX_AVG_VARIANCE = (unsigned int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 420/1000)};
|
|
31
|
+
enum {MAX_INDIVIDUAL_VARIANCE = (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 780/1000)};
|
|
32
|
+
// Stores the actual narrow line width of the image being decoded.
|
|
33
|
+
int narrowLineWidth;
|
|
34
|
+
|
|
35
|
+
Range decodeStart(Ref<BitArray> row);
|
|
36
|
+
Range decodeEnd(Ref<BitArray> row);
|
|
37
|
+
static void decodeMiddle(Ref<BitArray> row, int payloadStart, int payloadEnd, std::string& resultString);
|
|
38
|
+
void validateQuietZone(Ref<BitArray> row, int startPattern);
|
|
39
|
+
static int skipWhiteSpace(Ref<BitArray> row);
|
|
40
|
+
|
|
41
|
+
static Range findGuardPattern(Ref<BitArray> row, int rowOffset, std::vector<int> const& pattern);
|
|
42
|
+
static int decodeDigit(std::vector<int>& counters);
|
|
43
|
+
|
|
44
|
+
void append(char* s, char c);
|
|
45
|
+
public:
|
|
46
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
|
47
|
+
ITFReader();
|
|
48
|
+
~ITFReader();
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#endif
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2010 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
|
+
|
|
18
|
+
#include <zxing/ZXing.h>
|
|
19
|
+
#include <zxing/oned/MultiFormatOneDReader.h>
|
|
20
|
+
#include <zxing/oned/MultiFormatUPCEANReader.h>
|
|
21
|
+
#include <zxing/oned/Code39Reader.h>
|
|
22
|
+
#include <zxing/oned/Code128Reader.h>
|
|
23
|
+
#include <zxing/oned/Code93Reader.h>
|
|
24
|
+
#include <zxing/oned/CodaBarReader.h>
|
|
25
|
+
#include <zxing/oned/ITFReader.h>
|
|
26
|
+
#include <zxing/ReaderException.h>
|
|
27
|
+
#include <zxing/NotFoundException.h>
|
|
28
|
+
|
|
29
|
+
using zxing::Ref;
|
|
30
|
+
using zxing::Result;
|
|
31
|
+
using zxing::oned::MultiFormatOneDReader;
|
|
32
|
+
|
|
33
|
+
// VC++
|
|
34
|
+
using zxing::DecodeHints;
|
|
35
|
+
using zxing::BitArray;
|
|
36
|
+
|
|
37
|
+
MultiFormatOneDReader::MultiFormatOneDReader(DecodeHints hints) : readers() {
|
|
38
|
+
if (hints.containsFormat(BarcodeFormat::EAN_13) ||
|
|
39
|
+
hints.containsFormat(BarcodeFormat::EAN_8) ||
|
|
40
|
+
hints.containsFormat(BarcodeFormat::UPC_A) ||
|
|
41
|
+
hints.containsFormat(BarcodeFormat::UPC_E)) {
|
|
42
|
+
readers.push_back(Ref<OneDReader>(new MultiFormatUPCEANReader(hints)));
|
|
43
|
+
}
|
|
44
|
+
if (hints.containsFormat(BarcodeFormat::CODE_39)) {
|
|
45
|
+
readers.push_back(Ref<OneDReader>(new Code39Reader()));
|
|
46
|
+
}
|
|
47
|
+
if (hints.containsFormat(BarcodeFormat::CODE_93)) {
|
|
48
|
+
readers.push_back(Ref<OneDReader>(new Code93Reader()));
|
|
49
|
+
}
|
|
50
|
+
if (hints.containsFormat(BarcodeFormat::CODE_128)) {
|
|
51
|
+
readers.push_back(Ref<OneDReader>(new Code128Reader()));
|
|
52
|
+
}
|
|
53
|
+
if (hints.containsFormat(BarcodeFormat::ITF)) {
|
|
54
|
+
readers.push_back(Ref<OneDReader>(new ITFReader()));
|
|
55
|
+
}
|
|
56
|
+
if (hints.containsFormat(BarcodeFormat::CODABAR)) {
|
|
57
|
+
readers.push_back(Ref<OneDReader>(new CodaBarReader()));
|
|
58
|
+
}
|
|
59
|
+
/*
|
|
60
|
+
if (hints.containsFormat(BarcodeFormat::RSS_14)) {
|
|
61
|
+
readers.push_back(Ref<OneDReader>(new RSS14Reader()));
|
|
62
|
+
}
|
|
63
|
+
*/
|
|
64
|
+
/*
|
|
65
|
+
if (hints.containsFormat(BarcodeFormat::RSS_EXPANDED)) {
|
|
66
|
+
readers.push_back(Ref<OneDReader>(new RSS14ExpandedReader()));
|
|
67
|
+
}
|
|
68
|
+
*/
|
|
69
|
+
if (readers.size() == 0) {
|
|
70
|
+
readers.push_back(Ref<OneDReader>(new MultiFormatUPCEANReader(hints)));
|
|
71
|
+
readers.push_back(Ref<OneDReader>(new Code39Reader()));
|
|
72
|
+
readers.push_back(Ref<OneDReader>(new CodaBarReader()));
|
|
73
|
+
readers.push_back(Ref<OneDReader>(new Code93Reader()));
|
|
74
|
+
readers.push_back(Ref<OneDReader>(new Code128Reader()));
|
|
75
|
+
readers.push_back(Ref<OneDReader>(new ITFReader()));
|
|
76
|
+
// readers.push_back(Ref<OneDReader>(new RSS14Reader()));
|
|
77
|
+
// readers.push_back(Ref<OneDReader>(new RSS14ExpandedReader()));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#include <typeinfo>
|
|
82
|
+
|
|
83
|
+
Ref<Result> MultiFormatOneDReader::decodeRow(int rowNumber, Ref<BitArray> row) {
|
|
84
|
+
int size = readers.size();
|
|
85
|
+
for (int i = 0; i < size; i++) {
|
|
86
|
+
OneDReader* reader = readers[i];
|
|
87
|
+
try {
|
|
88
|
+
Ref<Result> result = reader->decodeRow(rowNumber, row);
|
|
89
|
+
return result;
|
|
90
|
+
} catch (ReaderException const& re) {
|
|
91
|
+
(void)re;
|
|
92
|
+
// continue
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw NotFoundException();
|
|
96
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#ifndef __MULTI_FORMAT_ONED_READER_H__
|
|
2
|
+
#define __MULTI_FORMAT_ONED_READER_H__
|
|
3
|
+
/*
|
|
4
|
+
* MultiFormatOneDReader.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
|
+
|
|
22
|
+
#include <zxing/oned/OneDReader.h>
|
|
23
|
+
|
|
24
|
+
namespace zxing {
|
|
25
|
+
namespace oned {
|
|
26
|
+
class MultiFormatOneDReader : public OneDReader {
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
std::vector<Ref<OneDReader> > readers;
|
|
30
|
+
public:
|
|
31
|
+
MultiFormatOneDReader(DecodeHints hints);
|
|
32
|
+
|
|
33
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
#endif
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* MultiFormatUPCEANReader.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/MultiFormatUPCEANReader.h>
|
|
23
|
+
#include <zxing/oned/EAN13Reader.h>
|
|
24
|
+
#include <zxing/oned/EAN8Reader.h>
|
|
25
|
+
#include <zxing/oned/UPCEReader.h>
|
|
26
|
+
#include <zxing/oned/UPCAReader.h>
|
|
27
|
+
#include <zxing/oned/OneDResultPoint.h>
|
|
28
|
+
#include <zxing/common/Array.h>
|
|
29
|
+
#include <zxing/ReaderException.h>
|
|
30
|
+
#include <zxing/NotFoundException.h>
|
|
31
|
+
#include <math.h>
|
|
32
|
+
|
|
33
|
+
using zxing::NotFoundException;
|
|
34
|
+
using zxing::Ref;
|
|
35
|
+
using zxing::Result;
|
|
36
|
+
using zxing::oned::MultiFormatUPCEANReader;
|
|
37
|
+
|
|
38
|
+
// VC++
|
|
39
|
+
using zxing::DecodeHints;
|
|
40
|
+
using zxing::BitArray;
|
|
41
|
+
|
|
42
|
+
MultiFormatUPCEANReader::MultiFormatUPCEANReader(DecodeHints hints) : readers() {
|
|
43
|
+
if (hints.containsFormat(BarcodeFormat::EAN_13)) {
|
|
44
|
+
readers.push_back(Ref<UPCEANReader>(new EAN13Reader()));
|
|
45
|
+
} else if (hints.containsFormat(BarcodeFormat::UPC_A)) {
|
|
46
|
+
readers.push_back(Ref<UPCEANReader>(new UPCAReader()));
|
|
47
|
+
}
|
|
48
|
+
if (hints.containsFormat(BarcodeFormat::EAN_8)) {
|
|
49
|
+
readers.push_back(Ref<UPCEANReader>(new EAN8Reader()));
|
|
50
|
+
}
|
|
51
|
+
if (hints.containsFormat(BarcodeFormat::UPC_E)) {
|
|
52
|
+
readers.push_back(Ref<UPCEANReader>(new UPCEReader()));
|
|
53
|
+
}
|
|
54
|
+
if (readers.size() == 0) {
|
|
55
|
+
readers.push_back(Ref<UPCEANReader>(new EAN13Reader()));
|
|
56
|
+
// UPC-A is covered by EAN-13
|
|
57
|
+
readers.push_back(Ref<UPCEANReader>(new EAN8Reader()));
|
|
58
|
+
readers.push_back(Ref<UPCEANReader>(new UPCEReader()));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#include <typeinfo>
|
|
63
|
+
|
|
64
|
+
Ref<Result> MultiFormatUPCEANReader::decodeRow(int rowNumber, Ref<BitArray> row) {
|
|
65
|
+
// Compute this location once and reuse it on multiple implementations
|
|
66
|
+
UPCEANReader::Range startGuardPattern = UPCEANReader::findStartGuardPattern(row);
|
|
67
|
+
for (int i = 0, e = readers.size(); i < e; i++) {
|
|
68
|
+
Ref<UPCEANReader> reader = readers[i];
|
|
69
|
+
Ref<Result> result;
|
|
70
|
+
try {
|
|
71
|
+
result = reader->decodeRow(rowNumber, row, startGuardPattern);
|
|
72
|
+
} catch (ReaderException const& ignored) {
|
|
73
|
+
(void)ignored;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Special case: a 12-digit code encoded in UPC-A is identical
|
|
78
|
+
// to a "0" followed by those 12 digits encoded as EAN-13. Each
|
|
79
|
+
// will recognize such a code, UPC-A as a 12-digit string and
|
|
80
|
+
// EAN-13 as a 13-digit string starting with "0". Individually
|
|
81
|
+
// these are correct and their readers will both read such a
|
|
82
|
+
// code and correctly call it EAN-13, or UPC-A, respectively.
|
|
83
|
+
//
|
|
84
|
+
// In this case, if we've been looking for both types, we'd like
|
|
85
|
+
// to call it a UPC-A code. But for efficiency we only run the
|
|
86
|
+
// EAN-13 decoder to also read UPC-A. So we special case it
|
|
87
|
+
// here, and convert an EAN-13 result to a UPC-A result if
|
|
88
|
+
// appropriate.
|
|
89
|
+
bool ean13MayBeUPCA =
|
|
90
|
+
result->getBarcodeFormat() == BarcodeFormat::EAN_13 &&
|
|
91
|
+
result->getText()->charAt(0) == '0';
|
|
92
|
+
|
|
93
|
+
// Note: doesn't match Java which uses hints
|
|
94
|
+
|
|
95
|
+
bool canReturnUPCA = true;
|
|
96
|
+
|
|
97
|
+
if (ean13MayBeUPCA && canReturnUPCA) {
|
|
98
|
+
// Transfer the metdata across
|
|
99
|
+
Ref<Result> resultUPCA (new Result(result->getText()->substring(1),
|
|
100
|
+
result->getRawBytes(),
|
|
101
|
+
result->getResultPoints(),
|
|
102
|
+
BarcodeFormat::UPC_A));
|
|
103
|
+
// needs java metadata stuff
|
|
104
|
+
return resultUPCA;
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
throw NotFoundException();
|
|
110
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __MULTI_FORMAT_UPC_EAN_READER_H__
|
|
3
|
+
#define __MULTI_FORMAT_UPC_EAN_READER_H__
|
|
4
|
+
/*
|
|
5
|
+
* MultiFormatUPCEANReader.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/OneDReader.h>
|
|
24
|
+
|
|
25
|
+
namespace zxing {
|
|
26
|
+
namespace oned {
|
|
27
|
+
|
|
28
|
+
class UPCEANReader;
|
|
29
|
+
|
|
30
|
+
class MultiFormatUPCEANReader : public OneDReader {
|
|
31
|
+
private:
|
|
32
|
+
std::vector< Ref<UPCEANReader> > readers;
|
|
33
|
+
public:
|
|
34
|
+
MultiFormatUPCEANReader(DecodeHints hints);
|
|
35
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
#endif
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2010 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
|
+
|
|
18
|
+
#include <zxing/ZXing.h>
|
|
19
|
+
#include <zxing/oned/OneDReader.h>
|
|
20
|
+
#include <zxing/ReaderException.h>
|
|
21
|
+
#include <zxing/oned/OneDResultPoint.h>
|
|
22
|
+
#include <zxing/NotFoundException.h>
|
|
23
|
+
#include <math.h>
|
|
24
|
+
#include <limits.h>
|
|
25
|
+
|
|
26
|
+
using std::vector;
|
|
27
|
+
using zxing::Ref;
|
|
28
|
+
using zxing::Result;
|
|
29
|
+
using zxing::NotFoundException;
|
|
30
|
+
using zxing::oned::OneDReader;
|
|
31
|
+
|
|
32
|
+
// VC++
|
|
33
|
+
using zxing::BinaryBitmap;
|
|
34
|
+
using zxing::BitArray;
|
|
35
|
+
using zxing::DecodeHints;
|
|
36
|
+
|
|
37
|
+
OneDReader::OneDReader() {}
|
|
38
|
+
|
|
39
|
+
Ref<Result> OneDReader::decode(Ref<BinaryBitmap> image, DecodeHints hints) {
|
|
40
|
+
try {
|
|
41
|
+
return doDecode(image, hints);
|
|
42
|
+
} catch (NotFoundException const& nfe) {
|
|
43
|
+
// std::cerr << "trying harder" << std::endl;
|
|
44
|
+
bool tryHarder = hints.getTryHarder();
|
|
45
|
+
if (tryHarder && image->isRotateSupported()) {
|
|
46
|
+
// std::cerr << "v rotate" << std::endl;
|
|
47
|
+
Ref<BinaryBitmap> rotatedImage(image->rotateCounterClockwise());
|
|
48
|
+
// std::cerr << "^ rotate" << std::endl;
|
|
49
|
+
Ref<Result> result = doDecode(rotatedImage, hints);
|
|
50
|
+
// Doesn't have java metadata stuff
|
|
51
|
+
ArrayRef< Ref<ResultPoint> >& points (result->getResultPoints());
|
|
52
|
+
if (points && !points->empty()) {
|
|
53
|
+
int height = rotatedImage->getHeight();
|
|
54
|
+
for (int i = 0; i < points->size(); i++) {
|
|
55
|
+
points[i].reset(new OneDResultPoint(height - points[i]->getY() - 1, points[i]->getX()));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// std::cerr << "tried harder" << std::endl;
|
|
59
|
+
return result;
|
|
60
|
+
} else {
|
|
61
|
+
// std::cerr << "tried harder nfe" << std::endl;
|
|
62
|
+
throw nfe;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
#include <typeinfo>
|
|
68
|
+
|
|
69
|
+
Ref<Result> OneDReader::doDecode(Ref<BinaryBitmap> image, DecodeHints hints) {
|
|
70
|
+
int width = image->getWidth();
|
|
71
|
+
int height = image->getHeight();
|
|
72
|
+
Ref<BitArray> row(new BitArray(width));
|
|
73
|
+
|
|
74
|
+
int middle = height >> 1;
|
|
75
|
+
bool tryHarder = hints.getTryHarder();
|
|
76
|
+
int rowStep = std::max(1, height >> (tryHarder ? 8 : 5));
|
|
77
|
+
using namespace std;
|
|
78
|
+
// cerr << "rS " << rowStep << " " << height << " " << tryHarder << endl;
|
|
79
|
+
int maxLines;
|
|
80
|
+
if (tryHarder) {
|
|
81
|
+
maxLines = height; // Look at the whole image, not just the center
|
|
82
|
+
} else {
|
|
83
|
+
maxLines = 15; // 15 rows spaced 1/32 apart is roughly the middle half of the image
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (int x = 0; x < maxLines; x++) {
|
|
87
|
+
|
|
88
|
+
// Scanning from the middle out. Determine which row we're looking at next:
|
|
89
|
+
int rowStepsAboveOrBelow = (x + 1) >> 1;
|
|
90
|
+
bool isAbove = (x & 0x01) == 0; // i.e. is x even?
|
|
91
|
+
int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow);
|
|
92
|
+
if (false) {
|
|
93
|
+
std::cerr << "rN "
|
|
94
|
+
<< rowNumber << " "
|
|
95
|
+
<< height << " "
|
|
96
|
+
<< middle << " "
|
|
97
|
+
<< rowStep << " "
|
|
98
|
+
<< isAbove << " "
|
|
99
|
+
<< rowStepsAboveOrBelow
|
|
100
|
+
<< std::endl;
|
|
101
|
+
}
|
|
102
|
+
if (rowNumber < 0 || rowNumber >= height) {
|
|
103
|
+
// Oops, if we run off the top or bottom, stop
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Estimate black point for this row and load it:
|
|
108
|
+
try {
|
|
109
|
+
row = image->getBlackRow(rowNumber, row);
|
|
110
|
+
} catch (NotFoundException const& ignored) {
|
|
111
|
+
(void)ignored;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// While we have the image data in a BitArray, it's fairly cheap to reverse it in place to
|
|
116
|
+
// handle decoding upside down barcodes.
|
|
117
|
+
for (int attempt = 0; attempt < 2; attempt++) {
|
|
118
|
+
if (attempt == 1) {
|
|
119
|
+
row->reverse(); // reverse the row and continue
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Java hints stuff missing
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
// Look for a barcode
|
|
126
|
+
// std::cerr << "rn " << rowNumber << " " << typeid(*this).name() << std::endl;
|
|
127
|
+
Ref<Result> result = decodeRow(rowNumber, row);
|
|
128
|
+
// We found our barcode
|
|
129
|
+
if (attempt == 1) {
|
|
130
|
+
// But it was upside down, so note that
|
|
131
|
+
// result.putMetadata(ResultMetadataType.ORIENTATION, new Integer(180));
|
|
132
|
+
// And remember to flip the result points horizontally.
|
|
133
|
+
ArrayRef< Ref<ResultPoint> > points(result->getResultPoints());
|
|
134
|
+
if (points) {
|
|
135
|
+
points[0] = Ref<ResultPoint>(new OneDResultPoint(width - points[0]->getX() - 1,
|
|
136
|
+
points[0]->getY()));
|
|
137
|
+
points[1] = Ref<ResultPoint>(new OneDResultPoint(width - points[1]->getX() - 1,
|
|
138
|
+
points[1]->getY()));
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
} catch (ReaderException const& re) {
|
|
144
|
+
(void)re;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw NotFoundException();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
int OneDReader::patternMatchVariance(vector<int>& counters,
|
|
153
|
+
vector<int> const& pattern,
|
|
154
|
+
int maxIndividualVariance) {
|
|
155
|
+
return patternMatchVariance(counters, &pattern[0], maxIndividualVariance);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
int OneDReader::patternMatchVariance(vector<int>& counters,
|
|
159
|
+
int const pattern[],
|
|
160
|
+
int maxIndividualVariance) {
|
|
161
|
+
int numCounters = counters.size();
|
|
162
|
+
unsigned int total = 0;
|
|
163
|
+
unsigned int patternLength = 0;
|
|
164
|
+
for (int i = 0; i < numCounters; i++) {
|
|
165
|
+
total += counters[i];
|
|
166
|
+
patternLength += pattern[i];
|
|
167
|
+
}
|
|
168
|
+
if (total < patternLength) {
|
|
169
|
+
// If we don't even have one pixel per unit of bar width, assume this is too small
|
|
170
|
+
// to reliably match, so fail:
|
|
171
|
+
return INT_MAX;
|
|
172
|
+
}
|
|
173
|
+
// We're going to fake floating-point math in integers. We just need to use more bits.
|
|
174
|
+
// Scale up patternLength so that intermediate values below like scaledCounter will have
|
|
175
|
+
// more "significant digits"
|
|
176
|
+
int unitBarWidth = (total << INTEGER_MATH_SHIFT) / patternLength;
|
|
177
|
+
maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> INTEGER_MATH_SHIFT;
|
|
178
|
+
|
|
179
|
+
int totalVariance = 0;
|
|
180
|
+
for (int x = 0; x < numCounters; x++) {
|
|
181
|
+
int counter = counters[x] << INTEGER_MATH_SHIFT;
|
|
182
|
+
int scaledPattern = pattern[x] * unitBarWidth;
|
|
183
|
+
int variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter;
|
|
184
|
+
if (variance > maxIndividualVariance) {
|
|
185
|
+
return INT_MAX;
|
|
186
|
+
}
|
|
187
|
+
totalVariance += variance;
|
|
188
|
+
}
|
|
189
|
+
return totalVariance / total;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
void OneDReader::recordPattern(Ref<BitArray> row,
|
|
193
|
+
int start,
|
|
194
|
+
vector<int>& counters) {
|
|
195
|
+
int numCounters = counters.size();
|
|
196
|
+
for (int i = 0; i < numCounters; i++) {
|
|
197
|
+
counters[i] = 0;
|
|
198
|
+
}
|
|
199
|
+
int end = row->getSize();
|
|
200
|
+
if (start >= end) {
|
|
201
|
+
throw NotFoundException();
|
|
202
|
+
}
|
|
203
|
+
bool isWhite = !row->get(start);
|
|
204
|
+
int counterPosition = 0;
|
|
205
|
+
int i = start;
|
|
206
|
+
while (i < end) {
|
|
207
|
+
if (row->get(i) ^ isWhite) { // that is, exactly one is true
|
|
208
|
+
counters[counterPosition]++;
|
|
209
|
+
} else {
|
|
210
|
+
counterPosition++;
|
|
211
|
+
if (counterPosition == numCounters) {
|
|
212
|
+
break;
|
|
213
|
+
} else {
|
|
214
|
+
counters[counterPosition] = 1;
|
|
215
|
+
isWhite = !isWhite;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
i++;
|
|
219
|
+
}
|
|
220
|
+
// If we read fully the last section of pixels and filled up our counters -- or filled
|
|
221
|
+
// the last counter but ran off the side of the image, OK. Otherwise, a problem.
|
|
222
|
+
if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) {
|
|
223
|
+
throw NotFoundException();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
OneDReader::~OneDReader() {}
|