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,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011 ZXing authors All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include <zxing/multi/MultipleBarcodeReader.h>
|
|
18
|
+
|
|
19
|
+
namespace zxing {
|
|
20
|
+
namespace multi {
|
|
21
|
+
|
|
22
|
+
MultipleBarcodeReader::~MultipleBarcodeReader() { }
|
|
23
|
+
|
|
24
|
+
std::vector<Ref<Result> > MultipleBarcodeReader::decodeMultiple(Ref<BinaryBitmap> image) {
|
|
25
|
+
return decodeMultiple(image, DecodeHints::DEFAULT_HINT);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
} // End zxing::multi namespace
|
|
29
|
+
} // End zxing namespace
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#ifndef __MULTIPLE_BARCODE_READER_H__
|
|
2
|
+
#define __MULTIPLE_BARCODE_READER_H__
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2011 ZXing authors All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include <zxing/common/Counted.h>
|
|
21
|
+
#include <zxing/Result.h>
|
|
22
|
+
#include <zxing/BinaryBitmap.h>
|
|
23
|
+
#include <zxing/DecodeHints.h>
|
|
24
|
+
#include <vector>
|
|
25
|
+
|
|
26
|
+
namespace zxing {
|
|
27
|
+
namespace multi {
|
|
28
|
+
|
|
29
|
+
class MultipleBarcodeReader : public Counted {
|
|
30
|
+
protected:
|
|
31
|
+
MultipleBarcodeReader() {}
|
|
32
|
+
public:
|
|
33
|
+
virtual std::vector<Ref<Result> > decodeMultiple(Ref<BinaryBitmap> image);
|
|
34
|
+
virtual std::vector<Ref<Result> > decodeMultiple(Ref<BinaryBitmap> image, DecodeHints hints) = 0;
|
|
35
|
+
virtual ~MultipleBarcodeReader();
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
#endif // __MULTIPLE_BARCODE_READER_H__
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2011 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/multi/qrcode/QRCodeMultiReader.h>
|
|
19
|
+
#include <zxing/ReaderException.h>
|
|
20
|
+
#include <zxing/multi/qrcode/detector/MultiDetector.h>
|
|
21
|
+
#include <zxing/BarcodeFormat.h>
|
|
22
|
+
|
|
23
|
+
namespace zxing {
|
|
24
|
+
namespace multi {
|
|
25
|
+
QRCodeMultiReader::QRCodeMultiReader(){}
|
|
26
|
+
|
|
27
|
+
QRCodeMultiReader::~QRCodeMultiReader(){}
|
|
28
|
+
|
|
29
|
+
std::vector<Ref<Result> > QRCodeMultiReader::decodeMultiple(Ref<BinaryBitmap> image,
|
|
30
|
+
DecodeHints hints)
|
|
31
|
+
{
|
|
32
|
+
std::vector<Ref<Result> > results;
|
|
33
|
+
MultiDetector detector(image->getBlackMatrix());
|
|
34
|
+
|
|
35
|
+
std::vector<Ref<DetectorResult> > detectorResult = detector.detectMulti(hints);
|
|
36
|
+
for (unsigned int i = 0; i < detectorResult.size(); i++) {
|
|
37
|
+
try {
|
|
38
|
+
Ref<DecoderResult> decoderResult = getDecoder().decode(detectorResult[i]->getBits());
|
|
39
|
+
ArrayRef< Ref<ResultPoint> > points = detectorResult[i]->getPoints();
|
|
40
|
+
Ref<Result> result = Ref<Result>(new Result(decoderResult->getText(),
|
|
41
|
+
decoderResult->getRawBytes(),
|
|
42
|
+
points, BarcodeFormat::QR_CODE));
|
|
43
|
+
// result->putMetadata(ResultMetadataType.BYTE_SEGMENTS, decoderResult->getByteSegments());
|
|
44
|
+
// result->putMetadata(ResultMetadataType.ERROR_CORRECTION_LEVEL, decoderResult->getECLevel().toString());
|
|
45
|
+
results.push_back(result);
|
|
46
|
+
} catch (ReaderException const& re) {
|
|
47
|
+
(void)re;
|
|
48
|
+
// ignore and continue
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (results.empty()){
|
|
52
|
+
throw ReaderException("No code detected");
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
} // End zxing::multi namespace
|
|
58
|
+
} // End zxing namespace
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#ifndef __QRCODE_MULTI_READER_H__
|
|
2
|
+
#define __QRCODE_MULTI_READER_H__
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2011 ZXing authors All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include <zxing/multi/MultipleBarcodeReader.h>
|
|
21
|
+
#include <zxing/qrcode/QRCodeReader.h>
|
|
22
|
+
|
|
23
|
+
namespace zxing {
|
|
24
|
+
namespace multi {
|
|
25
|
+
|
|
26
|
+
class QRCodeMultiReader: public zxing::qrcode::QRCodeReader, public MultipleBarcodeReader {
|
|
27
|
+
public:
|
|
28
|
+
QRCodeMultiReader();
|
|
29
|
+
virtual ~QRCodeMultiReader();
|
|
30
|
+
virtual std::vector<Ref<Result> > decodeMultiple(Ref<BinaryBitmap> image, DecodeHints hints);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
#endif // __QRCODE_MULTI_READER_H__
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include <zxing/multi/qrcode/detector/MultiDetector.h>
|
|
18
|
+
#include <zxing/multi/qrcode/detector/MultiFinderPatternFinder.h>
|
|
19
|
+
#include <zxing/ReaderException.h>
|
|
20
|
+
|
|
21
|
+
namespace zxing {
|
|
22
|
+
namespace multi {
|
|
23
|
+
using namespace zxing::qrcode;
|
|
24
|
+
|
|
25
|
+
MultiDetector::MultiDetector(Ref<BitMatrix> image) : Detector(image) {}
|
|
26
|
+
|
|
27
|
+
MultiDetector::~MultiDetector(){}
|
|
28
|
+
|
|
29
|
+
std::vector<Ref<DetectorResult> > MultiDetector::detectMulti(DecodeHints hints){
|
|
30
|
+
Ref<BitMatrix> image = getImage();
|
|
31
|
+
MultiFinderPatternFinder finder = MultiFinderPatternFinder(image, hints.getResultPointCallback());
|
|
32
|
+
std::vector<Ref<FinderPatternInfo> > info = finder.findMulti(hints);
|
|
33
|
+
std::vector<Ref<DetectorResult> > result;
|
|
34
|
+
for(unsigned int i = 0; i < info.size(); i++){
|
|
35
|
+
try{
|
|
36
|
+
result.push_back(processFinderPatternInfo(info[i]));
|
|
37
|
+
} catch (ReaderException const& e){
|
|
38
|
+
(void)e;
|
|
39
|
+
// ignore
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
} // End zxing::multi namespace
|
|
47
|
+
} // End zxing namespace
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#ifndef __MULTI_DETECTOR_H__
|
|
2
|
+
#define __MULTI_DETECTOR_H__
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2011 ZXing authors
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include <zxing/qrcode/detector/Detector.h>
|
|
21
|
+
#include <zxing/common/DetectorResult.h>
|
|
22
|
+
#include <zxing/DecodeHints.h>
|
|
23
|
+
|
|
24
|
+
namespace zxing {
|
|
25
|
+
namespace multi {
|
|
26
|
+
|
|
27
|
+
class MultiDetector : public zxing::qrcode::Detector {
|
|
28
|
+
public:
|
|
29
|
+
MultiDetector(Ref<BitMatrix> image);
|
|
30
|
+
virtual ~MultiDetector();
|
|
31
|
+
virtual std::vector<Ref<DetectorResult> > detectMulti(DecodeHints hints);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#endif // __MULTI_DETECTOR_H__
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2011 ZXing authors
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include <cmath>
|
|
19
|
+
#include <algorithm>
|
|
20
|
+
#include <zxing/multi/qrcode/detector/MultiFinderPatternFinder.h>
|
|
21
|
+
#include <zxing/DecodeHints.h>
|
|
22
|
+
#include <zxing/ReaderException.h>
|
|
23
|
+
|
|
24
|
+
using std::abs;
|
|
25
|
+
using std::min;
|
|
26
|
+
using std::sort;
|
|
27
|
+
using std::vector;
|
|
28
|
+
using zxing::Ref;
|
|
29
|
+
using zxing::BitMatrix;
|
|
30
|
+
using zxing::ReaderException;
|
|
31
|
+
using zxing::qrcode::FinderPattern;
|
|
32
|
+
using zxing::qrcode::FinderPatternInfo;
|
|
33
|
+
using zxing::multi::MultiFinderPatternFinder;
|
|
34
|
+
|
|
35
|
+
// VC++
|
|
36
|
+
|
|
37
|
+
using zxing::BitMatrix;
|
|
38
|
+
using zxing::ResultPointCallback;
|
|
39
|
+
using zxing::DecodeHints;
|
|
40
|
+
|
|
41
|
+
const float MultiFinderPatternFinder::MAX_MODULE_COUNT_PER_EDGE = 180;
|
|
42
|
+
const float MultiFinderPatternFinder::MIN_MODULE_COUNT_PER_EDGE = 9;
|
|
43
|
+
const float MultiFinderPatternFinder::DIFF_MODSIZE_CUTOFF_PERCENT = 0.05f;
|
|
44
|
+
const float MultiFinderPatternFinder::DIFF_MODSIZE_CUTOFF = 0.5f;
|
|
45
|
+
|
|
46
|
+
namespace {
|
|
47
|
+
|
|
48
|
+
bool compareModuleSize(Ref<FinderPattern> a, Ref<FinderPattern> b){
|
|
49
|
+
float value = a->getEstimatedModuleSize() - b->getEstimatedModuleSize();
|
|
50
|
+
return value < 0.0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
MultiFinderPatternFinder::MultiFinderPatternFinder(Ref<BitMatrix> image,
|
|
56
|
+
Ref<ResultPointCallback> resultPointCallback)
|
|
57
|
+
: FinderPatternFinder(image, resultPointCallback)
|
|
58
|
+
{
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
MultiFinderPatternFinder::~MultiFinderPatternFinder(){}
|
|
62
|
+
|
|
63
|
+
vector<Ref<FinderPatternInfo> > MultiFinderPatternFinder::findMulti(DecodeHints const& hints){
|
|
64
|
+
bool tryHarder = hints.getTryHarder();
|
|
65
|
+
Ref<BitMatrix> image = image_; // Protected member
|
|
66
|
+
int maxI = image->getHeight();
|
|
67
|
+
int maxJ = image->getWidth();
|
|
68
|
+
// We are looking for black/white/black/white/black modules in
|
|
69
|
+
// 1:1:3:1:1 ratio; this tracks the number of such modules seen so far
|
|
70
|
+
|
|
71
|
+
// Let's assume that the maximum version QR Code we support takes up 1/4 the height of the
|
|
72
|
+
// image, and then account for the center being 3 modules in size. This gives the smallest
|
|
73
|
+
// number of pixels the center could be, so skip this often. When trying harder, look for all
|
|
74
|
+
// QR versions regardless of how dense they are.
|
|
75
|
+
int iSkip = (int) (maxI / (MAX_MODULES * 4.0f) * 3);
|
|
76
|
+
if (iSkip < MIN_SKIP || tryHarder) {
|
|
77
|
+
iSkip = MIN_SKIP;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
int stateCount[5];
|
|
81
|
+
for (int i = iSkip - 1; i < maxI; i += iSkip) {
|
|
82
|
+
// Get a row of black/white values
|
|
83
|
+
stateCount[0] = 0;
|
|
84
|
+
stateCount[1] = 0;
|
|
85
|
+
stateCount[2] = 0;
|
|
86
|
+
stateCount[3] = 0;
|
|
87
|
+
stateCount[4] = 0;
|
|
88
|
+
int currentState = 0;
|
|
89
|
+
for (int j = 0; j < maxJ; j++) {
|
|
90
|
+
if (image->get(j, i)) {
|
|
91
|
+
// Black pixel
|
|
92
|
+
if ((currentState & 1) == 1) { // Counting white pixels
|
|
93
|
+
currentState++;
|
|
94
|
+
}
|
|
95
|
+
stateCount[currentState]++;
|
|
96
|
+
} else { // White pixel
|
|
97
|
+
if ((currentState & 1) == 0) { // Counting black pixels
|
|
98
|
+
if (currentState == 4) { // A winner?
|
|
99
|
+
if (foundPatternCross(stateCount) && handlePossibleCenter(stateCount, i, j)) { // Yes
|
|
100
|
+
// Clear state to start looking again
|
|
101
|
+
currentState = 0;
|
|
102
|
+
stateCount[0] = 0;
|
|
103
|
+
stateCount[1] = 0;
|
|
104
|
+
stateCount[2] = 0;
|
|
105
|
+
stateCount[3] = 0;
|
|
106
|
+
stateCount[4] = 0;
|
|
107
|
+
} else { // No, shift counts back by two
|
|
108
|
+
stateCount[0] = stateCount[2];
|
|
109
|
+
stateCount[1] = stateCount[3];
|
|
110
|
+
stateCount[2] = stateCount[4];
|
|
111
|
+
stateCount[3] = 1;
|
|
112
|
+
stateCount[4] = 0;
|
|
113
|
+
currentState = 3;
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
stateCount[++currentState]++;
|
|
117
|
+
}
|
|
118
|
+
} else { // Counting white pixels
|
|
119
|
+
stateCount[currentState]++;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} // for j=...
|
|
123
|
+
|
|
124
|
+
if (foundPatternCross(stateCount)) {
|
|
125
|
+
handlePossibleCenter(stateCount, i, maxJ);
|
|
126
|
+
} // end if foundPatternCross
|
|
127
|
+
} // for i=iSkip-1 ...
|
|
128
|
+
vector<vector<Ref<FinderPattern> > > patternInfo = selectBestPatterns();
|
|
129
|
+
vector<Ref<FinderPatternInfo> > result;
|
|
130
|
+
for (unsigned int i = 0; i < patternInfo.size(); i++) {
|
|
131
|
+
vector<Ref<FinderPattern> > pattern = patternInfo[i];
|
|
132
|
+
pattern = FinderPatternFinder::orderBestPatterns(pattern);
|
|
133
|
+
result.push_back(Ref<FinderPatternInfo>(new FinderPatternInfo(pattern)));
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
vector<vector<Ref<FinderPattern> > > MultiFinderPatternFinder::selectBestPatterns(){
|
|
139
|
+
vector<Ref<FinderPattern> > possibleCenters = possibleCenters_;
|
|
140
|
+
|
|
141
|
+
int size = possibleCenters.size();
|
|
142
|
+
|
|
143
|
+
if (size < 3) {
|
|
144
|
+
// Couldn't find enough finder patterns
|
|
145
|
+
throw ReaderException("No code detected");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
vector<vector<Ref<FinderPattern> > > results;
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* Begin HE modifications to safely detect multiple codes of equal size
|
|
152
|
+
*/
|
|
153
|
+
if (size == 3) {
|
|
154
|
+
results.push_back(possibleCenters_);
|
|
155
|
+
return results;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Sort by estimated module size to speed up the upcoming checks
|
|
159
|
+
//TODO do a sort based on module size
|
|
160
|
+
sort(possibleCenters.begin(), possibleCenters.end(), compareModuleSize);
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* Now lets start: build a list of tuples of three finder locations that
|
|
164
|
+
* - feature similar module sizes
|
|
165
|
+
* - are placed in a distance so the estimated module count is within the QR specification
|
|
166
|
+
* - have similar distance between upper left/right and left top/bottom finder patterns
|
|
167
|
+
* - form a triangle with 90° angle (checked by comparing top right/bottom left distance
|
|
168
|
+
* with pythagoras)
|
|
169
|
+
*
|
|
170
|
+
* Note: we allow each point to be used for more than one code region: this might seem
|
|
171
|
+
* counterintuitive at first, but the performance penalty is not that big. At this point,
|
|
172
|
+
* we cannot make a good quality decision whether the three finders actually represent
|
|
173
|
+
* a QR code, or are just by chance layouted so it looks like there might be a QR code there.
|
|
174
|
+
* So, if the layout seems right, lets have the decoder try to decode.
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
for (int i1 = 0; i1 < (size - 2); i1++) {
|
|
178
|
+
Ref<FinderPattern> p1 = possibleCenters[i1];
|
|
179
|
+
for (int i2 = i1 + 1; i2 < (size - 1); i2++) {
|
|
180
|
+
Ref<FinderPattern> p2 = possibleCenters[i2];
|
|
181
|
+
// Compare the expected module sizes; if they are really off, skip
|
|
182
|
+
float vModSize12 = (p1->getEstimatedModuleSize() - p2->getEstimatedModuleSize()) / min(p1->getEstimatedModuleSize(), p2->getEstimatedModuleSize());
|
|
183
|
+
float vModSize12A = abs(p1->getEstimatedModuleSize() - p2->getEstimatedModuleSize());
|
|
184
|
+
if (vModSize12A > DIFF_MODSIZE_CUTOFF && vModSize12 >= DIFF_MODSIZE_CUTOFF_PERCENT) {
|
|
185
|
+
// break, since elements are ordered by the module size deviation there cannot be
|
|
186
|
+
// any more interesting elements for the given p1.
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
for (int i3 = i2 + 1; i3 < size; i3++) {
|
|
190
|
+
Ref<FinderPattern> p3 = possibleCenters[i3];
|
|
191
|
+
// Compare the expected module sizes; if they are really off, skip
|
|
192
|
+
float vModSize23 = (p2->getEstimatedModuleSize() - p3->getEstimatedModuleSize()) / min(p2->getEstimatedModuleSize(), p3->getEstimatedModuleSize());
|
|
193
|
+
float vModSize23A = abs(p2->getEstimatedModuleSize() - p3->getEstimatedModuleSize());
|
|
194
|
+
if (vModSize23A > DIFF_MODSIZE_CUTOFF && vModSize23 >= DIFF_MODSIZE_CUTOFF_PERCENT) {
|
|
195
|
+
// break, since elements are ordered by the module size deviation there cannot be
|
|
196
|
+
// any more interesting elements for the given p1.
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
vector<Ref<FinderPattern> > test;
|
|
200
|
+
test.push_back(p1);
|
|
201
|
+
test.push_back(p2);
|
|
202
|
+
test.push_back(p3);
|
|
203
|
+
test = FinderPatternFinder::orderBestPatterns(test);
|
|
204
|
+
// Calculate the distances: a = topleft-bottomleft, b=topleft-topright, c = diagonal
|
|
205
|
+
Ref<FinderPatternInfo> info = Ref<FinderPatternInfo>(new FinderPatternInfo(test));
|
|
206
|
+
float dA = FinderPatternFinder::distance(info->getTopLeft(), info->getBottomLeft());
|
|
207
|
+
float dC = FinderPatternFinder::distance(info->getTopRight(), info->getBottomLeft());
|
|
208
|
+
float dB = FinderPatternFinder::distance(info->getTopLeft(), info->getTopRight());
|
|
209
|
+
// Check the sizes
|
|
210
|
+
float estimatedModuleCount = (dA + dB) / (p1->getEstimatedModuleSize() * 2.0f);
|
|
211
|
+
if (estimatedModuleCount > MAX_MODULE_COUNT_PER_EDGE || estimatedModuleCount < MIN_MODULE_COUNT_PER_EDGE) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// Calculate the difference of the edge lengths in percent
|
|
215
|
+
float vABBC = abs((dA - dB) / min(dA, dB));
|
|
216
|
+
if (vABBC >= 0.1f) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
// Calculate the diagonal length by assuming a 90° angle at topleft
|
|
220
|
+
float dCpy = (float) sqrt(dA * dA + dB * dB);
|
|
221
|
+
// Compare to the real distance in %
|
|
222
|
+
float vPyC = abs((dC - dCpy) / min(dC, dCpy));
|
|
223
|
+
if (vPyC >= 0.1f) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// All tests passed!
|
|
227
|
+
results.push_back(test);
|
|
228
|
+
} // end iterate p3
|
|
229
|
+
} // end iterate p2
|
|
230
|
+
} // end iterate p1
|
|
231
|
+
if (results.empty()){
|
|
232
|
+
// Nothing found!
|
|
233
|
+
throw ReaderException("No code detected");
|
|
234
|
+
}
|
|
235
|
+
return results;
|
|
236
|
+
}
|