rhodes 2.4.1 → 3.0.0.beta.1
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.
- data/CHANGELOG +7 -0
- data/Rakefile +7 -36
- data/doc/build.txt +48 -22
- data/doc/device-caps.txt +130 -1
- data/doc/rhom.txt +9 -3
- data/doc/test-log-debug.txt +5 -2
- data/lib/extensions/barcode/ext/barcode/platform/android/Rakefile +40 -20
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/AUTHORS +58 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/CHANGES +266 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/COPYING +201 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/README +11 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/ext_build.files +173 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/jni/src/barcode.cpp +34 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BarcodeFormat.java +103 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Binarizer.java +80 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BinaryBitmap.java +128 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ChecksumException.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/DecodeHintType.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/EncodeHintType.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/FormatException.java +38 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/LuminanceSource.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatReader.java +166 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatWriter.java +65 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/NotFoundException.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Reader.java +64 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ReaderException.java +98 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Result.java +143 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultMetadataType.java +109 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPoint.java +127 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPointCallback.java +29 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Writer.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/WriterException.java +35 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AbstractDoCoMoResultParser.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookAUResultParser.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookParsedResult.java +122 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BizcardResultParser.java +94 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java +46 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/CalendarParsedResult.java +134 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressParsedResult.java +61 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressResultParser.java +64 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductParsedResult.java +195 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductResultParser.java +199 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoParsedResult.java +132 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoResultParser.java +77 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNParsedResult.java +39 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNResultParser.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResult.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResultType.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductParsedResult.java +49 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductResultParser.java +66 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ResultParser.java +319 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSMMSResultParser.java +107 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSParsedResult.java +104 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSTOMMSTOResultParser.java +57 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelParsedResult.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelResultParser.java +44 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TextParsedResult.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIParsedResult.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIResultParser.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URLTOResultParser.java +47 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VCardResultParser.java +346 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VEventResultParser.java +54 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiParsedResult.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiResultParser.java +50 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/AbstractNDEFResultParser.java +45 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFRecord.java +87 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterParsedResult.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterResultParser.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFTextResultParser.java +57 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFURIResultParser.java +95 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitArray.java +247 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitMatrix.java +226 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitSource.java +97 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/CharacterSetECI.java +110 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Collections.java +53 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Comparator.java +27 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DecoderResult.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DefaultGridSampler.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DetectorResult.java +46 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/ECI.java +52 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GlobalHistogramBinarizer.java +196 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GridSampler.java +171 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/HybridBinarizer.java +185 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/PerspectiveTransform.java +148 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/StringUtils.java +191 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/MonochromeRectangleDetector.java +209 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/WhiteRectangleDetector.java +316 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256.java +139 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256Poly.java +263 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java +194 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonException.java +31 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/DataMatrixReader.java +161 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +446 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DataBlock.java +118 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java +462 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Decoder.java +134 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Version.java +242 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/detector/Detector.java +348 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/ByQuadrantReader.java +96 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java +156 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/MultipleBarcodeReader.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/QRCodeMultiReader.java +80 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiDetector.java +72 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java +324 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/CodaBarReader.java +263 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Reader.java +473 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Writer.java +73 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Reader.java +333 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Writer.java +82 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code93Reader.java +273 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Reader.java +135 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Writer.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Reader.java +72 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Writer.java +76 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EANManufacturerOrgSupport.java +170 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFReader.java +348 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFWriter.java +68 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatOneDReader.java +109 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatUPCEANReader.java +113 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/OneDReader.java +297 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCAReader.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANExtensionSupport.java +186 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANReader.java +355 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANWriter.java +104 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEReader.java +153 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/AbstractRSSReader.java +110 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/DataCharacter.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/FinderPattern.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/Pair.java +41 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSS14Reader.java +494 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSSUtils.java +155 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/ExpandedPair.java +68 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java +578 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java +47 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java +55 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java +66 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java +76 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java +106 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java +56 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java +56 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java +81 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java +58 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java +85 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java +60 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java +69 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java +52 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java +44 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java +285 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java +414 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/PDF417Reader.java +79 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/BitMatrixParser.java +1163 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java +629 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/Decoder.java +150 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/detector/Detector.java +498 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeReader.java +166 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeWriter.java +108 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java +203 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataBlock.java +123 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataMask.java +155 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java +261 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Decoder.java +148 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +86 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/FormatInformation.java +171 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Mode.java +112 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Version.java +586 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPattern.java +48 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +279 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/Detector.java +400 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPattern.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java +585 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternInfo.java +49 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/BlockPair.java +37 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/ByteMatrix.java +97 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/Encoder.java +557 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MaskUtil.java +217 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MatrixUtil.java +524 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/QRCode.java +239 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/Barcode.java +63 -0
- data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/RhoLuminanceSource.java +75 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/Barcode.xcodeproj/project.pbxproj +74 -318
- data/lib/extensions/barcode/ext/barcode/platform/iphone/Classes/barcode.m +70 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/COPYING +27 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h +105 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h +60 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImage.h +69 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h +51 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h +142 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h +118 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h +100 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h +33 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h +71 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar.h +1476 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h +201 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h +187 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Image.h +321 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h +130 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h +223 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h +162 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h +529 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Video.h +170 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Window.h +136 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/LICENSE +504 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/README +59 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-back.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-help.html +88 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-helpicons.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-samples.png +0 -0
- data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/libzbar.a +0 -0
- data/lib/extensions/debugger/debugger.rb +215 -67
- data/lib/extensions/nfc/ext/nfc/platform/android/AndroidManifest.xml +1 -1
- data/lib/extensions/nfc/ext/nfc/platform/android/src/com/nfc/Nfc.java +14 -2
- data/lib/extensions/timeout/timeout.rb +114 -0
- data/lib/framework/rho/render.rb +14 -16
- data/lib/framework/rho/rho.rb +38 -14
- data/lib/framework/rho/rhoapplication.rb +1 -1
- data/lib/framework/rho/rhocontroller.rb +3 -3
- data/lib/framework/rho/rhofsconnector.rb +18 -6
- data/lib/framework/rho/rhoviewhelpers.rb +1 -1
- data/lib/framework/rhoappmanifest.rb +44 -0
- data/lib/framework/rhodes.rb +1 -1
- data/lib/framework/rhoframework.rb +31 -11
- data/lib/framework/rholang/localization_simplified.rb +10 -6
- data/lib/framework/rhom/rhom_object_factory.rb +3 -3
- data/lib/framework/version.rb +1 -1
- data/lib/rhodes.rb +1 -1
- data/platform/android/Rhodes/AndroidManifest.xml +2 -2
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesApplication.h +32 -8
- data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +21 -21
- data/platform/android/Rhodes/jni/src/rhocryptimpl.cpp +1 -0
- data/platform/android/Rhodes/jni/src/rhodes.cpp +21 -9
- data/platform/android/Rhodes/jni/src/sslimpl.cpp +1 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +7 -6
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +19 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoCryptImpl.java +2 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +24 -15
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +39 -47
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +113 -106
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java +11 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/StatusNotification.java +49 -0
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +1 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java +5 -1
- data/platform/android/build/RhodesSRC_build.files +1 -0
- data/platform/android/build/android.rake +93 -6
- data/platform/bb/RubyVM/src/com/rho/RhodesApp.java +5 -4
- data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +10 -0
- data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +16 -15
- data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +2 -2
- data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +21 -19
- data/platform/bb/rhodes/src/com/rho/BrowserAdapter5.java +2 -2
- data/platform/bb/rhodes/src/com/rho/rubyext/System.java +6 -1
- data/platform/bb/rhodes/src/com/rho/rubyext/WebView.java +10 -3
- data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -1
- data/platform/iphone/Classes/SimpleMainView.m +5 -5
- data/platform/iphone/Info.plist +1 -1
- data/platform/iphone/rbuild/iphone.rake +30 -1
- data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +12 -0
- data/platform/shared/SyncClient/SyncClient.cpp +136 -20
- data/platform/shared/SyncClient/SyncClient.h +17 -0
- data/platform/shared/common/AppMenu.cpp +6 -1
- data/platform/shared/common/RhoConf.cpp +13 -1
- data/platform/shared/common/RhoConf.h +3 -1
- data/platform/shared/common/RhoDefs.h +10 -0
- data/platform/shared/common/RhoFile.cpp +15 -0
- data/platform/shared/common/RhoFile.h +1 -0
- data/platform/shared/common/RhodesApp.cpp +16 -3
- data/platform/shared/common/RhodesApp.h +1 -0
- data/platform/shared/common/RhodesAppBase.cpp +102 -62
- data/platform/shared/common/RhodesAppBase.h +7 -1
- data/platform/shared/curl/lib/rhossl.c +1 -0
- data/platform/shared/db/DBAdapter.cpp +14 -2
- data/platform/shared/logging/RhoLogConf.cpp +21 -0
- data/platform/shared/logging/RhoLogConf.h +11 -0
- data/platform/shared/logging/RhoLogSink.cpp +24 -0
- data/platform/shared/logging/RhoLogSink.h +20 -1
- data/platform/shared/net/HttpServer.cpp +8 -6
- data/platform/shared/net/RawSocket.cpp +130 -0
- data/platform/shared/net/RawSocket.h +74 -0
- data/platform/shared/ruby/ext/rho/rhoruby.c +37 -1
- data/platform/shared/ruby/ext/rho/rhosupport.c +74 -21
- data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +9 -1
- data/platform/shared/ruby/vm_eval.c +4 -3
- data/platform/shared/sync/SyncEngine.cpp +11 -12
- data/platform/shared/sync/SyncEngine.h +2 -2
- data/platform/shared/sync/SyncNotify.cpp +41 -13
- data/platform/shared/sync/SyncNotify.h +20 -3
- data/platform/shared/sync/SyncSource.cpp +21 -19
- data/platform/shared/sync/SyncThread.cpp +11 -1
- data/platform/shared/sync/SyncThread.h +3 -0
- data/platform/shared/test/test_helper.cpp +7 -0
- data/platform/win32/RhoSimulator/QtCore4.dll +0 -0
- data/platform/win32/RhoSimulator/QtGui4.dll +0 -0
- data/platform/win32/RhoSimulator/QtNetwork4.dll +0 -0
- data/platform/win32/RhoSimulator/QtWebKit4.dll +0 -0
- data/platform/win32/RhoSimulator/imageformats/qgif4.dll +0 -0
- data/platform/win32/RhoSimulator/imageformats/qjpeg4.dll +0 -0
- data/platform/win32/RhoSimulator/rhosimulator.exe +0 -0
- data/platform/wm/RhoLib/RhoLib.vcproj +762 -14
- data/platform/wm/build/wm.rake +87 -10
- data/platform/wm/rhodes.sln +155 -72
- data/platform/wm/rhodes/MainWindow.cpp +5 -2
- data/platform/wm/rhodes/MainWindow.h +9 -1
- data/platform/wm/rhodes/RhoNativeViewManager.cpp +4 -0
- data/platform/wm/rhodes/Rhodes.cpp +60 -6
- data/platform/wm/rhodes/emulator/ExternalWebView.cpp +20 -0
- data/platform/wm/rhodes/emulator/ExternalWebView.h +23 -0
- data/platform/wm/rhodes/emulator/ExternalWebView.ui +46 -0
- data/platform/wm/rhodes/emulator/MainWindowCallback.h +18 -0
- data/platform/wm/rhodes/emulator/MainWindowProxy.cpp +268 -0
- data/platform/wm/rhodes/emulator/MainWindowProxy.h +34 -0
- data/platform/wm/rhodes/emulator/MainWindowQt.cpp +345 -0
- data/platform/wm/rhodes/emulator/MainWindowQt.h +118 -0
- data/platform/wm/rhodes/emulator/NativeToolbarQt.cpp +57 -0
- data/platform/wm/rhodes/emulator/NativeToolbarQt.h +52 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.cpp +219 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.h +62 -0
- data/platform/wm/rhodes/emulator/QtMainWindow.ui +122 -0
- data/platform/wm/rhodes/{RhoCryptImpl.cpp → rho/common/RhoCryptImpl.cpp} +0 -0
- data/platform/wm/rhodes/{RhoCryptImpl.h → rho/common/RhoCryptImpl.h} +0 -0
- data/platform/wm/rhodes/rho/rubyext/NativeToolbar.cpp +2 -86
- data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.cpp +87 -0
- data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.h +6 -0
- data/platform/wm/rhodes/rho/rubyext/SystemImpl.cpp +60 -0
- data/platform/wm/rhodes/rhodes.vcproj +4025 -365
- data/platform/wm/rhodes/signature/Signature.cpp +29 -13
- data/platform/wm/rubylib/rubylib.vcproj +1167 -195
- data/platform/wm/shttpd/shttpd.vcproj +4 -4
- data/platform/wm/sqlite3/sqlite3.vcproj +441 -13
- data/platform/wm/syncengine/syncengine.vcproj +443 -15
- data/platform/wm/tcmalloc/tcmalloc.vcproj +0 -154
- data/platform/wm/tools/detool/LogServer.cpp +150 -0
- data/platform/wm/tools/detool/LogServer.h +23 -0
- data/platform/wm/tools/detool/detool.cpp +42 -4
- data/platform/wm/tools/detool/detool.vcproj +10 -1
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.Libraries.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Dynamic.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.Core.dll +0 -0
- data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.dll +0 -0
- data/platform/wp7/RhoAppRunner/Program.cs +20 -3
- data/platform/wp7/RhoLogServer/Program.cs +22 -0
- data/platform/wp7/RhoLogServer/Properties/AssemblyInfo.cs +36 -0
- data/platform/wp7/RhoLogServer/RhoLogServer.csproj +65 -0
- data/platform/wp7/RhoLogServer/SocketServer.cs +210 -0
- data/platform/wp7/RhoRubyExtGen/RhoAsyncHttp.cs +6 -0
- data/platform/wp7/RhoRubyLib/Initializers.Generated.cs +3 -2
- data/platform/wp7/RhoRubyLib/RhoRuby.cs +82 -0
- data/platform/wp7/RhoRubyLib/RhoRubyLib.csproj +7 -5
- data/platform/wp7/RhoRubyLib/WP_PlatformAdaptationLayer.cs +1 -1
- data/platform/wp7/RhoRubyLib/common/RhoParams.cs +1 -1
- data/platform/wp7/RhoRubyLib/common/ThreadQueue.cs +4 -1
- data/platform/wp7/RhoRubyLib/db/DBAdapter.cs +2 -2
- data/platform/wp7/RhoRubyLib/logging/IRhoLogSink.cs +1 -1
- data/platform/wp7/RhoRubyLib/logging/RhoEmptyLogger.cs +30 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogConf.cs +10 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogFileSink.cs +6 -1
- data/platform/wp7/RhoRubyLib/logging/RhoLogServerSink.cs +56 -0
- data/platform/wp7/RhoRubyLib/logging/RhoLogger.cs +24 -11
- data/platform/wp7/RhoRubyLib/net/AsyncHttp.cs +57 -14
- data/platform/wp7/RhoRubyLib/net/NetRequest.cs +32 -9
- data/platform/wp7/RhoRubyLib/rubyext/RhoAsyncHttp.cs +7 -0
- data/platform/wp7/RhoRubyLib/rubyext/RhoKernelOps.cs +6 -0
- data/platform/wp7/RhoRubyLib/sync/SyncEngine.cs +20 -16
- data/platform/wp7/RhoRubyLib/sync/SyncNotify.cs +2 -2
- data/platform/wp7/RhoRubyLib/sync/SyncSource.cs +138 -40
- data/platform/wp7/WPApplication/rho/apps/app/layout.erb +3 -1
- data/platform/wp7/build/wp.rake +151 -12
- data/platform/wp7/rhodes.sln +10 -0
- data/platform/wp7/rhodes/App.xaml.cs +6 -0
- data/platform/wp7/rhodes/MainPage.xaml +3 -0
- data/platform/wp7/rhodes/MainPage.xaml.cs +19 -0
- data/platform/wp7/rhodes/Rhodes.csproj +4 -2
- data/rakefile.rb +7 -36
- data/res/build-tools/RhoAppRunner.exe +0 -0
- data/res/build-tools/RhoLogServer.exe +0 -0
- data/res/build-tools/detool.exe +0 -0
- data/res/build-tools/wp7explorer.exe +0 -0
- data/res/generators/templates/application/app/layout.erb +3 -1
- data/res/generators/templates/application/public/jqtouch/jqtouch.js +1 -1
- data/rhodes.gemspec +1 -1
- data/spec/framework_spec/app/layout.erb +1 -1
- data/spec/framework_spec/build.yml +1 -0
- data/spec/perfomance_spec/app/layout.erb +3 -0
- data/spec/phone_spec/app/Account_s/account_s.rb +4 -1
- data/spec/phone_spec/app/spec/rhom_object_spec.rb +30 -1
- data/spec/phone_spec/app/spec_runner.rb +1 -1
- data/spec/phone_spec/build.yml +4 -1
- metadata +262 -10
- data/platform/wp7/IronRuby/Languages/Ruby/Ruby/Builtins/ConsoleStream.cs +0 -107
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2009 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.pdf417.decoder;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.ChecksumException;
|
|
20
|
+
import com.google.zxing.FormatException;
|
|
21
|
+
import com.google.zxing.NotFoundException;
|
|
22
|
+
import com.google.zxing.common.BitMatrix;
|
|
23
|
+
import com.google.zxing.common.DecoderResult;
|
|
24
|
+
//import com.google.zxing.pdf417.reedsolomon.ReedSolomonDecoder;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* <p>The main class which implements PDF417 Code decoding -- as
|
|
28
|
+
* opposed to locating and extracting the PDF417 Code from an image.</p>
|
|
29
|
+
*
|
|
30
|
+
* @author SITA Lab (kevin.osullivan@sita.aero)
|
|
31
|
+
*/
|
|
32
|
+
public final class Decoder {
|
|
33
|
+
|
|
34
|
+
private static final int MAX_ERRORS = 3;
|
|
35
|
+
private static final int MAX_EC_CODEWORDS = 512;
|
|
36
|
+
//private final ReedSolomonDecoder rsDecoder;
|
|
37
|
+
|
|
38
|
+
public Decoder() {
|
|
39
|
+
// TODO MGMG
|
|
40
|
+
//rsDecoder = new ReedSolomonDecoder();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* <p>Convenience method that can decode a PDF417 Code represented as a 2D array of booleans.
|
|
45
|
+
* "true" is taken to mean a black module.</p>
|
|
46
|
+
*
|
|
47
|
+
* @param image booleans representing white/black PDF417 modules
|
|
48
|
+
* @return text and bytes encoded within the PDF417 Code
|
|
49
|
+
* @throws NotFoundException if the PDF417 Code cannot be decoded
|
|
50
|
+
*/
|
|
51
|
+
public DecoderResult decode(boolean[][] image) throws FormatException {
|
|
52
|
+
int dimension = image.length;
|
|
53
|
+
BitMatrix bits = new BitMatrix(dimension);
|
|
54
|
+
for (int i = 0; i < dimension; i++) {
|
|
55
|
+
for (int j = 0; j < dimension; j++) {
|
|
56
|
+
if (image[j][i]) {
|
|
57
|
+
bits.set(j, i);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return decode(bits);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* <p>Decodes a PDF417 Code represented as a {@link BitMatrix}.
|
|
66
|
+
* A 1 or "true" is taken to mean a black module.</p>
|
|
67
|
+
*
|
|
68
|
+
* @param bits booleans representing white/black PDF417 Code modules
|
|
69
|
+
* @return text and bytes encoded within the PDF417 Code
|
|
70
|
+
* @throws FormatException if the PDF417 Code cannot be decoded
|
|
71
|
+
*/
|
|
72
|
+
public DecoderResult decode(BitMatrix bits) throws FormatException {
|
|
73
|
+
// Construct a parser to read the data codewords and error-correction level
|
|
74
|
+
BitMatrixParser parser = new BitMatrixParser(bits);
|
|
75
|
+
int[] codewords = parser.readCodewords();
|
|
76
|
+
if (codewords == null || codewords.length == 0) {
|
|
77
|
+
throw FormatException.getFormatInstance();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
int ecLevel = parser.getECLevel();
|
|
81
|
+
int numECCodewords = 1 << (ecLevel + 1);
|
|
82
|
+
int[] erasures = parser.getErasures();
|
|
83
|
+
|
|
84
|
+
correctErrors(codewords, erasures, numECCodewords);
|
|
85
|
+
verifyCodewordCount(codewords, numECCodewords);
|
|
86
|
+
|
|
87
|
+
// Decode the codewords
|
|
88
|
+
return DecodedBitStreamParser.decode(codewords);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Verify that all is OK with the codeword array.
|
|
93
|
+
*
|
|
94
|
+
* @param codewords
|
|
95
|
+
* @return an index to the first data codeword.
|
|
96
|
+
* @throws FormatException
|
|
97
|
+
*/
|
|
98
|
+
private static void verifyCodewordCount(int[] codewords, int numECCodewords) throws FormatException {
|
|
99
|
+
if (codewords.length < 4) {
|
|
100
|
+
// Codeword array size should be at least 4 allowing for
|
|
101
|
+
// Count CW, At least one Data CW, Error Correction CW, Error Correction CW
|
|
102
|
+
throw FormatException.getFormatInstance();
|
|
103
|
+
}
|
|
104
|
+
// The first codeword, the Symbol Length Descriptor, shall always encode the total number of data
|
|
105
|
+
// codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad
|
|
106
|
+
// codewords, but excluding the number of error correction codewords.
|
|
107
|
+
int numberOfCodewords = codewords[0];
|
|
108
|
+
if (numberOfCodewords > codewords.length) {
|
|
109
|
+
throw FormatException.getFormatInstance();
|
|
110
|
+
}
|
|
111
|
+
if (numberOfCodewords == 0) {
|
|
112
|
+
// Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords)
|
|
113
|
+
if (numECCodewords < codewords.length) {
|
|
114
|
+
codewords[0] = codewords.length - numECCodewords;
|
|
115
|
+
} else {
|
|
116
|
+
throw FormatException.getFormatInstance();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* <p>Given data and error-correction codewords received, possibly corrupted by errors, attempts to
|
|
123
|
+
* correct the errors in-place using Reed-Solomon error correction.</p>
|
|
124
|
+
*
|
|
125
|
+
* @param codewords data and error correction codewords
|
|
126
|
+
* @throws ChecksumException if error correction fails
|
|
127
|
+
*/
|
|
128
|
+
private static int correctErrors(int[] codewords, int[] erasures, int numECCodewords) throws FormatException {
|
|
129
|
+
if ((erasures != null && erasures.length > numECCodewords / 2 + MAX_ERRORS) ||
|
|
130
|
+
(numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS)) {
|
|
131
|
+
// Too many errors or EC Codewords is corrupted
|
|
132
|
+
throw FormatException.getFormatInstance();
|
|
133
|
+
}
|
|
134
|
+
// Try to correct the errors
|
|
135
|
+
// TODO enable error correction
|
|
136
|
+
int result = 0; // rsDecoder.correctErrors(codewords, numECCodewords);
|
|
137
|
+
if (erasures != null) {
|
|
138
|
+
int numErasures = erasures.length;
|
|
139
|
+
if (result > 0) {
|
|
140
|
+
numErasures -= result;
|
|
141
|
+
}
|
|
142
|
+
if (numErasures > MAX_ERRORS) {
|
|
143
|
+
// Still too many errors
|
|
144
|
+
throw FormatException.getFormatInstance();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2009 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.pdf417.detector;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.BinaryBitmap;
|
|
20
|
+
import com.google.zxing.NotFoundException;
|
|
21
|
+
import com.google.zxing.ResultPoint;
|
|
22
|
+
import com.google.zxing.common.BitMatrix;
|
|
23
|
+
import com.google.zxing.common.DetectorResult;
|
|
24
|
+
import com.google.zxing.common.GridSampler;
|
|
25
|
+
|
|
26
|
+
import java.util.Hashtable;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* <p>Encapsulates logic that can detect a PDF417 Code in an image, even if the
|
|
30
|
+
* PDF417 Code is rotated or skewed, or partially obscured.</p>
|
|
31
|
+
*
|
|
32
|
+
* @author SITA Lab (kevin.osullivan@sita.aero)
|
|
33
|
+
* @author dswitkin@google.com (Daniel Switkin)
|
|
34
|
+
*/
|
|
35
|
+
public final class Detector {
|
|
36
|
+
|
|
37
|
+
private static final int MAX_AVG_VARIANCE = (int) ((1 << 8) * 0.42f);
|
|
38
|
+
private static final int MAX_INDIVIDUAL_VARIANCE = (int) ((1 << 8) * 0.8f);
|
|
39
|
+
private static final int SKEW_THRESHOLD = 2;
|
|
40
|
+
|
|
41
|
+
// B S B S B S B S Bar/Space pattern
|
|
42
|
+
// 11111111 0 1 0 1 0 1 000
|
|
43
|
+
private static final int[] START_PATTERN = {8, 1, 1, 1, 1, 1, 1, 3};
|
|
44
|
+
|
|
45
|
+
// 11111111 0 1 0 1 0 1 000
|
|
46
|
+
private static final int[] START_PATTERN_REVERSE = {3, 1, 1, 1, 1, 1, 1, 8};
|
|
47
|
+
|
|
48
|
+
// 1111111 0 1 000 1 0 1 00 1
|
|
49
|
+
private static final int[] STOP_PATTERN = {7, 1, 1, 3, 1, 1, 1, 2, 1};
|
|
50
|
+
|
|
51
|
+
// B S B S B S B S B Bar/Space pattern
|
|
52
|
+
// 1111111 0 1 000 1 0 1 00 1
|
|
53
|
+
private static final int[] STOP_PATTERN_REVERSE = {1, 2, 1, 1, 1, 3, 1, 1, 7};
|
|
54
|
+
|
|
55
|
+
private final BinaryBitmap image;
|
|
56
|
+
|
|
57
|
+
public Detector(BinaryBitmap image) {
|
|
58
|
+
this.image = image;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* <p>Detects a PDF417 Code in an image, simply.</p>
|
|
63
|
+
*
|
|
64
|
+
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
|
|
65
|
+
* @throws NotFoundException if no QR Code can be found
|
|
66
|
+
*/
|
|
67
|
+
public DetectorResult detect() throws NotFoundException {
|
|
68
|
+
return detect(null);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* <p>Detects a PDF417 Code in an image. Only checks 0 and 180 degree rotations.</p>
|
|
73
|
+
*
|
|
74
|
+
* @param hints optional hints to detector
|
|
75
|
+
* @return {@link DetectorResult} encapsulating results of detecting a PDF417 Code
|
|
76
|
+
* @throws NotFoundException if no PDF417 Code can be found
|
|
77
|
+
*/
|
|
78
|
+
public DetectorResult detect(Hashtable hints) throws NotFoundException {
|
|
79
|
+
// Fetch the 1 bit matrix once up front.
|
|
80
|
+
BitMatrix matrix = image.getBlackMatrix();
|
|
81
|
+
|
|
82
|
+
// Try to find the vertices assuming the image is upright.
|
|
83
|
+
ResultPoint[] vertices = findVertices(matrix);
|
|
84
|
+
if (vertices == null) {
|
|
85
|
+
// Maybe the image is rotated 180 degrees?
|
|
86
|
+
vertices = findVertices180(matrix);
|
|
87
|
+
if (vertices != null) {
|
|
88
|
+
correctCodeWordVertices(vertices, true);
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
correctCodeWordVertices(vertices, false);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (vertices == null) {
|
|
95
|
+
throw NotFoundException.getNotFoundInstance();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
float moduleWidth = computeModuleWidth(vertices);
|
|
99
|
+
if (moduleWidth < 1.0f) {
|
|
100
|
+
throw NotFoundException.getNotFoundInstance();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
int dimension = computeDimension(vertices[4], vertices[6],
|
|
104
|
+
vertices[5], vertices[7], moduleWidth);
|
|
105
|
+
if (dimension < 1) {
|
|
106
|
+
throw NotFoundException.getNotFoundInstance();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Deskew and sample image.
|
|
110
|
+
BitMatrix bits = sampleGrid(matrix, vertices[4], vertices[5],
|
|
111
|
+
vertices[6], vertices[7], dimension);
|
|
112
|
+
return new DetectorResult(bits, new ResultPoint[]{vertices[4],
|
|
113
|
+
vertices[5], vertices[6], vertices[7]});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Locate the vertices and the codewords area of a black blob using the Start
|
|
118
|
+
* and Stop patterns as locators.
|
|
119
|
+
* TODO: Scanning every row is very expensive. We should only do this for TRY_HARDER.
|
|
120
|
+
*
|
|
121
|
+
* @param matrix the scanned barcode image.
|
|
122
|
+
* @return an array containing the vertices:
|
|
123
|
+
* vertices[0] x, y top left barcode
|
|
124
|
+
* vertices[1] x, y bottom left barcode
|
|
125
|
+
* vertices[2] x, y top right barcode
|
|
126
|
+
* vertices[3] x, y bottom right barcode
|
|
127
|
+
* vertices[4] x, y top left codeword area
|
|
128
|
+
* vertices[5] x, y bottom left codeword area
|
|
129
|
+
* vertices[6] x, y top right codeword area
|
|
130
|
+
* vertices[7] x, y bottom right codeword area
|
|
131
|
+
*/
|
|
132
|
+
private static ResultPoint[] findVertices(BitMatrix matrix) {
|
|
133
|
+
int height = matrix.getHeight();
|
|
134
|
+
int width = matrix.getWidth();
|
|
135
|
+
|
|
136
|
+
ResultPoint[] result = new ResultPoint[8];
|
|
137
|
+
boolean found = false;
|
|
138
|
+
|
|
139
|
+
// Top Left
|
|
140
|
+
for (int i = 0; i < height; i++) {
|
|
141
|
+
int[] loc = findGuardPattern(matrix, 0, i, width, false, START_PATTERN);
|
|
142
|
+
if (loc != null) {
|
|
143
|
+
result[0] = new ResultPoint(loc[0], i);
|
|
144
|
+
result[4] = new ResultPoint(loc[1], i);
|
|
145
|
+
found = true;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Bottom left
|
|
150
|
+
if (found) { // Found the Top Left vertex
|
|
151
|
+
found = false;
|
|
152
|
+
for (int i = height - 1; i > 0; i--) {
|
|
153
|
+
int[] loc = findGuardPattern(matrix, 0, i, width, false, START_PATTERN);
|
|
154
|
+
if (loc != null) {
|
|
155
|
+
result[1] = new ResultPoint(loc[0], i);
|
|
156
|
+
result[5] = new ResultPoint(loc[1], i);
|
|
157
|
+
found = true;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Top right
|
|
163
|
+
if (found) { // Found the Bottom Left vertex
|
|
164
|
+
found = false;
|
|
165
|
+
for (int i = 0; i < height; i++) {
|
|
166
|
+
int[] loc = findGuardPattern(matrix, 0, i, width, false, STOP_PATTERN);
|
|
167
|
+
if (loc != null) {
|
|
168
|
+
result[2] = new ResultPoint(loc[1], i);
|
|
169
|
+
result[6] = new ResultPoint(loc[0], i);
|
|
170
|
+
found = true;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Bottom right
|
|
176
|
+
if (found) { // Found the Top right vertex
|
|
177
|
+
found = false;
|
|
178
|
+
for (int i = height - 1; i > 0; i--) {
|
|
179
|
+
int[] loc = findGuardPattern(matrix, 0, i, width, false, STOP_PATTERN);
|
|
180
|
+
if (loc != null) {
|
|
181
|
+
result[3] = new ResultPoint(loc[1], i);
|
|
182
|
+
result[7] = new ResultPoint(loc[0], i);
|
|
183
|
+
found = true;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return found ? result : null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Locate the vertices and the codewords area of a black blob using the Start
|
|
193
|
+
* and Stop patterns as locators. This assumes that the image is rotated 180
|
|
194
|
+
* degrees and if it locates the start and stop patterns at it will re-map
|
|
195
|
+
* the vertices for a 0 degree rotation.
|
|
196
|
+
* TODO: Change assumption about barcode location.
|
|
197
|
+
* TODO: Scanning every row is very expensive. We should only do this for TRY_HARDER.
|
|
198
|
+
*
|
|
199
|
+
* @param matrix the scanned barcode image.
|
|
200
|
+
* @return an array containing the vertices:
|
|
201
|
+
* vertices[0] x, y top left barcode
|
|
202
|
+
* vertices[1] x, y bottom left barcode
|
|
203
|
+
* vertices[2] x, y top right barcode
|
|
204
|
+
* vertices[3] x, y bottom right barcode
|
|
205
|
+
* vertices[4] x, y top left codeword area
|
|
206
|
+
* vertices[5] x, y bottom left codeword area
|
|
207
|
+
* vertices[6] x, y top right codeword area
|
|
208
|
+
* vertices[7] x, y bottom right codeword area
|
|
209
|
+
*/
|
|
210
|
+
private static ResultPoint[] findVertices180(BitMatrix matrix) {
|
|
211
|
+
int height = matrix.getHeight();
|
|
212
|
+
int width = matrix.getWidth();
|
|
213
|
+
int halfWidth = width >> 1;
|
|
214
|
+
|
|
215
|
+
ResultPoint[] result = new ResultPoint[8];
|
|
216
|
+
boolean found = false;
|
|
217
|
+
|
|
218
|
+
// Top Left
|
|
219
|
+
for (int i = height - 1; i > 0; i--) {
|
|
220
|
+
int[] loc = findGuardPattern(matrix, halfWidth, i, halfWidth, true, START_PATTERN_REVERSE);
|
|
221
|
+
if (loc != null) {
|
|
222
|
+
result[0] = new ResultPoint(loc[1], i);
|
|
223
|
+
result[4] = new ResultPoint(loc[0], i);
|
|
224
|
+
found = true;
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Bottom Left
|
|
229
|
+
if (found) { // Found the Top Left vertex
|
|
230
|
+
found = false;
|
|
231
|
+
for (int i = 0; i < height; i++) {
|
|
232
|
+
int[] loc = findGuardPattern(matrix, halfWidth, i, halfWidth, true, START_PATTERN_REVERSE);
|
|
233
|
+
if (loc != null) {
|
|
234
|
+
result[1] = new ResultPoint(loc[1], i);
|
|
235
|
+
result[5] = new ResultPoint(loc[0], i);
|
|
236
|
+
found = true;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Top Right
|
|
242
|
+
if (found) { // Found the Bottom Left vertex
|
|
243
|
+
found = false;
|
|
244
|
+
for (int i = height - 1; i > 0; i--) {
|
|
245
|
+
int[] loc = findGuardPattern(matrix, 0, i, halfWidth, false, STOP_PATTERN_REVERSE);
|
|
246
|
+
if (loc != null) {
|
|
247
|
+
result[2] = new ResultPoint(loc[0], i);
|
|
248
|
+
result[6] = new ResultPoint(loc[1], i);
|
|
249
|
+
found = true;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Bottom Right
|
|
255
|
+
if (found) { // Found the Top Right vertex
|
|
256
|
+
found = false;
|
|
257
|
+
for (int i = 0; i < height; i++) {
|
|
258
|
+
int[] loc = findGuardPattern(matrix, 0, i, halfWidth, false, STOP_PATTERN_REVERSE);
|
|
259
|
+
if (loc != null) {
|
|
260
|
+
result[3] = new ResultPoint(loc[0], i);
|
|
261
|
+
result[7] = new ResultPoint(loc[1], i);
|
|
262
|
+
found = true;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return found ? result : null;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Because we scan horizontally to detect the start and stop patterns, the vertical component of
|
|
272
|
+
* the codeword coordinates will be slightly wrong if there is any skew or rotation in the image.
|
|
273
|
+
* This method moves those points back onto the edges of the theoretically perfect bounding
|
|
274
|
+
* quadrilateral if needed.
|
|
275
|
+
*
|
|
276
|
+
* @param vertices The eight vertices located by findVertices().
|
|
277
|
+
*/
|
|
278
|
+
private static void correctCodeWordVertices(ResultPoint[] vertices, boolean upsideDown) {
|
|
279
|
+
float skew = vertices[4].getY() - vertices[6].getY();
|
|
280
|
+
if (upsideDown) {
|
|
281
|
+
skew = -skew;
|
|
282
|
+
}
|
|
283
|
+
if (skew > SKEW_THRESHOLD) {
|
|
284
|
+
// Fix v4
|
|
285
|
+
float length = vertices[4].getX() - vertices[0].getX();
|
|
286
|
+
float deltax = vertices[6].getX() - vertices[0].getX();
|
|
287
|
+
float deltay = vertices[6].getY() - vertices[0].getY();
|
|
288
|
+
float correction = length * deltay / deltax;
|
|
289
|
+
vertices[4] = new ResultPoint(vertices[4].getX(), vertices[4].getY() + correction);
|
|
290
|
+
} else if (-skew > SKEW_THRESHOLD) {
|
|
291
|
+
// Fix v6
|
|
292
|
+
float length = vertices[2].getX() - vertices[6].getX();
|
|
293
|
+
float deltax = vertices[2].getX() - vertices[4].getX();
|
|
294
|
+
float deltay = vertices[2].getY() - vertices[4].getY();
|
|
295
|
+
float correction = length * deltay / deltax;
|
|
296
|
+
vertices[6] = new ResultPoint(vertices[6].getX(), vertices[6].getY() - correction);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
skew = vertices[7].getY() - vertices[5].getY();
|
|
300
|
+
if (upsideDown) {
|
|
301
|
+
skew = -skew;
|
|
302
|
+
}
|
|
303
|
+
if (skew > SKEW_THRESHOLD) {
|
|
304
|
+
// Fix v5
|
|
305
|
+
float length = vertices[5].getX() - vertices[1].getX();
|
|
306
|
+
float deltax = vertices[7].getX() - vertices[1].getX();
|
|
307
|
+
float deltay = vertices[7].getY() - vertices[1].getY();
|
|
308
|
+
float correction = length * deltay / deltax;
|
|
309
|
+
vertices[5] = new ResultPoint(vertices[5].getX(), vertices[5].getY() + correction);
|
|
310
|
+
} else if (-skew > SKEW_THRESHOLD) {
|
|
311
|
+
// Fix v7
|
|
312
|
+
float length = vertices[3].getX() - vertices[7].getX();
|
|
313
|
+
float deltax = vertices[3].getX() - vertices[5].getX();
|
|
314
|
+
float deltay = vertices[3].getY() - vertices[5].getY();
|
|
315
|
+
float correction = length * deltay / deltax;
|
|
316
|
+
vertices[7] = new ResultPoint(vertices[7].getX(), vertices[7].getY() - correction);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* <p>Estimates module size (pixels in a module) based on the Start and End
|
|
322
|
+
* finder patterns.</p>
|
|
323
|
+
*
|
|
324
|
+
* @param vertices an array of vertices:
|
|
325
|
+
* vertices[0] x, y top left barcode
|
|
326
|
+
* vertices[1] x, y bottom left barcode
|
|
327
|
+
* vertices[2] x, y top right barcode
|
|
328
|
+
* vertices[3] x, y bottom right barcode
|
|
329
|
+
* vertices[4] x, y top left codeword area
|
|
330
|
+
* vertices[5] x, y bottom left codeword area
|
|
331
|
+
* vertices[6] x, y top right codeword area
|
|
332
|
+
* vertices[7] x, y bottom right codeword area
|
|
333
|
+
* @return the module size.
|
|
334
|
+
*/
|
|
335
|
+
private static float computeModuleWidth(ResultPoint[] vertices) {
|
|
336
|
+
float pixels1 = ResultPoint.distance(vertices[0], vertices[4]);
|
|
337
|
+
float pixels2 = ResultPoint.distance(vertices[1], vertices[5]);
|
|
338
|
+
float moduleWidth1 = (pixels1 + pixels2) / (17 * 2.0f);
|
|
339
|
+
float pixels3 = ResultPoint.distance(vertices[6], vertices[2]);
|
|
340
|
+
float pixels4 = ResultPoint.distance(vertices[7], vertices[3]);
|
|
341
|
+
float moduleWidth2 = (pixels3 + pixels4) / (18 * 2.0f);
|
|
342
|
+
return (moduleWidth1 + moduleWidth2) / 2.0f;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Computes the dimension (number of modules in a row) of the PDF417 Code
|
|
347
|
+
* based on vertices of the codeword area and estimated module size.
|
|
348
|
+
*
|
|
349
|
+
* @param topLeft of codeword area
|
|
350
|
+
* @param topRight of codeword area
|
|
351
|
+
* @param bottomLeft of codeword area
|
|
352
|
+
* @param bottomRight of codeword are
|
|
353
|
+
* @param moduleWidth estimated module size
|
|
354
|
+
* @return the number of modules in a row.
|
|
355
|
+
*/
|
|
356
|
+
private static int computeDimension(ResultPoint topLeft, ResultPoint topRight,
|
|
357
|
+
ResultPoint bottomLeft, ResultPoint bottomRight, float moduleWidth) {
|
|
358
|
+
int topRowDimension = round(ResultPoint.distance(topLeft, topRight) / moduleWidth);
|
|
359
|
+
int bottomRowDimension = round(ResultPoint.distance(bottomLeft, bottomRight) / moduleWidth);
|
|
360
|
+
return ((((topRowDimension + bottomRowDimension) >> 1) + 8) / 17) * 17;
|
|
361
|
+
/*
|
|
362
|
+
* int topRowDimension = round(ResultPoint.distance(topLeft,
|
|
363
|
+
* topRight)); //moduleWidth); int bottomRowDimension =
|
|
364
|
+
* round(ResultPoint.distance(bottomLeft, bottomRight)); //
|
|
365
|
+
* moduleWidth); int dimension = ((topRowDimension + bottomRowDimension)
|
|
366
|
+
* >> 1); // Round up to nearest 17 modules i.e. there are 17 modules per
|
|
367
|
+
* codeword //int dimension = ((((topRowDimension + bottomRowDimension) >>
|
|
368
|
+
* 1) + 8) / 17) * 17; return dimension;
|
|
369
|
+
*/
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
private static BitMatrix sampleGrid(BitMatrix matrix, ResultPoint topLeft,
|
|
373
|
+
ResultPoint bottomLeft, ResultPoint topRight, ResultPoint bottomRight, int dimension)
|
|
374
|
+
throws NotFoundException {
|
|
375
|
+
|
|
376
|
+
// Note that unlike the QR Code sampler, we didn't find the center of modules, but the
|
|
377
|
+
// very corners. So there is no 0.5f here; 0.0f is right.
|
|
378
|
+
GridSampler sampler = GridSampler.getInstance();
|
|
379
|
+
|
|
380
|
+
return sampler.sampleGrid(matrix, dimension, 0.0f, // p1ToX
|
|
381
|
+
0.0f, // p1ToY
|
|
382
|
+
dimension, // p2ToX
|
|
383
|
+
0.0f, // p2ToY
|
|
384
|
+
dimension, // p3ToX
|
|
385
|
+
dimension, // p3ToY
|
|
386
|
+
0.0f, // p4ToX
|
|
387
|
+
dimension, // p4ToY
|
|
388
|
+
topLeft.getX(), // p1FromX
|
|
389
|
+
topLeft.getY(), // p1FromY
|
|
390
|
+
topRight.getX(), // p2FromX
|
|
391
|
+
topRight.getY(), // p2FromY
|
|
392
|
+
bottomRight.getX(), // p3FromX
|
|
393
|
+
bottomRight.getY(), // p3FromY
|
|
394
|
+
bottomLeft.getX(), // p4FromX
|
|
395
|
+
bottomLeft.getY()); // p4FromY
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Ends up being a bit faster than Math.round(). This merely rounds its
|
|
400
|
+
* argument to the nearest int, where x.5 rounds up.
|
|
401
|
+
*/
|
|
402
|
+
private static int round(float d) {
|
|
403
|
+
return (int) (d + 0.5f);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* @param matrix row of black/white values to search
|
|
408
|
+
* @param column x position to start search
|
|
409
|
+
* @param row y position to start search
|
|
410
|
+
* @param width the number of pixels to search on this row
|
|
411
|
+
* @param pattern pattern of counts of number of black and white pixels that are
|
|
412
|
+
* being searched for as a pattern
|
|
413
|
+
* @return start/end horizontal offset of guard pattern, as an array of two ints.
|
|
414
|
+
*/
|
|
415
|
+
private static int[] findGuardPattern(BitMatrix matrix, int column, int row, int width,
|
|
416
|
+
boolean whiteFirst, int[] pattern) {
|
|
417
|
+
int patternLength = pattern.length;
|
|
418
|
+
// TODO: Find a way to cache this array, as this method is called hundreds of times
|
|
419
|
+
// per image, and we want to allocate as seldom as possible.
|
|
420
|
+
int[] counters = new int[patternLength];
|
|
421
|
+
boolean isWhite = whiteFirst;
|
|
422
|
+
|
|
423
|
+
int counterPosition = 0;
|
|
424
|
+
int patternStart = column;
|
|
425
|
+
for (int x = column; x < column + width; x++) {
|
|
426
|
+
boolean pixel = matrix.get(x, row);
|
|
427
|
+
if (pixel ^ isWhite) {
|
|
428
|
+
counters[counterPosition]++;
|
|
429
|
+
} else {
|
|
430
|
+
if (counterPosition == patternLength - 1) {
|
|
431
|
+
if (patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
|
|
432
|
+
return new int[]{patternStart, x};
|
|
433
|
+
}
|
|
434
|
+
patternStart += counters[0] + counters[1];
|
|
435
|
+
for (int y = 2; y < patternLength; y++) {
|
|
436
|
+
counters[y - 2] = counters[y];
|
|
437
|
+
}
|
|
438
|
+
counters[patternLength - 2] = 0;
|
|
439
|
+
counters[patternLength - 1] = 0;
|
|
440
|
+
counterPosition--;
|
|
441
|
+
} else {
|
|
442
|
+
counterPosition++;
|
|
443
|
+
}
|
|
444
|
+
counters[counterPosition] = 1;
|
|
445
|
+
isWhite = !isWhite;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return null;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Determines how closely a set of observed counts of runs of black/white
|
|
453
|
+
* values matches a given target pattern. This is reported as the ratio of
|
|
454
|
+
* the total variance from the expected pattern proportions across all
|
|
455
|
+
* pattern elements, to the length of the pattern.
|
|
456
|
+
*
|
|
457
|
+
* @param counters observed counters
|
|
458
|
+
* @param pattern expected pattern
|
|
459
|
+
* @param maxIndividualVariance The most any counter can differ before we give up
|
|
460
|
+
* @return ratio of total variance between counters and pattern compared to
|
|
461
|
+
* total pattern size, where the ratio has been multiplied by 256.
|
|
462
|
+
* So, 0 means no variance (perfect match); 256 means the total
|
|
463
|
+
* variance between counters and patterns equals the pattern length,
|
|
464
|
+
* higher values mean even more variance
|
|
465
|
+
*/
|
|
466
|
+
private static int patternMatchVariance(int[] counters, int[] pattern, int maxIndividualVariance) {
|
|
467
|
+
int numCounters = counters.length;
|
|
468
|
+
int total = 0;
|
|
469
|
+
int patternLength = 0;
|
|
470
|
+
for (int i = 0; i < numCounters; i++) {
|
|
471
|
+
total += counters[i];
|
|
472
|
+
patternLength += pattern[i];
|
|
473
|
+
}
|
|
474
|
+
if (total < patternLength) {
|
|
475
|
+
// If we don't even have one pixel per unit of bar width, assume this
|
|
476
|
+
// is too small to reliably match, so fail:
|
|
477
|
+
return Integer.MAX_VALUE;
|
|
478
|
+
}
|
|
479
|
+
// We're going to fake floating-point math in integers. We just need to use more bits.
|
|
480
|
+
// Scale up patternLength so that intermediate values below like scaledCounter will have
|
|
481
|
+
// more "significant digits".
|
|
482
|
+
int unitBarWidth = (total << 8) / patternLength;
|
|
483
|
+
maxIndividualVariance = (maxIndividualVariance * unitBarWidth) >> 8;
|
|
484
|
+
|
|
485
|
+
int totalVariance = 0;
|
|
486
|
+
for (int x = 0; x < numCounters; x++) {
|
|
487
|
+
int counter = counters[x] << 8;
|
|
488
|
+
int scaledPattern = pattern[x] * unitBarWidth;
|
|
489
|
+
int variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter;
|
|
490
|
+
if (variance > maxIndividualVariance) {
|
|
491
|
+
return Integer.MAX_VALUE;
|
|
492
|
+
}
|
|
493
|
+
totalVariance += variance;
|
|
494
|
+
}
|
|
495
|
+
return totalVariance / total;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
}
|