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,159 @@
|
|
1
|
+
/*
|
2
|
+
* DataMask.cpp
|
3
|
+
* zxing
|
4
|
+
*
|
5
|
+
* Created by Christian Brunschen on 19/05/2008.
|
6
|
+
* Copyright 2008 ZXing authors All rights reserved.
|
7
|
+
*
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
* you may not use this file except in compliance with the License.
|
10
|
+
* You may obtain a copy of the License at
|
11
|
+
*
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
*
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
* See the License for the specific language governing permissions and
|
18
|
+
* limitations under the License.
|
19
|
+
*/
|
20
|
+
|
21
|
+
#include <zxing/qrcode/decoder/DataMask.h>
|
22
|
+
|
23
|
+
#include <zxing/common/IllegalArgumentException.h>
|
24
|
+
|
25
|
+
namespace zxing {
|
26
|
+
namespace qrcode {
|
27
|
+
|
28
|
+
using namespace std;
|
29
|
+
|
30
|
+
DataMask::DataMask() {
|
31
|
+
}
|
32
|
+
|
33
|
+
DataMask::~DataMask() {
|
34
|
+
}
|
35
|
+
|
36
|
+
vector<Ref<DataMask> > DataMask::DATA_MASKS;
|
37
|
+
static int N_DATA_MASKS = DataMask::buildDataMasks();
|
38
|
+
|
39
|
+
DataMask &DataMask::forReference(int reference) {
|
40
|
+
if (reference < 0 || reference > 7) {
|
41
|
+
throw IllegalArgumentException("reference must be between 0 and 7");
|
42
|
+
}
|
43
|
+
return *DATA_MASKS[reference];
|
44
|
+
}
|
45
|
+
|
46
|
+
void DataMask::unmaskBitMatrix(BitMatrix& bits, size_t dimension) {
|
47
|
+
for (size_t y = 0; y < dimension; y++) {
|
48
|
+
for (size_t x = 0; x < dimension; x++) {
|
49
|
+
// TODO: check why the coordinates have to be swapped
|
50
|
+
if (isMasked(y, x)) {
|
51
|
+
bits.flip(x, y);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
/**
|
58
|
+
* 000: mask bits for which (x + y) mod 2 == 0
|
59
|
+
*/
|
60
|
+
class DataMask000 : public DataMask {
|
61
|
+
public:
|
62
|
+
bool isMasked(size_t x, size_t y) {
|
63
|
+
// return ((x + y) & 0x01) == 0;
|
64
|
+
return ((x + y) % 2) == 0;
|
65
|
+
}
|
66
|
+
};
|
67
|
+
|
68
|
+
/**
|
69
|
+
* 001: mask bits for which x mod 2 == 0
|
70
|
+
*/
|
71
|
+
class DataMask001 : public DataMask {
|
72
|
+
public:
|
73
|
+
bool isMasked(size_t x, size_t) {
|
74
|
+
// return (x & 0x01) == 0;
|
75
|
+
return (x % 2) == 0;
|
76
|
+
}
|
77
|
+
};
|
78
|
+
|
79
|
+
/**
|
80
|
+
* 010: mask bits for which y mod 3 == 0
|
81
|
+
*/
|
82
|
+
class DataMask010 : public DataMask {
|
83
|
+
public:
|
84
|
+
bool isMasked(size_t, size_t y) {
|
85
|
+
return y % 3 == 0;
|
86
|
+
}
|
87
|
+
};
|
88
|
+
|
89
|
+
/**
|
90
|
+
* 011: mask bits for which (x + y) mod 3 == 0
|
91
|
+
*/
|
92
|
+
class DataMask011 : public DataMask {
|
93
|
+
public:
|
94
|
+
bool isMasked(size_t x, size_t y) {
|
95
|
+
return (x + y) % 3 == 0;
|
96
|
+
}
|
97
|
+
};
|
98
|
+
|
99
|
+
/**
|
100
|
+
* 100: mask bits for which (x/2 + y/3) mod 2 == 0
|
101
|
+
*/
|
102
|
+
class DataMask100 : public DataMask {
|
103
|
+
public:
|
104
|
+
bool isMasked(size_t x, size_t y) {
|
105
|
+
// return (((x >> 1) + (y / 3)) & 0x01) == 0;
|
106
|
+
return (((x >> 1) + (y / 3)) % 2) == 0;
|
107
|
+
}
|
108
|
+
};
|
109
|
+
|
110
|
+
/**
|
111
|
+
* 101: mask bits for which xy mod 2 + xy mod 3 == 0
|
112
|
+
*/
|
113
|
+
class DataMask101 : public DataMask {
|
114
|
+
public:
|
115
|
+
bool isMasked(size_t x, size_t y) {
|
116
|
+
size_t temp = x * y;
|
117
|
+
// return (temp & 0x01) + (temp % 3) == 0;
|
118
|
+
return (temp % 2) + (temp % 3) == 0;
|
119
|
+
|
120
|
+
}
|
121
|
+
};
|
122
|
+
|
123
|
+
/**
|
124
|
+
* 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0
|
125
|
+
*/
|
126
|
+
class DataMask110 : public DataMask {
|
127
|
+
public:
|
128
|
+
bool isMasked(size_t x, size_t y) {
|
129
|
+
size_t temp = x * y;
|
130
|
+
// return (((temp & 0x01) + (temp % 3)) & 0x01) == 0;
|
131
|
+
return (((temp % 2) + (temp % 3)) % 2) == 0;
|
132
|
+
}
|
133
|
+
};
|
134
|
+
|
135
|
+
/**
|
136
|
+
* 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0
|
137
|
+
*/
|
138
|
+
class DataMask111 : public DataMask {
|
139
|
+
public:
|
140
|
+
bool isMasked(size_t x, size_t y) {
|
141
|
+
// return ((((x + y) & 0x01) + ((x * y) % 3)) & 0x01) == 0;
|
142
|
+
return ((((x + y) % 2) + ((x * y) % 3)) % 2) == 0;
|
143
|
+
}
|
144
|
+
};
|
145
|
+
|
146
|
+
int DataMask::buildDataMasks() {
|
147
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask000()));
|
148
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask001()));
|
149
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask010()));
|
150
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask011()));
|
151
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask100()));
|
152
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask101()));
|
153
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask110()));
|
154
|
+
DATA_MASKS.push_back(Ref<DataMask> (new DataMask111()));
|
155
|
+
return DATA_MASKS.size();
|
156
|
+
}
|
157
|
+
|
158
|
+
}
|
159
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#ifndef __DATA_MASK_H__
|
2
|
+
#define __DATA_MASK_H__
|
3
|
+
|
4
|
+
/*
|
5
|
+
* DataMask.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/common/Array.h>
|
24
|
+
#include <zxing/common/Counted.h>
|
25
|
+
#include <zxing/common/BitMatrix.h>
|
26
|
+
|
27
|
+
#include <vector>
|
28
|
+
|
29
|
+
namespace zxing {
|
30
|
+
namespace qrcode {
|
31
|
+
|
32
|
+
class DataMask : public Counted {
|
33
|
+
private:
|
34
|
+
static std::vector<Ref<DataMask> > DATA_MASKS;
|
35
|
+
|
36
|
+
protected:
|
37
|
+
|
38
|
+
public:
|
39
|
+
static int buildDataMasks();
|
40
|
+
DataMask();
|
41
|
+
virtual ~DataMask();
|
42
|
+
void unmaskBitMatrix(BitMatrix& matrix, size_t dimension);
|
43
|
+
virtual bool isMasked(size_t x, size_t y) = 0;
|
44
|
+
static DataMask& forReference(int reference);
|
45
|
+
};
|
46
|
+
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
#endif // __DATA_MASK_H__
|
@@ -0,0 +1,425 @@
|
|
1
|
+
// -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
|
2
|
+
/*
|
3
|
+
* DecodedBitStreamParser.cpp
|
4
|
+
* zxing
|
5
|
+
*
|
6
|
+
* Created by Christian Brunschen on 20/05/2008.
|
7
|
+
* Copyright 2008 ZXing authors All rights reserved.
|
8
|
+
*
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
* you may not use this file except in compliance with the License.
|
11
|
+
* You may obtain a copy of the License at
|
12
|
+
*
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
*
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
* See the License for the specific language governing permissions and
|
19
|
+
* limitations under the License.
|
20
|
+
*/
|
21
|
+
|
22
|
+
#include <zxing/qrcode/decoder/DecodedBitStreamParser.h>
|
23
|
+
#include <zxing/common/CharacterSetECI.h>
|
24
|
+
#include <zxing/FormatException.h>
|
25
|
+
#include <zxing/common/StringUtils.h>
|
26
|
+
#include <iostream>
|
27
|
+
#ifndef NO_ICONV
|
28
|
+
#include <iconv.h>
|
29
|
+
#endif
|
30
|
+
|
31
|
+
// Required for compatibility. TODO: test on Symbian
|
32
|
+
#ifdef ZXING_ICONV_CONST
|
33
|
+
#undef ICONV_CONST
|
34
|
+
#define ICONV_CONST const
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifndef ICONV_CONST
|
38
|
+
#define ICONV_CONST /**/
|
39
|
+
#endif
|
40
|
+
|
41
|
+
using namespace std;
|
42
|
+
using namespace zxing;
|
43
|
+
using namespace zxing::qrcode;
|
44
|
+
using namespace zxing::common;
|
45
|
+
|
46
|
+
const char DecodedBitStreamParser::ALPHANUMERIC_CHARS[] =
|
47
|
+
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
|
48
|
+
'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
|
49
|
+
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
50
|
+
'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':'
|
51
|
+
};
|
52
|
+
|
53
|
+
namespace {int GB2312_SUBSET = 1;}
|
54
|
+
|
55
|
+
void DecodedBitStreamParser::append(std::string &result,
|
56
|
+
string const& in,
|
57
|
+
const char *src) {
|
58
|
+
append(result, (char const*)in.c_str(), in.length(), src);
|
59
|
+
}
|
60
|
+
|
61
|
+
void DecodedBitStreamParser::append(std::string &result,
|
62
|
+
const char *bufIn,
|
63
|
+
size_t nIn,
|
64
|
+
const char *src) {
|
65
|
+
#ifndef NO_ICONV
|
66
|
+
if (nIn == 0) {
|
67
|
+
return;
|
68
|
+
}
|
69
|
+
|
70
|
+
iconv_t cd = iconv_open(StringUtils::UTF8, src);
|
71
|
+
if (cd == (iconv_t)-1) {
|
72
|
+
result.append((const char *)bufIn, nIn);
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
|
76
|
+
const int maxOut = 4 * nIn + 1;
|
77
|
+
char* bufOut = new char[maxOut];
|
78
|
+
|
79
|
+
ICONV_CONST char *fromPtr = (ICONV_CONST char *)bufIn;
|
80
|
+
size_t nFrom = nIn;
|
81
|
+
char *toPtr = (char *)bufOut;
|
82
|
+
size_t nTo = maxOut;
|
83
|
+
|
84
|
+
while (nFrom > 0) {
|
85
|
+
size_t oneway = iconv(cd, &fromPtr, &nFrom, &toPtr, &nTo);
|
86
|
+
if (oneway == (size_t)(-1)) {
|
87
|
+
iconv_close(cd);
|
88
|
+
delete[] bufOut;
|
89
|
+
throw ReaderException("error converting characters");
|
90
|
+
}
|
91
|
+
}
|
92
|
+
iconv_close(cd);
|
93
|
+
|
94
|
+
int nResult = maxOut - nTo;
|
95
|
+
bufOut[nResult] = '\0';
|
96
|
+
result.append((const char *)bufOut);
|
97
|
+
delete[] bufOut;
|
98
|
+
#else
|
99
|
+
result.append((const char *)bufIn, nIn);
|
100
|
+
#endif
|
101
|
+
}
|
102
|
+
|
103
|
+
void DecodedBitStreamParser::decodeHanziSegment(Ref<BitSource> bits_,
|
104
|
+
string& result,
|
105
|
+
int count) {
|
106
|
+
BitSource& bits (*bits_);
|
107
|
+
// Don't crash trying to read more bits than we have available.
|
108
|
+
if (count * 13 > bits.available()) {
|
109
|
+
throw FormatException();
|
110
|
+
}
|
111
|
+
|
112
|
+
// Each character will require 2 bytes. Read the characters as 2-byte pairs
|
113
|
+
// and decode as GB2312 afterwards
|
114
|
+
size_t nBytes = 2 * count;
|
115
|
+
char* buffer = new char[nBytes];
|
116
|
+
int offset = 0;
|
117
|
+
while (count > 0) {
|
118
|
+
// Each 13 bits encodes a 2-byte character
|
119
|
+
int twoBytes = bits.readBits(13);
|
120
|
+
int assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060);
|
121
|
+
if (assembledTwoBytes < 0x003BF) {
|
122
|
+
// In the 0xA1A1 to 0xAAFE range
|
123
|
+
assembledTwoBytes += 0x0A1A1;
|
124
|
+
} else {
|
125
|
+
// In the 0xB0A1 to 0xFAFE range
|
126
|
+
assembledTwoBytes += 0x0A6A1;
|
127
|
+
}
|
128
|
+
buffer[offset] = (char) ((assembledTwoBytes >> 8) & 0xFF);
|
129
|
+
buffer[offset + 1] = (char) (assembledTwoBytes & 0xFF);
|
130
|
+
offset += 2;
|
131
|
+
count--;
|
132
|
+
}
|
133
|
+
|
134
|
+
try {
|
135
|
+
append(result, buffer, nBytes, StringUtils::GB2312);
|
136
|
+
} catch (ReaderException const& ignored) {
|
137
|
+
(void)ignored;
|
138
|
+
delete [] buffer;
|
139
|
+
throw FormatException();
|
140
|
+
}
|
141
|
+
|
142
|
+
delete [] buffer;
|
143
|
+
}
|
144
|
+
|
145
|
+
void DecodedBitStreamParser::decodeKanjiSegment(Ref<BitSource> bits, std::string &result, int count) {
|
146
|
+
// Each character will require 2 bytes. Read the characters as 2-byte pairs
|
147
|
+
// and decode as Shift_JIS afterwards
|
148
|
+
size_t nBytes = 2 * count;
|
149
|
+
char* buffer = new char[nBytes];
|
150
|
+
int offset = 0;
|
151
|
+
while (count > 0) {
|
152
|
+
// Each 13 bits encodes a 2-byte character
|
153
|
+
|
154
|
+
int twoBytes = bits->readBits(13);
|
155
|
+
int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0);
|
156
|
+
if (assembledTwoBytes < 0x01F00) {
|
157
|
+
// In the 0x8140 to 0x9FFC range
|
158
|
+
assembledTwoBytes += 0x08140;
|
159
|
+
} else {
|
160
|
+
// In the 0xE040 to 0xEBBF range
|
161
|
+
assembledTwoBytes += 0x0C140;
|
162
|
+
}
|
163
|
+
buffer[offset] = (char)(assembledTwoBytes >> 8);
|
164
|
+
buffer[offset + 1] = (char)assembledTwoBytes;
|
165
|
+
offset += 2;
|
166
|
+
count--;
|
167
|
+
}
|
168
|
+
try {
|
169
|
+
append(result, buffer, nBytes, StringUtils::SHIFT_JIS);
|
170
|
+
} catch (ReaderException const& ignored) {
|
171
|
+
(void)ignored;
|
172
|
+
delete [] buffer;
|
173
|
+
throw FormatException();
|
174
|
+
}
|
175
|
+
delete[] buffer;
|
176
|
+
}
|
177
|
+
|
178
|
+
void DecodedBitStreamParser::decodeByteSegment(Ref<BitSource> bits_,
|
179
|
+
string& result,
|
180
|
+
int count,
|
181
|
+
CharacterSetECI* currentCharacterSetECI,
|
182
|
+
ArrayRef< ArrayRef<char> >& byteSegments,
|
183
|
+
Hashtable const& hints) {
|
184
|
+
int nBytes = count;
|
185
|
+
BitSource& bits (*bits_);
|
186
|
+
// Don't crash trying to read more bits than we have available.
|
187
|
+
if (count << 3 > bits.available()) {
|
188
|
+
throw FormatException();
|
189
|
+
}
|
190
|
+
|
191
|
+
ArrayRef<char> bytes_ (count);
|
192
|
+
char* readBytes = &(*bytes_)[0];
|
193
|
+
for (int i = 0; i < count; i++) {
|
194
|
+
readBytes[i] = (char) bits.readBits(8);
|
195
|
+
}
|
196
|
+
string encoding;
|
197
|
+
if (currentCharacterSetECI == 0) {
|
198
|
+
// The spec isn't clear on this mode; see
|
199
|
+
// section 6.4.5: t does not say which encoding to assuming
|
200
|
+
// upon decoding. I have seen ISO-8859-1 used as well as
|
201
|
+
// Shift_JIS -- without anything like an ECI designator to
|
202
|
+
// give a hint.
|
203
|
+
encoding = StringUtils::guessEncoding(readBytes, count, hints);
|
204
|
+
} else {
|
205
|
+
encoding = currentCharacterSetECI->name();
|
206
|
+
}
|
207
|
+
try {
|
208
|
+
append(result, readBytes, nBytes, encoding.c_str());
|
209
|
+
} catch (ReaderException const& ignored) {
|
210
|
+
(void)ignored;
|
211
|
+
throw FormatException();
|
212
|
+
}
|
213
|
+
byteSegments->values().push_back(bytes_);
|
214
|
+
}
|
215
|
+
|
216
|
+
void DecodedBitStreamParser::decodeNumericSegment(Ref<BitSource> bits, std::string &result, int count) {
|
217
|
+
int nBytes = count;
|
218
|
+
char* bytes = new char[nBytes];
|
219
|
+
int i = 0;
|
220
|
+
// Read three digits at a time
|
221
|
+
while (count >= 3) {
|
222
|
+
// Each 10 bits encodes three digits
|
223
|
+
if (bits->available() < 10) {
|
224
|
+
throw ReaderException("format exception");
|
225
|
+
}
|
226
|
+
int threeDigitsBits = bits->readBits(10);
|
227
|
+
if (threeDigitsBits >= 1000) {
|
228
|
+
ostringstream s;
|
229
|
+
s << "Illegal value for 3-digit unit: " << threeDigitsBits;
|
230
|
+
delete[] bytes;
|
231
|
+
throw ReaderException(s.str().c_str());
|
232
|
+
}
|
233
|
+
bytes[i++] = ALPHANUMERIC_CHARS[threeDigitsBits / 100];
|
234
|
+
bytes[i++] = ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10];
|
235
|
+
bytes[i++] = ALPHANUMERIC_CHARS[threeDigitsBits % 10];
|
236
|
+
count -= 3;
|
237
|
+
}
|
238
|
+
if (count == 2) {
|
239
|
+
if (bits->available() < 7) {
|
240
|
+
throw ReaderException("format exception");
|
241
|
+
}
|
242
|
+
// Two digits left over to read, encoded in 7 bits
|
243
|
+
int twoDigitsBits = bits->readBits(7);
|
244
|
+
if (twoDigitsBits >= 100) {
|
245
|
+
ostringstream s;
|
246
|
+
s << "Illegal value for 2-digit unit: " << twoDigitsBits;
|
247
|
+
delete[] bytes;
|
248
|
+
throw ReaderException(s.str().c_str());
|
249
|
+
}
|
250
|
+
bytes[i++] = ALPHANUMERIC_CHARS[twoDigitsBits / 10];
|
251
|
+
bytes[i++] = ALPHANUMERIC_CHARS[twoDigitsBits % 10];
|
252
|
+
} else if (count == 1) {
|
253
|
+
if (bits->available() < 4) {
|
254
|
+
throw ReaderException("format exception");
|
255
|
+
}
|
256
|
+
// One digit left over to read
|
257
|
+
int digitBits = bits->readBits(4);
|
258
|
+
if (digitBits >= 10) {
|
259
|
+
ostringstream s;
|
260
|
+
s << "Illegal value for digit unit: " << digitBits;
|
261
|
+
delete[] bytes;
|
262
|
+
throw ReaderException(s.str().c_str());
|
263
|
+
}
|
264
|
+
bytes[i++] = ALPHANUMERIC_CHARS[digitBits];
|
265
|
+
}
|
266
|
+
append(result, bytes, nBytes, StringUtils::ASCII);
|
267
|
+
delete[] bytes;
|
268
|
+
}
|
269
|
+
|
270
|
+
char DecodedBitStreamParser::toAlphaNumericChar(size_t value) {
|
271
|
+
if (value >= sizeof(DecodedBitStreamParser::ALPHANUMERIC_CHARS)) {
|
272
|
+
throw FormatException();
|
273
|
+
}
|
274
|
+
return ALPHANUMERIC_CHARS[value];
|
275
|
+
}
|
276
|
+
|
277
|
+
void DecodedBitStreamParser::decodeAlphanumericSegment(Ref<BitSource> bits_,
|
278
|
+
string& result,
|
279
|
+
int count,
|
280
|
+
bool fc1InEffect) {
|
281
|
+
BitSource& bits (*bits_);
|
282
|
+
ostringstream bytes;
|
283
|
+
// Read two characters at a time
|
284
|
+
while (count > 1) {
|
285
|
+
if (bits.available() < 11) {
|
286
|
+
throw FormatException();
|
287
|
+
}
|
288
|
+
int nextTwoCharsBits = bits.readBits(11);
|
289
|
+
bytes << toAlphaNumericChar(nextTwoCharsBits / 45);
|
290
|
+
bytes << toAlphaNumericChar(nextTwoCharsBits % 45);
|
291
|
+
count -= 2;
|
292
|
+
}
|
293
|
+
if (count == 1) {
|
294
|
+
// special case: one character left
|
295
|
+
if (bits.available() < 6) {
|
296
|
+
throw FormatException();
|
297
|
+
}
|
298
|
+
bytes << toAlphaNumericChar(bits.readBits(6));
|
299
|
+
}
|
300
|
+
// See section 6.4.8.1, 6.4.8.2
|
301
|
+
string s = bytes.str();
|
302
|
+
if (fc1InEffect) {
|
303
|
+
// We need to massage the result a bit if in an FNC1 mode:
|
304
|
+
ostringstream r;
|
305
|
+
for (size_t i = 0; i < s.length(); i++) {
|
306
|
+
if (s[i] != '%') {
|
307
|
+
r << s[i];
|
308
|
+
} else {
|
309
|
+
if (i < s.length() - 1 && s[i + 1] == '%') {
|
310
|
+
// %% is rendered as %
|
311
|
+
r << s[i++];
|
312
|
+
} else {
|
313
|
+
// In alpha mode, % should be converted to FNC1 separator 0x1D
|
314
|
+
r << (char)0x1D;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
}
|
318
|
+
s = r.str();
|
319
|
+
}
|
320
|
+
append(result, s, StringUtils::ASCII);
|
321
|
+
}
|
322
|
+
|
323
|
+
namespace {
|
324
|
+
int parseECIValue(BitSource& bits) {
|
325
|
+
int firstByte = bits.readBits(8);
|
326
|
+
if ((firstByte & 0x80) == 0) {
|
327
|
+
// just one byte
|
328
|
+
return firstByte & 0x7F;
|
329
|
+
}
|
330
|
+
if ((firstByte & 0xC0) == 0x80) {
|
331
|
+
// two bytes
|
332
|
+
int secondByte = bits.readBits(8);
|
333
|
+
return ((firstByte & 0x3F) << 8) | secondByte;
|
334
|
+
}
|
335
|
+
if ((firstByte & 0xE0) == 0xC0) {
|
336
|
+
// three bytes
|
337
|
+
int secondThirdBytes = bits.readBits(16);
|
338
|
+
return ((firstByte & 0x1F) << 16) | secondThirdBytes;
|
339
|
+
}
|
340
|
+
throw FormatException();
|
341
|
+
}
|
342
|
+
}
|
343
|
+
|
344
|
+
Ref<DecoderResult>
|
345
|
+
DecodedBitStreamParser::decode(ArrayRef<char> bytes,
|
346
|
+
Version* version,
|
347
|
+
ErrorCorrectionLevel const& ecLevel,
|
348
|
+
Hashtable const& hints) {
|
349
|
+
Ref<BitSource> bits_ (new BitSource(bytes));
|
350
|
+
BitSource& bits (*bits_);
|
351
|
+
string result;
|
352
|
+
result.reserve(50);
|
353
|
+
ArrayRef< ArrayRef<char> > byteSegments (0);
|
354
|
+
try {
|
355
|
+
CharacterSetECI* currentCharacterSetECI = 0;
|
356
|
+
bool fc1InEffect = false;
|
357
|
+
Mode* mode = 0;
|
358
|
+
do {
|
359
|
+
// While still another segment to read...
|
360
|
+
if (bits.available() < 4) {
|
361
|
+
// OK, assume we're done. Really, a TERMINATOR mode should have been recorded here
|
362
|
+
mode = &Mode::TERMINATOR;
|
363
|
+
} else {
|
364
|
+
try {
|
365
|
+
mode = &Mode::forBits(bits.readBits(4)); // mode is encoded by 4 bits
|
366
|
+
} catch (IllegalArgumentException const& iae) {
|
367
|
+
throw iae;
|
368
|
+
// throw FormatException.getFormatInstance();
|
369
|
+
}
|
370
|
+
}
|
371
|
+
if (mode != &Mode::TERMINATOR) {
|
372
|
+
if ((mode == &Mode::FNC1_FIRST_POSITION) || (mode == &Mode::FNC1_SECOND_POSITION)) {
|
373
|
+
// We do little with FNC1 except alter the parsed result a bit according to the spec
|
374
|
+
fc1InEffect = true;
|
375
|
+
} else if (mode == &Mode::STRUCTURED_APPEND) {
|
376
|
+
if (bits.available() < 16) {
|
377
|
+
throw FormatException();
|
378
|
+
}
|
379
|
+
// not really supported; all we do is ignore it
|
380
|
+
// Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue
|
381
|
+
bits.readBits(16);
|
382
|
+
} else if (mode == &Mode::ECI) {
|
383
|
+
// Count doesn't apply to ECI
|
384
|
+
int value = parseECIValue(bits);
|
385
|
+
currentCharacterSetECI = CharacterSetECI::getCharacterSetECIByValue(value);
|
386
|
+
if (currentCharacterSetECI == 0) {
|
387
|
+
throw FormatException();
|
388
|
+
}
|
389
|
+
} else {
|
390
|
+
// First handle Hanzi mode which does not start with character count
|
391
|
+
if (mode == &Mode::HANZI) {
|
392
|
+
//chinese mode contains a sub set indicator right after mode indicator
|
393
|
+
int subset = bits.readBits(4);
|
394
|
+
int countHanzi = bits.readBits(mode->getCharacterCountBits(version));
|
395
|
+
if (subset == GB2312_SUBSET) {
|
396
|
+
decodeHanziSegment(bits_, result, countHanzi);
|
397
|
+
}
|
398
|
+
} else {
|
399
|
+
// "Normal" QR code modes:
|
400
|
+
// How many characters will follow, encoded in this mode?
|
401
|
+
int count = bits.readBits(mode->getCharacterCountBits(version));
|
402
|
+
if (mode == &Mode::NUMERIC) {
|
403
|
+
decodeNumericSegment(bits_, result, count);
|
404
|
+
} else if (mode == &Mode::ALPHANUMERIC) {
|
405
|
+
decodeAlphanumericSegment(bits_, result, count, fc1InEffect);
|
406
|
+
} else if (mode == &Mode::BYTE) {
|
407
|
+
decodeByteSegment(bits_, result, count, currentCharacterSetECI, byteSegments, hints);
|
408
|
+
} else if (mode == &Mode::KANJI) {
|
409
|
+
decodeKanjiSegment(bits_, result, count);
|
410
|
+
} else {
|
411
|
+
throw FormatException();
|
412
|
+
}
|
413
|
+
}
|
414
|
+
}
|
415
|
+
}
|
416
|
+
} while (mode != &Mode::TERMINATOR);
|
417
|
+
} catch (IllegalArgumentException const& iae) {
|
418
|
+
(void)iae;
|
419
|
+
// from readBits() calls
|
420
|
+
throw FormatException();
|
421
|
+
}
|
422
|
+
|
423
|
+
return Ref<DecoderResult>(new DecoderResult(bytes, Ref<String>(new String(result)), byteSegments, (string)ecLevel));
|
424
|
+
}
|
425
|
+
|