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,43 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __ZXING_COMMON_DETECTOR_MATH_H__
|
|
3
|
+
#define __ZXING_COMMON_DETECTOR_MATH_H__
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2012 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 <cmath>
|
|
21
|
+
|
|
22
|
+
namespace zxing {
|
|
23
|
+
namespace common {
|
|
24
|
+
namespace detector {
|
|
25
|
+
|
|
26
|
+
class Math {
|
|
27
|
+
private:
|
|
28
|
+
Math();
|
|
29
|
+
~Math();
|
|
30
|
+
public:
|
|
31
|
+
|
|
32
|
+
// Java standard Math.round
|
|
33
|
+
static inline int round(float a) {
|
|
34
|
+
return (int)std::floor(a +0.5f);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#endif
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
#ifndef __ZXING_COMMON_DETECTOR_MATHUTILS_H__
|
|
3
|
+
#define __ZXING_COMMON_DETECTOR_MATHUTILS_H__
|
|
4
|
+
/*
|
|
5
|
+
* Copyright 2012 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 <cmath>
|
|
21
|
+
|
|
22
|
+
namespace zxing {
|
|
23
|
+
namespace common {
|
|
24
|
+
namespace detector {
|
|
25
|
+
|
|
26
|
+
class MathUtils {
|
|
27
|
+
private:
|
|
28
|
+
MathUtils();
|
|
29
|
+
~MathUtils();
|
|
30
|
+
public:
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its
|
|
34
|
+
* argument to the nearest int, where x.5 rounds up to x+1.
|
|
35
|
+
*/
|
|
36
|
+
static inline int round(float d) {
|
|
37
|
+
return (int) (d + 0.5f);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static inline float distance(float aX, float aY, float bX, float bY) {
|
|
41
|
+
float xDiff = aX - bX;
|
|
42
|
+
float yDiff = aY - bY;
|
|
43
|
+
return sqrt(xDiff * xDiff + yDiff * yDiff);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static inline float distance(int aX, int aY, int bX, int bY) {
|
|
47
|
+
int xDiff = aX - bX;
|
|
48
|
+
int yDiff = aY - bY;
|
|
49
|
+
return sqrt(float(xDiff * xDiff + yDiff * yDiff));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#endif
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* MonochromeRectangleDetector.cpp
|
|
4
|
+
* y_wmk
|
|
5
|
+
*
|
|
6
|
+
* Created by Luiz Silva on 09/02/2010.
|
|
7
|
+
* Copyright 2010 y_wmk 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/NotFoundException.h>
|
|
23
|
+
#include <zxing/common/detector/MonochromeRectangleDetector.h>
|
|
24
|
+
#include <sstream>
|
|
25
|
+
|
|
26
|
+
using std::vector;
|
|
27
|
+
using zxing::Ref;
|
|
28
|
+
using zxing::ResultPoint;
|
|
29
|
+
using zxing::TwoInts;
|
|
30
|
+
using zxing::MonochromeRectangleDetector;
|
|
31
|
+
|
|
32
|
+
vector<Ref<ResultPoint> > MonochromeRectangleDetector::detect() {
|
|
33
|
+
int height = image_->getHeight();
|
|
34
|
+
int width = image_->getWidth();
|
|
35
|
+
int halfHeight = height >> 1;
|
|
36
|
+
int halfWidth = width >> 1;
|
|
37
|
+
int deltaY = std::max(1, height / (MAX_MODULES << 3));
|
|
38
|
+
int deltaX = std::max(1, width / (MAX_MODULES << 3));
|
|
39
|
+
|
|
40
|
+
int top = 0;
|
|
41
|
+
int bottom = height;
|
|
42
|
+
int left = 0;
|
|
43
|
+
int right = width;
|
|
44
|
+
Ref<ResultPoint> pointA(findCornerFromCenter(halfWidth, 0, left, right,
|
|
45
|
+
halfHeight, -deltaY, top, bottom, halfWidth >> 1));
|
|
46
|
+
top = (int) pointA->getY() - 1;;
|
|
47
|
+
Ref<ResultPoint> pointB(findCornerFromCenter(halfWidth, -deltaX, left, right,
|
|
48
|
+
halfHeight, 0, top, bottom, halfHeight >> 1));
|
|
49
|
+
left = (int) pointB->getX() - 1;
|
|
50
|
+
Ref<ResultPoint> pointC(findCornerFromCenter(halfWidth, deltaX, left, right,
|
|
51
|
+
halfHeight, 0, top, bottom, halfHeight >> 1));
|
|
52
|
+
right = (int) pointC->getX() + 1;
|
|
53
|
+
Ref<ResultPoint> pointD(findCornerFromCenter(halfWidth, 0, left, right,
|
|
54
|
+
halfHeight, deltaY, top, bottom, halfWidth >> 1));
|
|
55
|
+
bottom = (int) pointD->getY() + 1;
|
|
56
|
+
|
|
57
|
+
// Go try to find point A again with better information -- might have been off at first.
|
|
58
|
+
pointA.reset(findCornerFromCenter(halfWidth, 0, left, right,
|
|
59
|
+
halfHeight, -deltaY, top, bottom, halfWidth >> 2));
|
|
60
|
+
|
|
61
|
+
vector<Ref<ResultPoint> > corners(4);
|
|
62
|
+
corners[0].reset(pointA);
|
|
63
|
+
corners[1].reset(pointB);
|
|
64
|
+
corners[2].reset(pointC);
|
|
65
|
+
corners[3].reset(pointD);
|
|
66
|
+
return corners;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Ref<ResultPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX, int deltaX, int left, int right,
|
|
70
|
+
int centerY, int deltaY, int top, int bottom, int maxWhiteRun) {
|
|
71
|
+
Ref<TwoInts> lastRange(NULL);
|
|
72
|
+
for (int y = centerY, x = centerX;
|
|
73
|
+
y < bottom && y >= top && x < right && x >= left;
|
|
74
|
+
y += deltaY, x += deltaX) {
|
|
75
|
+
Ref<TwoInts> range(NULL);
|
|
76
|
+
if (deltaX == 0) {
|
|
77
|
+
// horizontal slices, up and down
|
|
78
|
+
range = blackWhiteRange(y, maxWhiteRun, left, right, true);
|
|
79
|
+
} else {
|
|
80
|
+
// vertical slices, left and right
|
|
81
|
+
range = blackWhiteRange(x, maxWhiteRun, top, bottom, false);
|
|
82
|
+
}
|
|
83
|
+
if (range == NULL) {
|
|
84
|
+
if (lastRange == NULL) {
|
|
85
|
+
throw NotFoundException("Couldn't find corners (lastRange = NULL) ");
|
|
86
|
+
} else {
|
|
87
|
+
// lastRange was found
|
|
88
|
+
if (deltaX == 0) {
|
|
89
|
+
int lastY = y - deltaY;
|
|
90
|
+
if (lastRange->start < centerX) {
|
|
91
|
+
if (lastRange->end > centerX) {
|
|
92
|
+
// straddle, choose one or the other based on direction
|
|
93
|
+
Ref<ResultPoint> result(new ResultPoint(deltaY > 0 ? lastRange->start : lastRange->end, lastY));
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
Ref<ResultPoint> result(new ResultPoint(lastRange->start, lastY));
|
|
97
|
+
return result;
|
|
98
|
+
} else {
|
|
99
|
+
Ref<ResultPoint> result(new ResultPoint(lastRange->end, lastY));
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
int lastX = x - deltaX;
|
|
104
|
+
if (lastRange->start < centerY) {
|
|
105
|
+
if (lastRange->end > centerY) {
|
|
106
|
+
Ref<ResultPoint> result(new ResultPoint(lastX, deltaX < 0 ? lastRange->start : lastRange->end));
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
Ref<ResultPoint> result(new ResultPoint(lastX, lastRange->start));
|
|
110
|
+
return result;
|
|
111
|
+
} else {
|
|
112
|
+
Ref<ResultPoint> result(new ResultPoint(lastX, lastRange->end));
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
lastRange = range;
|
|
119
|
+
}
|
|
120
|
+
throw NotFoundException("Couldn't find corners");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
Ref<TwoInts> MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim,
|
|
124
|
+
bool horizontal) {
|
|
125
|
+
|
|
126
|
+
int center = (minDim + maxDim) >> 1;
|
|
127
|
+
|
|
128
|
+
// Scan left/up first
|
|
129
|
+
int start = center;
|
|
130
|
+
while (start >= minDim) {
|
|
131
|
+
if (horizontal ? image_->get(start, fixedDimension) : image_->get(fixedDimension, start)) {
|
|
132
|
+
start--;
|
|
133
|
+
} else {
|
|
134
|
+
int whiteRunStart = start;
|
|
135
|
+
do {
|
|
136
|
+
start--;
|
|
137
|
+
} while (start >= minDim && !(horizontal ? image_->get(start, fixedDimension) :
|
|
138
|
+
image_->get(fixedDimension, start)));
|
|
139
|
+
int whiteRunSize = whiteRunStart - start;
|
|
140
|
+
if (start < minDim || whiteRunSize > maxWhiteRun) {
|
|
141
|
+
start = whiteRunStart;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
start++;
|
|
147
|
+
|
|
148
|
+
// Then try right/down
|
|
149
|
+
int end = center;
|
|
150
|
+
while (end < maxDim) {
|
|
151
|
+
if (horizontal ? image_->get(end, fixedDimension) : image_->get(fixedDimension, end)) {
|
|
152
|
+
end++;
|
|
153
|
+
} else {
|
|
154
|
+
int whiteRunStart = end;
|
|
155
|
+
do {
|
|
156
|
+
end++;
|
|
157
|
+
} while (end < maxDim && !(horizontal ? image_->get(end, fixedDimension) :
|
|
158
|
+
image_->get(fixedDimension, end)));
|
|
159
|
+
int whiteRunSize = end - whiteRunStart;
|
|
160
|
+
if (end >= maxDim || whiteRunSize > maxWhiteRun) {
|
|
161
|
+
end = whiteRunStart;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
end--;
|
|
167
|
+
Ref<TwoInts> result(NULL);
|
|
168
|
+
if (end > start) {
|
|
169
|
+
result = new TwoInts;
|
|
170
|
+
result->start = start;
|
|
171
|
+
result->end = end;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
|
|
3
|
+
#ifndef __MONOCHROMERECTANGLEDETECTOR_H__
|
|
4
|
+
#define __MONOCHROMERECTANGLEDETECTOR_H__
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* MonochromeRectangleDetector.h
|
|
8
|
+
* y_wmk
|
|
9
|
+
*
|
|
10
|
+
* Created by Luiz Silva on 09/02/2010.
|
|
11
|
+
* Copyright 2010 y_wmk authors All rights reserved.
|
|
12
|
+
*
|
|
13
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
+
* you may not use this file except in compliance with the License.
|
|
15
|
+
* You may obtain a copy of the License at
|
|
16
|
+
*
|
|
17
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
+
*
|
|
19
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
+
* See the License for the specific language governing permissions and
|
|
23
|
+
* limitations under the License.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
#include <vector>
|
|
27
|
+
#include <zxing/NotFoundException.h>
|
|
28
|
+
#include <zxing/ResultPoint.h>
|
|
29
|
+
#include <zxing/common/BitMatrix.h>
|
|
30
|
+
#include <zxing/common/Counted.h>
|
|
31
|
+
#include <zxing/ResultPoint.h>
|
|
32
|
+
|
|
33
|
+
namespace zxing {
|
|
34
|
+
|
|
35
|
+
struct TwoInts: public Counted {
|
|
36
|
+
int start;
|
|
37
|
+
int end;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
class MonochromeRectangleDetector : public Counted {
|
|
41
|
+
private:
|
|
42
|
+
static const int MAX_MODULES = 32;
|
|
43
|
+
Ref<BitMatrix> image_;
|
|
44
|
+
|
|
45
|
+
public:
|
|
46
|
+
MonochromeRectangleDetector(Ref<BitMatrix> image) : image_(image) { };
|
|
47
|
+
|
|
48
|
+
std::vector<Ref<ResultPoint> > detect();
|
|
49
|
+
|
|
50
|
+
private:
|
|
51
|
+
Ref<ResultPoint> findCornerFromCenter(int centerX, int deltaX, int left, int right,
|
|
52
|
+
int centerY, int deltaY, int top, int bottom, int maxWhiteRun);
|
|
53
|
+
|
|
54
|
+
Ref<TwoInts> blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim,
|
|
55
|
+
bool horizontal);
|
|
56
|
+
|
|
57
|
+
int max(int a, float b) { return (float) a > b ? a : (int) b;};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#endif // __MONOCHROMERECTANGLEDETECTOR_H__
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
|
2
|
+
/*
|
|
3
|
+
* WhiteRectangleDetector.cpp
|
|
4
|
+
* y_wmk
|
|
5
|
+
*
|
|
6
|
+
* Created by Luiz Silva on 09/02/2010.
|
|
7
|
+
* Copyright 2010 y_wmk 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/NotFoundException.h>
|
|
23
|
+
#include <zxing/common/detector/WhiteRectangleDetector.h>
|
|
24
|
+
#include <zxing/common/detector/MathUtils.h>
|
|
25
|
+
#include <sstream>
|
|
26
|
+
|
|
27
|
+
using std::vector;
|
|
28
|
+
using zxing::Ref;
|
|
29
|
+
using zxing::ResultPoint;
|
|
30
|
+
using zxing::WhiteRectangleDetector;
|
|
31
|
+
using zxing::common::detector::MathUtils;
|
|
32
|
+
|
|
33
|
+
// VC++
|
|
34
|
+
using zxing::BitMatrix;
|
|
35
|
+
|
|
36
|
+
int WhiteRectangleDetector::INIT_SIZE = 30;
|
|
37
|
+
int WhiteRectangleDetector::CORR = 1;
|
|
38
|
+
|
|
39
|
+
WhiteRectangleDetector::WhiteRectangleDetector(Ref<BitMatrix> image) : image_(image) {
|
|
40
|
+
width_ = image->getWidth();
|
|
41
|
+
height_ = image->getHeight();
|
|
42
|
+
|
|
43
|
+
leftInit_ = (width_ - INIT_SIZE) >> 1;
|
|
44
|
+
rightInit_ = (width_ + INIT_SIZE) >> 1;
|
|
45
|
+
upInit_ = (height_ - INIT_SIZE) >> 1;
|
|
46
|
+
downInit_ = (height_ + INIT_SIZE) >> 1;
|
|
47
|
+
|
|
48
|
+
if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) {
|
|
49
|
+
throw NotFoundException("Invalid dimensions WhiteRectangleDetector");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
WhiteRectangleDetector::WhiteRectangleDetector(Ref<BitMatrix> image, int initSize, int x, int y) : image_(image) {
|
|
54
|
+
width_ = image->getWidth();
|
|
55
|
+
height_ = image->getHeight();
|
|
56
|
+
|
|
57
|
+
int halfsize = initSize >> 1;
|
|
58
|
+
leftInit_ = x - halfsize;
|
|
59
|
+
rightInit_ = x + halfsize;
|
|
60
|
+
upInit_ = y - halfsize;
|
|
61
|
+
downInit_ = y + halfsize;
|
|
62
|
+
|
|
63
|
+
if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) {
|
|
64
|
+
throw NotFoundException("Invalid dimensions WhiteRectangleDetector");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* <p>
|
|
70
|
+
* Detects a candidate barcode-like rectangular region within an image. It
|
|
71
|
+
* starts around the center of the image, increases the size of the candidate
|
|
72
|
+
* region until it finds a white rectangular region.
|
|
73
|
+
* </p>
|
|
74
|
+
*
|
|
75
|
+
* @return {@link vector<Ref<ResultPoint> >} describing the corners of the rectangular
|
|
76
|
+
* region. The first and last points are opposed on the diagonal, as
|
|
77
|
+
* are the second and third. The first point will be the topmost
|
|
78
|
+
* point and the last, the bottommost. The second point will be
|
|
79
|
+
* leftmost and the third, the rightmost
|
|
80
|
+
* @throws NotFoundException if no Data Matrix Code can be found
|
|
81
|
+
*/
|
|
82
|
+
std::vector<Ref<ResultPoint> > WhiteRectangleDetector::detect() {
|
|
83
|
+
int left = leftInit_;
|
|
84
|
+
int right = rightInit_;
|
|
85
|
+
int up = upInit_;
|
|
86
|
+
int down = downInit_;
|
|
87
|
+
|
|
88
|
+
bool sizeExceeded = false;
|
|
89
|
+
bool aBlackPointFoundOnBorder = true;
|
|
90
|
+
bool atLeastOneBlackPointFoundOnBorder = false;
|
|
91
|
+
|
|
92
|
+
while (aBlackPointFoundOnBorder) {
|
|
93
|
+
aBlackPointFoundOnBorder = false;
|
|
94
|
+
|
|
95
|
+
// .....
|
|
96
|
+
// . |
|
|
97
|
+
// .....
|
|
98
|
+
bool rightBorderNotWhite = true;
|
|
99
|
+
while (rightBorderNotWhite && right < width_) {
|
|
100
|
+
rightBorderNotWhite = containsBlackPoint(up, down, right, false);
|
|
101
|
+
if (rightBorderNotWhite) {
|
|
102
|
+
right++;
|
|
103
|
+
aBlackPointFoundOnBorder = true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (right >= width_) {
|
|
108
|
+
sizeExceeded = true;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// .....
|
|
113
|
+
// . .
|
|
114
|
+
// .___.
|
|
115
|
+
bool bottomBorderNotWhite = true;
|
|
116
|
+
while (bottomBorderNotWhite && down < height_) {
|
|
117
|
+
bottomBorderNotWhite = containsBlackPoint(left, right, down, true);
|
|
118
|
+
if (bottomBorderNotWhite) {
|
|
119
|
+
down++;
|
|
120
|
+
aBlackPointFoundOnBorder = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (down >= height_) {
|
|
125
|
+
sizeExceeded = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// .....
|
|
130
|
+
// | .
|
|
131
|
+
// .....
|
|
132
|
+
bool leftBorderNotWhite = true;
|
|
133
|
+
while (leftBorderNotWhite && left >= 0) {
|
|
134
|
+
leftBorderNotWhite = containsBlackPoint(up, down, left, false);
|
|
135
|
+
if (leftBorderNotWhite) {
|
|
136
|
+
left--;
|
|
137
|
+
aBlackPointFoundOnBorder = true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (left < 0) {
|
|
142
|
+
sizeExceeded = true;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// .___.
|
|
147
|
+
// . .
|
|
148
|
+
// .....
|
|
149
|
+
bool topBorderNotWhite = true;
|
|
150
|
+
while (topBorderNotWhite && up >= 0) {
|
|
151
|
+
topBorderNotWhite = containsBlackPoint(left, right, up, true);
|
|
152
|
+
if (topBorderNotWhite) {
|
|
153
|
+
up--;
|
|
154
|
+
aBlackPointFoundOnBorder = true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (up < 0) {
|
|
159
|
+
sizeExceeded = true;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (aBlackPointFoundOnBorder) {
|
|
164
|
+
atLeastOneBlackPointFoundOnBorder = true;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) {
|
|
169
|
+
|
|
170
|
+
int maxSize = right - left;
|
|
171
|
+
|
|
172
|
+
Ref<ResultPoint> z(NULL);
|
|
173
|
+
//go up right
|
|
174
|
+
for (int i = 1; i < maxSize; i++) {
|
|
175
|
+
z = getBlackPointOnSegment(left, down - i, left + i, down);
|
|
176
|
+
if (z != NULL) {
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (z == NULL) {
|
|
182
|
+
throw NotFoundException("z == NULL");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
Ref<ResultPoint> t(NULL);
|
|
186
|
+
//go down right
|
|
187
|
+
for (int i = 1; i < maxSize; i++) {
|
|
188
|
+
t = getBlackPointOnSegment(left, up + i, left + i, up);
|
|
189
|
+
if (t != NULL) {
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (t == NULL) {
|
|
195
|
+
throw NotFoundException("t == NULL");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
Ref<ResultPoint> x(NULL);
|
|
199
|
+
//go down left
|
|
200
|
+
for (int i = 1; i < maxSize; i++) {
|
|
201
|
+
x = getBlackPointOnSegment(right, up + i, right - i, up);
|
|
202
|
+
if (x != NULL) {
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (x == NULL) {
|
|
208
|
+
throw NotFoundException("x == NULL");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
Ref<ResultPoint> y(NULL);
|
|
212
|
+
//go up left
|
|
213
|
+
for (int i = 1; i < maxSize; i++) {
|
|
214
|
+
y = getBlackPointOnSegment(right, down - i, right - i, down);
|
|
215
|
+
if (y != NULL) {
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (y == NULL) {
|
|
221
|
+
throw NotFoundException("y == NULL");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return centerEdges(y, z, x, t);
|
|
225
|
+
|
|
226
|
+
} else {
|
|
227
|
+
throw NotFoundException("No black point found on border");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
Ref<ResultPoint>
|
|
232
|
+
WhiteRectangleDetector::getBlackPointOnSegment(int aX_, int aY_, int bX_, int bY_) {
|
|
233
|
+
float aX = float(aX_), aY = float(aY_), bX = float(bX_), bY = float(bY_);
|
|
234
|
+
int dist = MathUtils::round(MathUtils::distance(aX, aY, bX, bY));
|
|
235
|
+
float xStep = (bX - aX) / dist;
|
|
236
|
+
float yStep = (bY - aY) / dist;
|
|
237
|
+
|
|
238
|
+
for (int i = 0; i < dist; i++) {
|
|
239
|
+
int x = MathUtils::round(aX + i * xStep);
|
|
240
|
+
int y = MathUtils::round(aY + i * yStep);
|
|
241
|
+
if (image_->get(x, y)) {
|
|
242
|
+
Ref<ResultPoint> point(new ResultPoint(float(x), float(y)));
|
|
243
|
+
return point;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
Ref<ResultPoint> point(NULL);
|
|
247
|
+
return point;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* recenters the points of a constant distance towards the center
|
|
252
|
+
*
|
|
253
|
+
* @param y bottom most point
|
|
254
|
+
* @param z left most point
|
|
255
|
+
* @param x right most point
|
|
256
|
+
* @param t top most point
|
|
257
|
+
* @return {@link vector<Ref<ResultPoint> >} describing the corners of the rectangular
|
|
258
|
+
* region. The first and last points are opposed on the diagonal, as
|
|
259
|
+
* are the second and third. The first point will be the topmost
|
|
260
|
+
* point and the last, the bottommost. The second point will be
|
|
261
|
+
* leftmost and the third, the rightmost
|
|
262
|
+
*/
|
|
263
|
+
vector<Ref<ResultPoint> > WhiteRectangleDetector::centerEdges(Ref<ResultPoint> y, Ref<ResultPoint> z,
|
|
264
|
+
Ref<ResultPoint> x, Ref<ResultPoint> t) {
|
|
265
|
+
|
|
266
|
+
//
|
|
267
|
+
// t t
|
|
268
|
+
// z x
|
|
269
|
+
// x OR z
|
|
270
|
+
// y y
|
|
271
|
+
//
|
|
272
|
+
|
|
273
|
+
float yi = y->getX();
|
|
274
|
+
float yj = y->getY();
|
|
275
|
+
float zi = z->getX();
|
|
276
|
+
float zj = z->getY();
|
|
277
|
+
float xi = x->getX();
|
|
278
|
+
float xj = x->getY();
|
|
279
|
+
float ti = t->getX();
|
|
280
|
+
float tj = t->getY();
|
|
281
|
+
|
|
282
|
+
std::vector<Ref<ResultPoint> > corners(4);
|
|
283
|
+
if (yi < (float)width_/2.0f) {
|
|
284
|
+
Ref<ResultPoint> pointA(new ResultPoint(ti - CORR, tj + CORR));
|
|
285
|
+
Ref<ResultPoint> pointB(new ResultPoint(zi + CORR, zj + CORR));
|
|
286
|
+
Ref<ResultPoint> pointC(new ResultPoint(xi - CORR, xj - CORR));
|
|
287
|
+
Ref<ResultPoint> pointD(new ResultPoint(yi + CORR, yj - CORR));
|
|
288
|
+
corners[0].reset(pointA);
|
|
289
|
+
corners[1].reset(pointB);
|
|
290
|
+
corners[2].reset(pointC);
|
|
291
|
+
corners[3].reset(pointD);
|
|
292
|
+
} else {
|
|
293
|
+
Ref<ResultPoint> pointA(new ResultPoint(ti + CORR, tj + CORR));
|
|
294
|
+
Ref<ResultPoint> pointB(new ResultPoint(zi + CORR, zj - CORR));
|
|
295
|
+
Ref<ResultPoint> pointC(new ResultPoint(xi - CORR, xj + CORR));
|
|
296
|
+
Ref<ResultPoint> pointD(new ResultPoint(yi - CORR, yj - CORR));
|
|
297
|
+
corners[0].reset(pointA);
|
|
298
|
+
corners[1].reset(pointB);
|
|
299
|
+
corners[2].reset(pointC);
|
|
300
|
+
corners[3].reset(pointD);
|
|
301
|
+
}
|
|
302
|
+
return corners;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Determines whether a segment contains a black point
|
|
307
|
+
*
|
|
308
|
+
* @param a min value of the scanned coordinate
|
|
309
|
+
* @param b max value of the scanned coordinate
|
|
310
|
+
* @param fixed value of fixed coordinate
|
|
311
|
+
* @param horizontal set to true if scan must be horizontal, false if vertical
|
|
312
|
+
* @return true if a black point has been found, else false.
|
|
313
|
+
*/
|
|
314
|
+
bool WhiteRectangleDetector::containsBlackPoint(int a, int b, int fixed, bool horizontal) {
|
|
315
|
+
if (horizontal) {
|
|
316
|
+
for (int x = a; x <= b; x++) {
|
|
317
|
+
if (image_->get(x, fixed)) {
|
|
318
|
+
return true;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
} else {
|
|
322
|
+
for (int y = a; y <= b; y++) {
|
|
323
|
+
if (image_->get(fixed, y)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return false;
|
|
330
|
+
}
|