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,58 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __CODE_93_READER_H__
|
|
3
|
+
#define __CODE_93_READER_H__
|
|
4
|
+
/*
|
|
5
|
+
* Code93Reader.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
|
+
#include <zxing/common/BitArray.h>
|
|
25
|
+
#include <zxing/Result.h>
|
|
26
|
+
|
|
27
|
+
namespace zxing {
|
|
28
|
+
namespace oned {
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* <p>Decodes Code 93 barcodes. This does not support "Full ASCII Code 93" yet.</p>
|
|
32
|
+
* Ported form Java (author Sean Owen)
|
|
33
|
+
* @author Lukasz Warchol
|
|
34
|
+
*/
|
|
35
|
+
class Code93Reader : public OneDReader {
|
|
36
|
+
public:
|
|
37
|
+
Code93Reader();
|
|
38
|
+
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
|
39
|
+
|
|
40
|
+
private:
|
|
41
|
+
std::string decodeRowResult;
|
|
42
|
+
std::vector<int> counters;
|
|
43
|
+
|
|
44
|
+
Range findAsteriskPattern(Ref<BitArray> row);
|
|
45
|
+
|
|
46
|
+
static int toPattern(std::vector<int>& counters);
|
|
47
|
+
static char patternToChar(int pattern);
|
|
48
|
+
static Ref<String> decodeExtended(std::string const& encoded);
|
|
49
|
+
static void checkChecksums(std::string const& result);
|
|
50
|
+
static void checkOneChecksum(std::string const& result,
|
|
51
|
+
int checkPosition,
|
|
52
|
+
int weightMax);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#endif
|
|
@@ -0,0 +1,85 @@
|
|
|
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 "EAN13Reader.h"
|
|
19
|
+
#include <zxing/NotFoundException.h>
|
|
20
|
+
|
|
21
|
+
using std::vector;
|
|
22
|
+
using zxing::Ref;
|
|
23
|
+
using zxing::BitArray;
|
|
24
|
+
using zxing::oned::EAN13Reader;
|
|
25
|
+
|
|
26
|
+
namespace {
|
|
27
|
+
const int FIRST_DIGIT_ENCODINGS[10] = {
|
|
28
|
+
0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
EAN13Reader::EAN13Reader() : decodeMiddleCounters(4, 0) { }
|
|
33
|
+
|
|
34
|
+
int EAN13Reader::decodeMiddle(Ref<BitArray> row,
|
|
35
|
+
Range const& startRange,
|
|
36
|
+
std::string& resultString) {
|
|
37
|
+
vector<int>& counters (decodeMiddleCounters);
|
|
38
|
+
counters.clear();
|
|
39
|
+
counters.resize(4);
|
|
40
|
+
int end = row->getSize();
|
|
41
|
+
int rowOffset = startRange[1];
|
|
42
|
+
|
|
43
|
+
int lgPatternFound = 0;
|
|
44
|
+
|
|
45
|
+
for (int x = 0; x < 6 && rowOffset < end; x++) {
|
|
46
|
+
int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS);
|
|
47
|
+
resultString.append(1, (char) ('0' + bestMatch % 10));
|
|
48
|
+
for (int i = 0, end = counters.size(); i <end; i++) {
|
|
49
|
+
rowOffset += counters[i];
|
|
50
|
+
}
|
|
51
|
+
if (bestMatch >= 10) {
|
|
52
|
+
lgPatternFound |= 1 << (5 - x);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
determineFirstDigit(resultString, lgPatternFound);
|
|
57
|
+
|
|
58
|
+
Range middleRange = findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN) ;
|
|
59
|
+
rowOffset = middleRange[1];
|
|
60
|
+
|
|
61
|
+
for (int x = 0; x < 6 && rowOffset < end; x++) {
|
|
62
|
+
int bestMatch =
|
|
63
|
+
decodeDigit(row, counters, rowOffset, L_PATTERNS);
|
|
64
|
+
resultString.append(1, (char) ('0' + bestMatch));
|
|
65
|
+
for (int i = 0, end = counters.size(); i < end; i++) {
|
|
66
|
+
rowOffset += counters[i];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return rowOffset;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
void EAN13Reader::determineFirstDigit(std::string& resultString, int lgPatternFound) {
|
|
73
|
+
// std::cerr << "K " << resultString << " " << lgPatternFound << " " <<FIRST_DIGIT_ENCODINGS << std::endl;
|
|
74
|
+
for (int d = 0; d < 10; d++) {
|
|
75
|
+
if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
|
|
76
|
+
resultString.insert(0, 1, (char) ('0' + d));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
throw NotFoundException();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
zxing::BarcodeFormat EAN13Reader::getBarcodeFormat(){
|
|
84
|
+
return BarcodeFormat::EAN_13;
|
|
85
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __EAN_13_READER_H__
|
|
3
|
+
#define __EAN_13_READER_H__
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* EAN13Reader.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/oned/UPCEANReader.h>
|
|
25
|
+
#include <zxing/Result.h>
|
|
26
|
+
|
|
27
|
+
namespace zxing {
|
|
28
|
+
namespace oned {
|
|
29
|
+
|
|
30
|
+
class EAN13Reader : public UPCEANReader {
|
|
31
|
+
private:
|
|
32
|
+
std::vector<int> decodeMiddleCounters;
|
|
33
|
+
static void determineFirstDigit(std::string& resultString,
|
|
34
|
+
int lgPatternFound);
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
EAN13Reader();
|
|
38
|
+
|
|
39
|
+
int decodeMiddle(Ref<BitArray> row,
|
|
40
|
+
Range const& startRange,
|
|
41
|
+
std::string& resultString);
|
|
42
|
+
|
|
43
|
+
BarcodeFormat getBarcodeFormat();
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#endif
|
|
@@ -0,0 +1,65 @@
|
|
|
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 "EAN8Reader.h"
|
|
19
|
+
#include <zxing/ReaderException.h>
|
|
20
|
+
|
|
21
|
+
using std::vector;
|
|
22
|
+
using zxing::oned::EAN8Reader;
|
|
23
|
+
|
|
24
|
+
// VC++
|
|
25
|
+
using zxing::Ref;
|
|
26
|
+
using zxing::BitArray;
|
|
27
|
+
|
|
28
|
+
EAN8Reader::EAN8Reader() : decodeMiddleCounters(4, 0) {}
|
|
29
|
+
|
|
30
|
+
int EAN8Reader::decodeMiddle(Ref<BitArray> row,
|
|
31
|
+
Range const& startRange,
|
|
32
|
+
std::string& result){
|
|
33
|
+
vector<int>& counters (decodeMiddleCounters);
|
|
34
|
+
counters[0] = 0;
|
|
35
|
+
counters[1] = 0;
|
|
36
|
+
counters[2] = 0;
|
|
37
|
+
counters[3] = 0;
|
|
38
|
+
|
|
39
|
+
int end = row->getSize();
|
|
40
|
+
int rowOffset = startRange[1];
|
|
41
|
+
|
|
42
|
+
for (int x = 0; x < 4 && rowOffset < end; x++) {
|
|
43
|
+
int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS);
|
|
44
|
+
result.append(1, (char) ('0' + bestMatch));
|
|
45
|
+
for (int i = 0, end = counters.size(); i < end; i++) {
|
|
46
|
+
rowOffset += counters[i];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Range middleRange =
|
|
51
|
+
findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN);
|
|
52
|
+
rowOffset = middleRange[1];
|
|
53
|
+
for (int x = 0; x < 4 && rowOffset < end; x++) {
|
|
54
|
+
int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS);
|
|
55
|
+
result.append(1, (char) ('0' + bestMatch));
|
|
56
|
+
for (int i = 0, end = counters.size(); i < end; i++) {
|
|
57
|
+
rowOffset += counters[i];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return rowOffset;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
zxing::BarcodeFormat EAN8Reader::getBarcodeFormat(){
|
|
64
|
+
return BarcodeFormat::EAN_8;
|
|
65
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __EAN_8_READER_H__
|
|
3
|
+
#define __EAN_8_READER_H__
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* EAN8Reader.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/oned/UPCEANReader.h>
|
|
25
|
+
#include <zxing/Result.h>
|
|
26
|
+
|
|
27
|
+
namespace zxing {
|
|
28
|
+
namespace oned {
|
|
29
|
+
|
|
30
|
+
class EAN8Reader : public UPCEANReader {
|
|
31
|
+
private:
|
|
32
|
+
std::vector<int> decodeMiddleCounters;
|
|
33
|
+
|
|
34
|
+
public:
|
|
35
|
+
EAN8Reader();
|
|
36
|
+
|
|
37
|
+
int decodeMiddle(Ref<BitArray> row,
|
|
38
|
+
Range const& startRange,
|
|
39
|
+
std::string& resultString);
|
|
40
|
+
|
|
41
|
+
BarcodeFormat getBarcodeFormat();
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#endif
|
|
@@ -0,0 +1,337 @@
|
|
|
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/ITFReader.h>
|
|
20
|
+
#include <zxing/oned/OneDResultPoint.h>
|
|
21
|
+
#include <zxing/common/Array.h>
|
|
22
|
+
#include <zxing/ReaderException.h>
|
|
23
|
+
#include <zxing/FormatException.h>
|
|
24
|
+
#include <zxing/NotFoundException.h>
|
|
25
|
+
#include <math.h>
|
|
26
|
+
|
|
27
|
+
using std::vector;
|
|
28
|
+
using zxing::Ref;
|
|
29
|
+
using zxing::ArrayRef;
|
|
30
|
+
using zxing::Array;
|
|
31
|
+
using zxing::Result;
|
|
32
|
+
using zxing::FormatException;
|
|
33
|
+
using zxing::NotFoundException;
|
|
34
|
+
using zxing::oned::ITFReader;
|
|
35
|
+
|
|
36
|
+
// VC++
|
|
37
|
+
using zxing::BitArray;
|
|
38
|
+
|
|
39
|
+
#define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0])
|
|
40
|
+
|
|
41
|
+
namespace {
|
|
42
|
+
|
|
43
|
+
const int W = 3; // Pixel width of a wide line
|
|
44
|
+
const int N = 1; // Pixed width of a narrow line
|
|
45
|
+
|
|
46
|
+
const int DEFAULT_ALLOWED_LENGTHS_[] =
|
|
47
|
+
{ 48, 44, 24, 20, 18, 16, 14, 12, 10, 8, 6 };
|
|
48
|
+
const ArrayRef<int> DEFAULT_ALLOWED_LENGTHS (new Array<int>(VECTOR_INIT(DEFAULT_ALLOWED_LENGTHS_)));
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Start/end guard pattern.
|
|
52
|
+
*
|
|
53
|
+
* Note: The end pattern is reversed because the row is reversed before
|
|
54
|
+
* searching for the END_PATTERN
|
|
55
|
+
*/
|
|
56
|
+
const int START_PATTERN_[] = {N, N, N, N};
|
|
57
|
+
const vector<int> START_PATTERN (VECTOR_INIT(START_PATTERN_));
|
|
58
|
+
|
|
59
|
+
const int END_PATTERN_REVERSED_[] = {N, N, W};
|
|
60
|
+
const vector<int> END_PATTERN_REVERSED (VECTOR_INIT(END_PATTERN_REVERSED_));
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Patterns of Wide / Narrow lines to indicate each digit
|
|
64
|
+
*/
|
|
65
|
+
const int PATTERNS[][5] = {
|
|
66
|
+
{N, N, W, W, N}, // 0
|
|
67
|
+
{W, N, N, N, W}, // 1
|
|
68
|
+
{N, W, N, N, W}, // 2
|
|
69
|
+
{W, W, N, N, N}, // 3
|
|
70
|
+
{N, N, W, N, W}, // 4
|
|
71
|
+
{W, N, W, N, N}, // 5
|
|
72
|
+
{N, W, W, N, N}, // 6
|
|
73
|
+
{N, N, N, W, W}, // 7
|
|
74
|
+
{W, N, N, W, N}, // 8
|
|
75
|
+
{N, W, N, W, N} // 9
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
ITFReader::ITFReader() : narrowLineWidth(-1) {
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
Ref<Result> ITFReader::decodeRow(int rowNumber, Ref<BitArray> row) {
|
|
85
|
+
// Find out where the Middle section (payload) starts & ends
|
|
86
|
+
|
|
87
|
+
Range startRange = decodeStart(row);
|
|
88
|
+
Range endRange = decodeEnd(row);
|
|
89
|
+
|
|
90
|
+
std::string result;
|
|
91
|
+
decodeMiddle(row, startRange[1], endRange[0], result);
|
|
92
|
+
Ref<String> resultString(new String(result));
|
|
93
|
+
|
|
94
|
+
ArrayRef<int> allowedLengths;
|
|
95
|
+
// Java hints stuff missing
|
|
96
|
+
if (!allowedLengths) {
|
|
97
|
+
allowedLengths = DEFAULT_ALLOWED_LENGTHS;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// To avoid false positives with 2D barcodes (and other patterns), make
|
|
101
|
+
// an assumption that the decoded string must be 6, 10 or 14 digits.
|
|
102
|
+
int length = resultString->size();
|
|
103
|
+
bool lengthOK = false;
|
|
104
|
+
for (int i = 0, e = allowedLengths->size(); i < e; i++) {
|
|
105
|
+
if (length == allowedLengths[i]) {
|
|
106
|
+
lengthOK = true;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!lengthOK) {
|
|
112
|
+
throw FormatException();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
ArrayRef< Ref<ResultPoint> > resultPoints(2);
|
|
116
|
+
resultPoints[0] =
|
|
117
|
+
Ref<OneDResultPoint>(new OneDResultPoint(float(startRange[1]), float(rowNumber)));
|
|
118
|
+
resultPoints[1] =
|
|
119
|
+
Ref<OneDResultPoint>(new OneDResultPoint(float(endRange[0]), float(rowNumber)));
|
|
120
|
+
return Ref<Result>(new Result(resultString, ArrayRef<char>(), resultPoints, BarcodeFormat::ITF));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @param row row of black/white values to search
|
|
125
|
+
* @param payloadStart offset of start pattern
|
|
126
|
+
* @param resultString {@link StringBuffer} to append decoded chars to
|
|
127
|
+
* @throws ReaderException if decoding could not complete successfully
|
|
128
|
+
*/
|
|
129
|
+
void ITFReader::decodeMiddle(Ref<BitArray> row,
|
|
130
|
+
int payloadStart,
|
|
131
|
+
int payloadEnd,
|
|
132
|
+
std::string& resultString) {
|
|
133
|
+
// Digits are interleaved in pairs - 5 black lines for one digit, and the
|
|
134
|
+
// 5
|
|
135
|
+
// interleaved white lines for the second digit.
|
|
136
|
+
// Therefore, need to scan 10 lines and then
|
|
137
|
+
// split these into two arrays
|
|
138
|
+
vector<int> counterDigitPair(10, 0);
|
|
139
|
+
vector<int> counterBlack(5, 0);
|
|
140
|
+
vector<int> counterWhite(5, 0);
|
|
141
|
+
|
|
142
|
+
while (payloadStart < payloadEnd) {
|
|
143
|
+
|
|
144
|
+
// Get 10 runs of black/white.
|
|
145
|
+
recordPattern(row, payloadStart, counterDigitPair);
|
|
146
|
+
// Split them into each array
|
|
147
|
+
for (int k = 0; k < 5; k++) {
|
|
148
|
+
int twoK = k << 1;
|
|
149
|
+
counterBlack[k] = counterDigitPair[twoK];
|
|
150
|
+
counterWhite[k] = counterDigitPair[twoK + 1];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
int bestMatch = decodeDigit(counterBlack);
|
|
154
|
+
resultString.append(1, (char) ('0' + bestMatch));
|
|
155
|
+
bestMatch = decodeDigit(counterWhite);
|
|
156
|
+
resultString.append(1, (char) ('0' + bestMatch));
|
|
157
|
+
|
|
158
|
+
for (int i = 0, e = counterDigitPair.size(); i < e; i++) {
|
|
159
|
+
payloadStart += counterDigitPair[i];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Identify where the start of the middle / payload section starts.
|
|
166
|
+
*
|
|
167
|
+
* @param row row of black/white values to search
|
|
168
|
+
* @return Array, containing index of start of 'start block' and end of
|
|
169
|
+
* 'start block'
|
|
170
|
+
* @throws ReaderException
|
|
171
|
+
*/
|
|
172
|
+
ITFReader::Range ITFReader::decodeStart(Ref<BitArray> row) {
|
|
173
|
+
int endStart = skipWhiteSpace(row);
|
|
174
|
+
Range startPattern = findGuardPattern(row, endStart, START_PATTERN);
|
|
175
|
+
|
|
176
|
+
// Determine the width of a narrow line in pixels. We can do this by
|
|
177
|
+
// getting the width of the start pattern and dividing by 4 because its
|
|
178
|
+
// made up of 4 narrow lines.
|
|
179
|
+
narrowLineWidth = (startPattern[1] - startPattern[0]) >> 2;
|
|
180
|
+
|
|
181
|
+
validateQuietZone(row, startPattern[0]);
|
|
182
|
+
return startPattern;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Identify where the end of the middle / payload section ends.
|
|
187
|
+
*
|
|
188
|
+
* @param row row of black/white values to search
|
|
189
|
+
* @return Array, containing index of start of 'end block' and end of 'end
|
|
190
|
+
* block'
|
|
191
|
+
* @throws ReaderException
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
ITFReader::Range ITFReader::decodeEnd(Ref<BitArray> row) {
|
|
195
|
+
// For convenience, reverse the row and then
|
|
196
|
+
// search from 'the start' for the end block
|
|
197
|
+
BitArray::Reverse r (row);
|
|
198
|
+
|
|
199
|
+
int endStart = skipWhiteSpace(row);
|
|
200
|
+
Range endPattern = findGuardPattern(row, endStart, END_PATTERN_REVERSED);
|
|
201
|
+
|
|
202
|
+
// The start & end patterns must be pre/post fixed by a quiet zone. This
|
|
203
|
+
// zone must be at least 10 times the width of a narrow line.
|
|
204
|
+
// ref: http://www.barcode-1.net/i25code.html
|
|
205
|
+
validateQuietZone(row, endPattern[0]);
|
|
206
|
+
|
|
207
|
+
// Now recalculate the indices of where the 'endblock' starts & stops to
|
|
208
|
+
// accommodate
|
|
209
|
+
// the reversed nature of the search
|
|
210
|
+
int temp = endPattern[0];
|
|
211
|
+
endPattern[0] = row->getSize() - endPattern[1];
|
|
212
|
+
endPattern[1] = row->getSize() - temp;
|
|
213
|
+
|
|
214
|
+
return endPattern;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* The start & end patterns must be pre/post fixed by a quiet zone. This
|
|
219
|
+
* zone must be at least 10 times the width of a narrow line. Scan back until
|
|
220
|
+
* we either get to the start of the barcode or match the necessary number of
|
|
221
|
+
* quiet zone pixels.
|
|
222
|
+
*
|
|
223
|
+
* Note: Its assumed the row is reversed when using this method to find
|
|
224
|
+
* quiet zone after the end pattern.
|
|
225
|
+
*
|
|
226
|
+
* ref: http://www.barcode-1.net/i25code.html
|
|
227
|
+
*
|
|
228
|
+
* @param row bit array representing the scanned barcode.
|
|
229
|
+
* @param startPattern index into row of the start or end pattern.
|
|
230
|
+
* @throws ReaderException if the quiet zone cannot be found, a ReaderException is thrown.
|
|
231
|
+
*/
|
|
232
|
+
void ITFReader::validateQuietZone(Ref<BitArray> row, int startPattern) {
|
|
233
|
+
int quietCount = this->narrowLineWidth * 10; // expect to find this many pixels of quiet zone
|
|
234
|
+
|
|
235
|
+
for (int i = startPattern - 1; quietCount > 0 && i >= 0; i--) {
|
|
236
|
+
if (row->get(i)) {
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
quietCount--;
|
|
240
|
+
}
|
|
241
|
+
if (quietCount != 0) {
|
|
242
|
+
// Unable to find the necessary number of quiet zone pixels.
|
|
243
|
+
throw NotFoundException();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Skip all whitespace until we get to the first black line.
|
|
249
|
+
*
|
|
250
|
+
* @param row row of black/white values to search
|
|
251
|
+
* @return index of the first black line.
|
|
252
|
+
* @throws ReaderException Throws exception if no black lines are found in the row
|
|
253
|
+
*/
|
|
254
|
+
int ITFReader::skipWhiteSpace(Ref<BitArray> row) {
|
|
255
|
+
int width = row->getSize();
|
|
256
|
+
int endStart = row->getNextSet(0);
|
|
257
|
+
if (endStart == width) {
|
|
258
|
+
throw NotFoundException();
|
|
259
|
+
}
|
|
260
|
+
return endStart;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* @param row row of black/white values to search
|
|
265
|
+
* @param rowOffset position to start search
|
|
266
|
+
* @param pattern pattern of counts of number of black and white pixels that are
|
|
267
|
+
* being searched for as a pattern
|
|
268
|
+
* @return start/end horizontal offset of guard pattern, as an array of two
|
|
269
|
+
* ints
|
|
270
|
+
* @throws ReaderException if pattern is not found
|
|
271
|
+
*/
|
|
272
|
+
ITFReader::Range ITFReader::findGuardPattern(Ref<BitArray> row,
|
|
273
|
+
int rowOffset,
|
|
274
|
+
vector<int> const& pattern) {
|
|
275
|
+
// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
|
|
276
|
+
// merged to a single method.
|
|
277
|
+
int patternLength = pattern.size();
|
|
278
|
+
vector<int> counters(patternLength);
|
|
279
|
+
int width = row->getSize();
|
|
280
|
+
bool isWhite = false;
|
|
281
|
+
|
|
282
|
+
int counterPosition = 0;
|
|
283
|
+
int patternStart = rowOffset;
|
|
284
|
+
for (int x = rowOffset; x < width; x++) {
|
|
285
|
+
if (row->get(x) ^ isWhite) {
|
|
286
|
+
counters[counterPosition]++;
|
|
287
|
+
} else {
|
|
288
|
+
if (counterPosition == patternLength - 1) {
|
|
289
|
+
if (patternMatchVariance(counters, &pattern[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
|
|
290
|
+
return Range(patternStart, x);
|
|
291
|
+
}
|
|
292
|
+
patternStart += counters[0] + counters[1];
|
|
293
|
+
for (int y = 2; y < patternLength; y++) {
|
|
294
|
+
counters[y - 2] = counters[y];
|
|
295
|
+
}
|
|
296
|
+
counters[patternLength - 2] = 0;
|
|
297
|
+
counters[patternLength - 1] = 0;
|
|
298
|
+
counterPosition--;
|
|
299
|
+
} else {
|
|
300
|
+
counterPosition++;
|
|
301
|
+
}
|
|
302
|
+
counters[counterPosition] = 1;
|
|
303
|
+
isWhite = !isWhite;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
throw NotFoundException();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Attempts to decode a sequence of ITF black/white lines into single
|
|
311
|
+
* digit.
|
|
312
|
+
*
|
|
313
|
+
* @param counters the counts of runs of observed black/white/black/... values
|
|
314
|
+
* @return The decoded digit
|
|
315
|
+
* @throws ReaderException if digit cannot be decoded
|
|
316
|
+
*/
|
|
317
|
+
int ITFReader::decodeDigit(vector<int>& counters){
|
|
318
|
+
|
|
319
|
+
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
|
320
|
+
int bestMatch = -1;
|
|
321
|
+
int max = sizeof(PATTERNS)/sizeof(PATTERNS[0]);
|
|
322
|
+
for (int i = 0; i < max; i++) {
|
|
323
|
+
int const* pattern = PATTERNS[i];
|
|
324
|
+
int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE);
|
|
325
|
+
if (variance < bestVariance) {
|
|
326
|
+
bestVariance = variance;
|
|
327
|
+
bestMatch = i;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (bestMatch >= 0) {
|
|
331
|
+
return bestMatch;
|
|
332
|
+
} else {
|
|
333
|
+
throw NotFoundException();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
ITFReader::~ITFReader(){}
|