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,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2007 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.datamatrix.decoder;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.ChecksumException;
|
|
20
|
+
import com.google.zxing.FormatException;
|
|
21
|
+
import com.google.zxing.common.BitMatrix;
|
|
22
|
+
import com.google.zxing.common.DecoderResult;
|
|
23
|
+
import com.google.zxing.common.reedsolomon.GF256;
|
|
24
|
+
import com.google.zxing.common.reedsolomon.ReedSolomonDecoder;
|
|
25
|
+
import com.google.zxing.common.reedsolomon.ReedSolomonException;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* <p>The main class which implements Data Matrix Code decoding -- as opposed to locating and extracting
|
|
29
|
+
* the Data Matrix Code from an image.</p>
|
|
30
|
+
*
|
|
31
|
+
* @author bbrown@google.com (Brian Brown)
|
|
32
|
+
*/
|
|
33
|
+
public final class Decoder {
|
|
34
|
+
|
|
35
|
+
private final ReedSolomonDecoder rsDecoder;
|
|
36
|
+
|
|
37
|
+
public Decoder() {
|
|
38
|
+
rsDecoder = new ReedSolomonDecoder(GF256.DATA_MATRIX_FIELD);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* <p>Convenience method that can decode a Data Matrix Code represented as a 2D array of booleans.
|
|
43
|
+
* "true" is taken to mean a black module.</p>
|
|
44
|
+
*
|
|
45
|
+
* @param image booleans representing white/black Data Matrix Code modules
|
|
46
|
+
* @return text and bytes encoded within the Data Matrix Code
|
|
47
|
+
* @throws FormatException if the Data Matrix Code cannot be decoded
|
|
48
|
+
* @throws ChecksumException if error correction fails
|
|
49
|
+
*/
|
|
50
|
+
public DecoderResult decode(boolean[][] image) throws FormatException, ChecksumException {
|
|
51
|
+
int dimension = image.length;
|
|
52
|
+
BitMatrix bits = new BitMatrix(dimension);
|
|
53
|
+
for (int i = 0; i < dimension; i++) {
|
|
54
|
+
for (int j = 0; j < dimension; j++) {
|
|
55
|
+
if (image[i][j]) {
|
|
56
|
+
bits.set(j, i);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return decode(bits);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* <p>Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken
|
|
65
|
+
* to mean a black module.</p>
|
|
66
|
+
*
|
|
67
|
+
* @param bits booleans representing white/black Data Matrix Code modules
|
|
68
|
+
* @return text and bytes encoded within the Data Matrix Code
|
|
69
|
+
* @throws FormatException if the Data Matrix Code cannot be decoded
|
|
70
|
+
* @throws ChecksumException if error correction fails
|
|
71
|
+
*/
|
|
72
|
+
public DecoderResult decode(BitMatrix bits) throws FormatException, ChecksumException {
|
|
73
|
+
|
|
74
|
+
// Construct a parser and read version, error-correction level
|
|
75
|
+
BitMatrixParser parser = new BitMatrixParser(bits);
|
|
76
|
+
Version version = parser.readVersion(bits);
|
|
77
|
+
|
|
78
|
+
// Read codewords
|
|
79
|
+
byte[] codewords = parser.readCodewords();
|
|
80
|
+
// Separate into data blocks
|
|
81
|
+
DataBlock[] dataBlocks = DataBlock.getDataBlocks(codewords, version);
|
|
82
|
+
|
|
83
|
+
// Count total number of data bytes
|
|
84
|
+
int totalBytes = 0;
|
|
85
|
+
for (int i = 0; i < dataBlocks.length; i++) {
|
|
86
|
+
totalBytes += dataBlocks[i].getNumDataCodewords();
|
|
87
|
+
}
|
|
88
|
+
byte[] resultBytes = new byte[totalBytes];
|
|
89
|
+
int resultOffset = 0;
|
|
90
|
+
|
|
91
|
+
// Error-correct and copy data blocks together into a stream of bytes
|
|
92
|
+
for (int j = 0; j < dataBlocks.length; j++) {
|
|
93
|
+
DataBlock dataBlock = dataBlocks[j];
|
|
94
|
+
byte[] codewordBytes = dataBlock.getCodewords();
|
|
95
|
+
int numDataCodewords = dataBlock.getNumDataCodewords();
|
|
96
|
+
correctErrors(codewordBytes, numDataCodewords);
|
|
97
|
+
for (int i = 0; i < numDataCodewords; i++) {
|
|
98
|
+
resultBytes[resultOffset++] = codewordBytes[i];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Decode the contents of that stream of bytes
|
|
103
|
+
return DecodedBitStreamParser.decode(resultBytes);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* <p>Given data and error-correction codewords received, possibly corrupted by errors, attempts to
|
|
108
|
+
* correct the errors in-place using Reed-Solomon error correction.</p>
|
|
109
|
+
*
|
|
110
|
+
* @param codewordBytes data and error correction codewords
|
|
111
|
+
* @param numDataCodewords number of codewords that are data bytes
|
|
112
|
+
* @throws ChecksumException if error correction fails
|
|
113
|
+
*/
|
|
114
|
+
private void correctErrors(byte[] codewordBytes, int numDataCodewords) throws ChecksumException {
|
|
115
|
+
int numCodewords = codewordBytes.length;
|
|
116
|
+
// First read into an array of ints
|
|
117
|
+
int[] codewordsInts = new int[numCodewords];
|
|
118
|
+
for (int i = 0; i < numCodewords; i++) {
|
|
119
|
+
codewordsInts[i] = codewordBytes[i] & 0xFF;
|
|
120
|
+
}
|
|
121
|
+
int numECCodewords = codewordBytes.length - numDataCodewords;
|
|
122
|
+
try {
|
|
123
|
+
rsDecoder.decode(codewordsInts, numECCodewords);
|
|
124
|
+
} catch (ReedSolomonException rse) {
|
|
125
|
+
throw ChecksumException.getChecksumInstance();
|
|
126
|
+
}
|
|
127
|
+
// Copy back into array of bytes -- only need to worry about the bytes that were data
|
|
128
|
+
// We don't care about errors in the error-correction codewords
|
|
129
|
+
for (int i = 0; i < numDataCodewords; i++) {
|
|
130
|
+
codewordBytes[i] = (byte) codewordsInts[i];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2007 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.datamatrix.decoder;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.FormatException;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The Version object encapsulates attributes about a particular
|
|
23
|
+
* size Data Matrix Code.
|
|
24
|
+
*
|
|
25
|
+
* @author bbrown@google.com (Brian Brown)
|
|
26
|
+
*/
|
|
27
|
+
public final class Version {
|
|
28
|
+
|
|
29
|
+
private static final Version[] VERSIONS = buildVersions();
|
|
30
|
+
|
|
31
|
+
private final int versionNumber;
|
|
32
|
+
private final int symbolSizeRows;
|
|
33
|
+
private final int symbolSizeColumns;
|
|
34
|
+
private final int dataRegionSizeRows;
|
|
35
|
+
private final int dataRegionSizeColumns;
|
|
36
|
+
private final ECBlocks ecBlocks;
|
|
37
|
+
private final int totalCodewords;
|
|
38
|
+
|
|
39
|
+
private Version(int versionNumber,
|
|
40
|
+
int symbolSizeRows,
|
|
41
|
+
int symbolSizeColumns,
|
|
42
|
+
int dataRegionSizeRows,
|
|
43
|
+
int dataRegionSizeColumns,
|
|
44
|
+
ECBlocks ecBlocks) {
|
|
45
|
+
this.versionNumber = versionNumber;
|
|
46
|
+
this.symbolSizeRows = symbolSizeRows;
|
|
47
|
+
this.symbolSizeColumns = symbolSizeColumns;
|
|
48
|
+
this.dataRegionSizeRows = dataRegionSizeRows;
|
|
49
|
+
this.dataRegionSizeColumns = dataRegionSizeColumns;
|
|
50
|
+
this.ecBlocks = ecBlocks;
|
|
51
|
+
|
|
52
|
+
// Calculate the total number of codewords
|
|
53
|
+
int total = 0;
|
|
54
|
+
int ecCodewords = ecBlocks.getECCodewords();
|
|
55
|
+
ECB[] ecbArray = ecBlocks.getECBlocks();
|
|
56
|
+
for (int i = 0; i < ecbArray.length; i++) {
|
|
57
|
+
ECB ecBlock = ecbArray[i];
|
|
58
|
+
total += ecBlock.getCount() * (ecBlock.getDataCodewords() + ecCodewords);
|
|
59
|
+
}
|
|
60
|
+
this.totalCodewords = total;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public int getVersionNumber() {
|
|
64
|
+
return versionNumber;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public int getSymbolSizeRows() {
|
|
68
|
+
return symbolSizeRows;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public int getSymbolSizeColumns() {
|
|
72
|
+
return symbolSizeColumns;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public int getDataRegionSizeRows() {
|
|
76
|
+
return dataRegionSizeRows;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public int getDataRegionSizeColumns() {
|
|
80
|
+
return dataRegionSizeColumns;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public int getTotalCodewords() {
|
|
84
|
+
return totalCodewords;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
ECBlocks getECBlocks() {
|
|
88
|
+
return ecBlocks;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* <p>Deduces version information from Data Matrix dimensions.</p>
|
|
93
|
+
*
|
|
94
|
+
* @param numRows Number of rows in modules
|
|
95
|
+
* @param numColumns Number of columns in modules
|
|
96
|
+
* @return {@link Version} for a Data Matrix Code of those dimensions
|
|
97
|
+
* @throws FormatException if dimensions do correspond to a valid Data Matrix size
|
|
98
|
+
*/
|
|
99
|
+
public static Version getVersionForDimensions(int numRows, int numColumns) throws FormatException {
|
|
100
|
+
if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
|
|
101
|
+
throw FormatException.getFormatInstance();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// TODO(bbrown): This is doing a linear search through the array of versions.
|
|
105
|
+
// If we interleave the rectangular versions with the square versions we could
|
|
106
|
+
// do a binary search.
|
|
107
|
+
int numVersions = VERSIONS.length;
|
|
108
|
+
for (int i = 0; i < numVersions; ++i){
|
|
109
|
+
Version version = VERSIONS[i];
|
|
110
|
+
if (version.symbolSizeRows == numRows && version.symbolSizeColumns == numColumns) {
|
|
111
|
+
return version;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
throw FormatException.getFormatInstance();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* <p>Encapsulates a set of error-correction blocks in one symbol version. Most versions will
|
|
120
|
+
* use blocks of differing sizes within one version, so, this encapsulates the parameters for
|
|
121
|
+
* each set of blocks. It also holds the number of error-correction codewords per block since it
|
|
122
|
+
* will be the same across all blocks within one version.</p>
|
|
123
|
+
*/
|
|
124
|
+
static final class ECBlocks {
|
|
125
|
+
private final int ecCodewords;
|
|
126
|
+
private final ECB[] ecBlocks;
|
|
127
|
+
|
|
128
|
+
private ECBlocks(int ecCodewords, ECB ecBlocks) {
|
|
129
|
+
this.ecCodewords = ecCodewords;
|
|
130
|
+
this.ecBlocks = new ECB[] { ecBlocks };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private ECBlocks(int ecCodewords, ECB ecBlocks1, ECB ecBlocks2) {
|
|
134
|
+
this.ecCodewords = ecCodewords;
|
|
135
|
+
this.ecBlocks = new ECB[] { ecBlocks1, ecBlocks2 };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
int getECCodewords() {
|
|
139
|
+
return ecCodewords;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
ECB[] getECBlocks() {
|
|
143
|
+
return ecBlocks;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* <p>Encapsualtes the parameters for one error-correction block in one symbol version.
|
|
149
|
+
* This includes the number of data codewords, and the number of times a block with these
|
|
150
|
+
* parameters is used consecutively in the Data Matrix code version's format.</p>
|
|
151
|
+
*/
|
|
152
|
+
static final class ECB {
|
|
153
|
+
private final int count;
|
|
154
|
+
private final int dataCodewords;
|
|
155
|
+
|
|
156
|
+
private ECB(int count, int dataCodewords) {
|
|
157
|
+
this.count = count;
|
|
158
|
+
this.dataCodewords = dataCodewords;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
int getCount() {
|
|
162
|
+
return count;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
int getDataCodewords() {
|
|
166
|
+
return dataCodewords;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
public String toString() {
|
|
171
|
+
return String.valueOf(versionNumber);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* See ISO 16022:2006 5.5.1 Table 7
|
|
176
|
+
*/
|
|
177
|
+
private static Version[] buildVersions() {
|
|
178
|
+
return new Version[]{
|
|
179
|
+
new Version(1, 10, 10, 8, 8,
|
|
180
|
+
new ECBlocks(5, new ECB(1, 3))),
|
|
181
|
+
new Version(2, 12, 12, 10, 10,
|
|
182
|
+
new ECBlocks(7, new ECB(1, 5))),
|
|
183
|
+
new Version(3, 14, 14, 12, 12,
|
|
184
|
+
new ECBlocks(10, new ECB(1, 8))),
|
|
185
|
+
new Version(4, 16, 16, 14, 14,
|
|
186
|
+
new ECBlocks(12, new ECB(1, 12))),
|
|
187
|
+
new Version(5, 18, 18, 16, 16,
|
|
188
|
+
new ECBlocks(14, new ECB(1, 18))),
|
|
189
|
+
new Version(6, 20, 20, 18, 18,
|
|
190
|
+
new ECBlocks(18, new ECB(1, 22))),
|
|
191
|
+
new Version(7, 22, 22, 20, 20,
|
|
192
|
+
new ECBlocks(20, new ECB(1, 30))),
|
|
193
|
+
new Version(8, 24, 24, 22, 22,
|
|
194
|
+
new ECBlocks(24, new ECB(1, 36))),
|
|
195
|
+
new Version(9, 26, 26, 24, 24,
|
|
196
|
+
new ECBlocks(28, new ECB(1, 44))),
|
|
197
|
+
new Version(10, 32, 32, 14, 14,
|
|
198
|
+
new ECBlocks(36, new ECB(1, 62))),
|
|
199
|
+
new Version(11, 36, 36, 16, 16,
|
|
200
|
+
new ECBlocks(42, new ECB(1, 86))),
|
|
201
|
+
new Version(12, 40, 40, 18, 18,
|
|
202
|
+
new ECBlocks(48, new ECB(1, 114))),
|
|
203
|
+
new Version(13, 44, 44, 20, 20,
|
|
204
|
+
new ECBlocks(56, new ECB(1, 144))),
|
|
205
|
+
new Version(14, 48, 48, 22, 22,
|
|
206
|
+
new ECBlocks(68, new ECB(1, 174))),
|
|
207
|
+
new Version(15, 52, 52, 24, 24,
|
|
208
|
+
new ECBlocks(42, new ECB(2, 102))),
|
|
209
|
+
new Version(16, 64, 64, 14, 14,
|
|
210
|
+
new ECBlocks(56, new ECB(2, 140))),
|
|
211
|
+
new Version(17, 72, 72, 16, 16,
|
|
212
|
+
new ECBlocks(36, new ECB(4, 92))),
|
|
213
|
+
new Version(18, 80, 80, 18, 18,
|
|
214
|
+
new ECBlocks(48, new ECB(4, 114))),
|
|
215
|
+
new Version(19, 88, 88, 20, 20,
|
|
216
|
+
new ECBlocks(56, new ECB(4, 144))),
|
|
217
|
+
new Version(20, 96, 96, 22, 22,
|
|
218
|
+
new ECBlocks(68, new ECB(4, 174))),
|
|
219
|
+
new Version(21, 104, 104, 24, 24,
|
|
220
|
+
new ECBlocks(56, new ECB(6, 136))),
|
|
221
|
+
new Version(22, 120, 120, 18, 18,
|
|
222
|
+
new ECBlocks(68, new ECB(6, 175))),
|
|
223
|
+
new Version(23, 132, 132, 20, 20,
|
|
224
|
+
new ECBlocks(62, new ECB(8, 163))),
|
|
225
|
+
new Version(24, 144, 144, 22, 22,
|
|
226
|
+
new ECBlocks(62, new ECB(8, 156), new ECB(2, 155))),
|
|
227
|
+
new Version(25, 8, 18, 6, 16,
|
|
228
|
+
new ECBlocks(7, new ECB(1, 5))),
|
|
229
|
+
new Version(26, 8, 32, 6, 14,
|
|
230
|
+
new ECBlocks(11, new ECB(1, 10))),
|
|
231
|
+
new Version(27, 12, 26, 10, 24,
|
|
232
|
+
new ECBlocks(14, new ECB(1, 16))),
|
|
233
|
+
new Version(28, 12, 36, 10, 16,
|
|
234
|
+
new ECBlocks(18, new ECB(1, 22))),
|
|
235
|
+
new Version(29, 16, 36, 10, 16,
|
|
236
|
+
new ECBlocks(24, new ECB(1, 32))),
|
|
237
|
+
new Version(30, 16, 48, 14, 22,
|
|
238
|
+
new ECBlocks(28, new ECB(1, 49)))
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2008 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.datamatrix.detector;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.NotFoundException;
|
|
20
|
+
import com.google.zxing.ResultPoint;
|
|
21
|
+
import com.google.zxing.common.BitMatrix;
|
|
22
|
+
import com.google.zxing.common.Collections;
|
|
23
|
+
import com.google.zxing.common.Comparator;
|
|
24
|
+
import com.google.zxing.common.DetectorResult;
|
|
25
|
+
import com.google.zxing.common.GridSampler;
|
|
26
|
+
import com.google.zxing.common.detector.WhiteRectangleDetector;
|
|
27
|
+
|
|
28
|
+
import java.util.Enumeration;
|
|
29
|
+
import java.util.Hashtable;
|
|
30
|
+
import java.util.Vector;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* <p>Encapsulates logic that can detect a Data Matrix Code in an image, even if the Data Matrix Code
|
|
34
|
+
* is rotated or skewed, or partially obscured.</p>
|
|
35
|
+
*
|
|
36
|
+
* @author Sean Owen
|
|
37
|
+
*/
|
|
38
|
+
public final class Detector {
|
|
39
|
+
|
|
40
|
+
// Trick to avoid creating new Integer objects below -- a sort of crude copy of
|
|
41
|
+
// the Integer.valueOf(int) optimization added in Java 5, not in J2ME
|
|
42
|
+
private static final Integer[] INTEGERS =
|
|
43
|
+
{ new Integer(0), new Integer(1), new Integer(2), new Integer(3), new Integer(4) };
|
|
44
|
+
// No, can't use valueOf()
|
|
45
|
+
|
|
46
|
+
private final BitMatrix image;
|
|
47
|
+
private final WhiteRectangleDetector rectangleDetector;
|
|
48
|
+
|
|
49
|
+
public Detector(BitMatrix image) {
|
|
50
|
+
this.image = image;
|
|
51
|
+
rectangleDetector = new WhiteRectangleDetector(image);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* <p>Detects a Data Matrix Code in an image.</p>
|
|
56
|
+
*
|
|
57
|
+
* @return {@link DetectorResult} encapsulating results of detecting a Data Matrix Code
|
|
58
|
+
* @throws NotFoundException if no Data Matrix Code can be found
|
|
59
|
+
*/
|
|
60
|
+
public DetectorResult detect() throws NotFoundException {
|
|
61
|
+
|
|
62
|
+
ResultPoint[] cornerPoints = rectangleDetector.detect();
|
|
63
|
+
ResultPoint pointA = cornerPoints[0];
|
|
64
|
+
ResultPoint pointB = cornerPoints[1];
|
|
65
|
+
ResultPoint pointC = cornerPoints[2];
|
|
66
|
+
ResultPoint pointD = cornerPoints[3];
|
|
67
|
+
|
|
68
|
+
// Point A and D are across the diagonal from one another,
|
|
69
|
+
// as are B and C. Figure out which are the solid black lines
|
|
70
|
+
// by counting transitions
|
|
71
|
+
Vector transitions = new Vector(4);
|
|
72
|
+
transitions.addElement(transitionsBetween(pointA, pointB));
|
|
73
|
+
transitions.addElement(transitionsBetween(pointA, pointC));
|
|
74
|
+
transitions.addElement(transitionsBetween(pointB, pointD));
|
|
75
|
+
transitions.addElement(transitionsBetween(pointC, pointD));
|
|
76
|
+
Collections.insertionSort(transitions, new ResultPointsAndTransitionsComparator());
|
|
77
|
+
|
|
78
|
+
// Sort by number of transitions. First two will be the two solid sides; last two
|
|
79
|
+
// will be the two alternating black/white sides
|
|
80
|
+
ResultPointsAndTransitions lSideOne = (ResultPointsAndTransitions) transitions.elementAt(0);
|
|
81
|
+
ResultPointsAndTransitions lSideTwo = (ResultPointsAndTransitions) transitions.elementAt(1);
|
|
82
|
+
|
|
83
|
+
// Figure out which point is their intersection by tallying up the number of times we see the
|
|
84
|
+
// endpoints in the four endpoints. One will show up twice.
|
|
85
|
+
Hashtable pointCount = new Hashtable();
|
|
86
|
+
increment(pointCount, lSideOne.getFrom());
|
|
87
|
+
increment(pointCount, lSideOne.getTo());
|
|
88
|
+
increment(pointCount, lSideTwo.getFrom());
|
|
89
|
+
increment(pointCount, lSideTwo.getTo());
|
|
90
|
+
|
|
91
|
+
ResultPoint maybeTopLeft = null;
|
|
92
|
+
ResultPoint bottomLeft = null;
|
|
93
|
+
ResultPoint maybeBottomRight = null;
|
|
94
|
+
Enumeration points = pointCount.keys();
|
|
95
|
+
while (points.hasMoreElements()) {
|
|
96
|
+
ResultPoint point = (ResultPoint) points.nextElement();
|
|
97
|
+
Integer value = (Integer) pointCount.get(point);
|
|
98
|
+
if (value.intValue() == 2) {
|
|
99
|
+
bottomLeft = point; // this is definitely the bottom left, then -- end of two L sides
|
|
100
|
+
} else {
|
|
101
|
+
// Otherwise it's either top left or bottom right -- just assign the two arbitrarily now
|
|
102
|
+
if (maybeTopLeft == null) {
|
|
103
|
+
maybeTopLeft = point;
|
|
104
|
+
} else {
|
|
105
|
+
maybeBottomRight = point;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) {
|
|
111
|
+
throw NotFoundException.getNotFoundInstance();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Bottom left is correct but top left and bottom right might be switched
|
|
115
|
+
ResultPoint[] corners = { maybeTopLeft, bottomLeft, maybeBottomRight };
|
|
116
|
+
// Use the dot product trick to sort them out
|
|
117
|
+
ResultPoint.orderBestPatterns(corners);
|
|
118
|
+
|
|
119
|
+
// Now we know which is which:
|
|
120
|
+
ResultPoint bottomRight = corners[0];
|
|
121
|
+
bottomLeft = corners[1];
|
|
122
|
+
ResultPoint topLeft = corners[2];
|
|
123
|
+
|
|
124
|
+
// Which point didn't we find in relation to the "L" sides? that's the top right corner
|
|
125
|
+
ResultPoint topRight;
|
|
126
|
+
if (!pointCount.containsKey(pointA)) {
|
|
127
|
+
topRight = pointA;
|
|
128
|
+
} else if (!pointCount.containsKey(pointB)) {
|
|
129
|
+
topRight = pointB;
|
|
130
|
+
} else if (!pointCount.containsKey(pointC)) {
|
|
131
|
+
topRight = pointC;
|
|
132
|
+
} else {
|
|
133
|
+
topRight = pointD;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Next determine the dimension by tracing along the top or right side and counting black/white
|
|
137
|
+
// transitions. Since we start inside a black module, we should see a number of transitions
|
|
138
|
+
// equal to 1 less than the code dimension. Well, actually 2 less, because we are going to
|
|
139
|
+
// end on a black module:
|
|
140
|
+
|
|
141
|
+
// The top right point is actually the corner of a module, which is one of the two black modules
|
|
142
|
+
// adjacent to the white module at the top right. Tracing to that corner from either the top left
|
|
143
|
+
// or bottom right should work here.
|
|
144
|
+
int dimension = Math.min(transitionsBetween(topLeft, topRight).getTransitions(),
|
|
145
|
+
transitionsBetween(bottomRight, topRight).getTransitions());
|
|
146
|
+
if ((dimension & 0x01) == 1) {
|
|
147
|
+
// it can't be odd, so, round... up?
|
|
148
|
+
dimension++;
|
|
149
|
+
}
|
|
150
|
+
dimension += 2;
|
|
151
|
+
|
|
152
|
+
//correct top right point to match the white module
|
|
153
|
+
ResultPoint correctedTopRight = correctTopRight(bottomLeft, bottomRight, topLeft, topRight, dimension);
|
|
154
|
+
if (correctedTopRight == null){
|
|
155
|
+
correctedTopRight = topRight;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//We redetermine the dimension using the corrected top right point
|
|
159
|
+
int dimension2 = Math.max(transitionsBetween(topLeft, correctedTopRight).getTransitions(),
|
|
160
|
+
transitionsBetween(bottomRight, correctedTopRight).getTransitions());
|
|
161
|
+
dimension2++;
|
|
162
|
+
if ((dimension2 & 0x01) == 1) {
|
|
163
|
+
dimension2++;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
BitMatrix bits = sampleGrid(image, topLeft, bottomLeft, bottomRight, correctedTopRight, dimension2);
|
|
167
|
+
|
|
168
|
+
return new DetectorResult(bits, new ResultPoint[]{topLeft, bottomLeft, bottomRight, correctedTopRight});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Calculates the position of the white top right module using the output of the rectangle detector
|
|
173
|
+
*/
|
|
174
|
+
private ResultPoint correctTopRight(ResultPoint bottomLeft,
|
|
175
|
+
ResultPoint bottomRight,
|
|
176
|
+
ResultPoint topLeft,
|
|
177
|
+
ResultPoint topRight,
|
|
178
|
+
int dimension) {
|
|
179
|
+
|
|
180
|
+
float corr = distance(bottomLeft, bottomRight) / (float)dimension;
|
|
181
|
+
int norm = distance(topLeft, topRight);
|
|
182
|
+
float cos = (topRight.getX() - topLeft.getX()) / norm;
|
|
183
|
+
float sin = (topRight.getY() - topLeft.getY()) / norm;
|
|
184
|
+
|
|
185
|
+
ResultPoint c1 = new ResultPoint(topRight.getX()+corr*cos, topRight.getY()+corr*sin);
|
|
186
|
+
|
|
187
|
+
corr = distance(bottomLeft, bottomRight) / (float)dimension;
|
|
188
|
+
norm = distance(bottomRight, topRight);
|
|
189
|
+
cos = (topRight.getX() - bottomRight.getX()) / norm;
|
|
190
|
+
sin = (topRight.getY() - bottomRight.getY()) / norm;
|
|
191
|
+
|
|
192
|
+
ResultPoint c2 = new ResultPoint(topRight.getX()+corr*cos, topRight.getY()+corr*sin);
|
|
193
|
+
|
|
194
|
+
if (!isValid(c1)){
|
|
195
|
+
if (isValid(c2)){
|
|
196
|
+
return c2;
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
} else if (!isValid(c2)){
|
|
200
|
+
return c1;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
int l1 = Math.abs(transitionsBetween(topLeft, c1).getTransitions() - transitionsBetween(bottomRight, c1).getTransitions());
|
|
204
|
+
int l2 = Math.abs(transitionsBetween(topLeft, c2).getTransitions() - transitionsBetween(bottomRight, c2).getTransitions());
|
|
205
|
+
|
|
206
|
+
if (l1 <= l2){
|
|
207
|
+
return c1;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return c2;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private boolean isValid(ResultPoint p) {
|
|
214
|
+
return (p.getX() >= 0 && p.getX() < image.width && p.getY() > 0 && p.getY() < image.height);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Ends up being a bit faster than Math.round(). This merely rounds its
|
|
219
|
+
* argument to the nearest int, where x.5 rounds up.
|
|
220
|
+
*/
|
|
221
|
+
private static int round(float d) {
|
|
222
|
+
return (int) (d + 0.5f);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// L2 distance
|
|
226
|
+
private static int distance(ResultPoint a, ResultPoint b) {
|
|
227
|
+
return round((float) Math.sqrt((a.getX() - b.getX())
|
|
228
|
+
* (a.getX() - b.getX()) + (a.getY() - b.getY())
|
|
229
|
+
* (a.getY() - b.getY())));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Increments the Integer associated with a key by one.
|
|
234
|
+
*/
|
|
235
|
+
private static void increment(Hashtable table, ResultPoint key) {
|
|
236
|
+
Integer value = (Integer) table.get(key);
|
|
237
|
+
table.put(key, value == null ? INTEGERS[1] : INTEGERS[value.intValue() + 1]);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
private static BitMatrix sampleGrid(BitMatrix image,
|
|
241
|
+
ResultPoint topLeft,
|
|
242
|
+
ResultPoint bottomLeft,
|
|
243
|
+
ResultPoint bottomRight,
|
|
244
|
+
ResultPoint topRight,
|
|
245
|
+
int dimension) throws NotFoundException {
|
|
246
|
+
|
|
247
|
+
GridSampler sampler = GridSampler.getInstance();
|
|
248
|
+
|
|
249
|
+
return sampler.sampleGrid(image,
|
|
250
|
+
dimension,
|
|
251
|
+
0.5f,
|
|
252
|
+
0.5f,
|
|
253
|
+
dimension - 0.5f,
|
|
254
|
+
0.5f,
|
|
255
|
+
dimension - 0.5f,
|
|
256
|
+
dimension - 0.5f,
|
|
257
|
+
0.5f,
|
|
258
|
+
dimension - 0.5f,
|
|
259
|
+
topLeft.getX(),
|
|
260
|
+
topLeft.getY(),
|
|
261
|
+
topRight.getX(),
|
|
262
|
+
topRight.getY(),
|
|
263
|
+
bottomRight.getX(),
|
|
264
|
+
bottomRight.getY(),
|
|
265
|
+
bottomLeft.getX(),
|
|
266
|
+
bottomLeft.getY());
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Counts the number of black/white transitions between two points, using something like Bresenham's algorithm.
|
|
271
|
+
*/
|
|
272
|
+
private ResultPointsAndTransitions transitionsBetween(ResultPoint from, ResultPoint to) {
|
|
273
|
+
// See QR Code Detector, sizeOfBlackWhiteBlackRun()
|
|
274
|
+
int fromX = (int) from.getX();
|
|
275
|
+
int fromY = (int) from.getY();
|
|
276
|
+
int toX = (int) to.getX();
|
|
277
|
+
int toY = (int) to.getY();
|
|
278
|
+
boolean steep = Math.abs(toY - fromY) > Math.abs(toX - fromX);
|
|
279
|
+
if (steep) {
|
|
280
|
+
int temp = fromX;
|
|
281
|
+
fromX = fromY;
|
|
282
|
+
fromY = temp;
|
|
283
|
+
temp = toX;
|
|
284
|
+
toX = toY;
|
|
285
|
+
toY = temp;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
int dx = Math.abs(toX - fromX);
|
|
289
|
+
int dy = Math.abs(toY - fromY);
|
|
290
|
+
int error = -dx >> 1;
|
|
291
|
+
int ystep = fromY < toY ? 1 : -1;
|
|
292
|
+
int xstep = fromX < toX ? 1 : -1;
|
|
293
|
+
int transitions = 0;
|
|
294
|
+
boolean inBlack = image.get(steep ? fromY : fromX, steep ? fromX : fromY);
|
|
295
|
+
for (int x = fromX, y = fromY; x != toX; x += xstep) {
|
|
296
|
+
boolean isBlack = image.get(steep ? y : x, steep ? x : y);
|
|
297
|
+
if (isBlack != inBlack) {
|
|
298
|
+
transitions++;
|
|
299
|
+
inBlack = isBlack;
|
|
300
|
+
}
|
|
301
|
+
error += dy;
|
|
302
|
+
if (error > 0) {
|
|
303
|
+
if (y == toY) {
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
y += ystep;
|
|
307
|
+
error -= dx;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return new ResultPointsAndTransitions(from, to, transitions);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Simply encapsulates two points and a number of transitions between them.
|
|
315
|
+
*/
|
|
316
|
+
private static class ResultPointsAndTransitions {
|
|
317
|
+
private final ResultPoint from;
|
|
318
|
+
private final ResultPoint to;
|
|
319
|
+
private final int transitions;
|
|
320
|
+
private ResultPointsAndTransitions(ResultPoint from, ResultPoint to, int transitions) {
|
|
321
|
+
this.from = from;
|
|
322
|
+
this.to = to;
|
|
323
|
+
this.transitions = transitions;
|
|
324
|
+
}
|
|
325
|
+
public ResultPoint getFrom() {
|
|
326
|
+
return from;
|
|
327
|
+
}
|
|
328
|
+
public ResultPoint getTo() {
|
|
329
|
+
return to;
|
|
330
|
+
}
|
|
331
|
+
public int getTransitions() {
|
|
332
|
+
return transitions;
|
|
333
|
+
}
|
|
334
|
+
public String toString() {
|
|
335
|
+
return from + "/" + to + '/' + transitions;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Orders ResultPointsAndTransitions by number of transitions, ascending.
|
|
341
|
+
*/
|
|
342
|
+
private static class ResultPointsAndTransitionsComparator implements Comparator {
|
|
343
|
+
public int compare(Object o1, Object o2) {
|
|
344
|
+
return ((ResultPointsAndTransitions) o1).getTransitions() - ((ResultPointsAndTransitions) o2).getTransitions();
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
}
|