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,48 @@
|
|
|
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.qrcode.detector;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.ResultPoint;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* <p>Encapsulates an alignment pattern, which are the smaller square patterns found in
|
|
23
|
+
* all but the simplest QR Codes.</p>
|
|
24
|
+
*
|
|
25
|
+
* @author Sean Owen
|
|
26
|
+
*/
|
|
27
|
+
public final class AlignmentPattern extends ResultPoint {
|
|
28
|
+
|
|
29
|
+
private final float estimatedModuleSize;
|
|
30
|
+
|
|
31
|
+
AlignmentPattern(float posX, float posY, float estimatedModuleSize) {
|
|
32
|
+
super(posX, posY);
|
|
33
|
+
this.estimatedModuleSize = estimatedModuleSize;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* <p>Determines if this alignment pattern "about equals" an alignment pattern at the stated
|
|
38
|
+
* position and size -- meaning, it is at nearly the same center with nearly the same size.</p>
|
|
39
|
+
*/
|
|
40
|
+
boolean aboutEquals(float moduleSize, float i, float j) {
|
|
41
|
+
if (Math.abs(i - getY()) <= moduleSize && Math.abs(j - getX()) <= moduleSize) {
|
|
42
|
+
float moduleSizeDiff = Math.abs(moduleSize - estimatedModuleSize);
|
|
43
|
+
return moduleSizeDiff <= 1.0f || moduleSizeDiff / estimatedModuleSize <= 1.0f;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
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.qrcode.detector;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.NotFoundException;
|
|
20
|
+
import com.google.zxing.ResultPoint;
|
|
21
|
+
import com.google.zxing.ResultPointCallback;
|
|
22
|
+
import com.google.zxing.common.BitMatrix;
|
|
23
|
+
|
|
24
|
+
import java.util.Vector;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* <p>This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder
|
|
28
|
+
* patterns but are smaller and appear at regular intervals throughout the image.</p>
|
|
29
|
+
*
|
|
30
|
+
* <p>At the moment this only looks for the bottom-right alignment pattern.</p>
|
|
31
|
+
*
|
|
32
|
+
* <p>This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied,
|
|
33
|
+
* pasted and stripped down here for maximum performance but does unfortunately duplicate
|
|
34
|
+
* some code.</p>
|
|
35
|
+
*
|
|
36
|
+
* <p>This class is thread-safe but not reentrant. Each thread must allocate its own object.
|
|
37
|
+
*
|
|
38
|
+
* @author Sean Owen
|
|
39
|
+
*/
|
|
40
|
+
final class AlignmentPatternFinder {
|
|
41
|
+
|
|
42
|
+
private final BitMatrix image;
|
|
43
|
+
private final Vector possibleCenters;
|
|
44
|
+
private final int startX;
|
|
45
|
+
private final int startY;
|
|
46
|
+
private final int width;
|
|
47
|
+
private final int height;
|
|
48
|
+
private final float moduleSize;
|
|
49
|
+
private final int[] crossCheckStateCount;
|
|
50
|
+
private final ResultPointCallback resultPointCallback;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* <p>Creates a finder that will look in a portion of the whole image.</p>
|
|
54
|
+
*
|
|
55
|
+
* @param image image to search
|
|
56
|
+
* @param startX left column from which to start searching
|
|
57
|
+
* @param startY top row from which to start searching
|
|
58
|
+
* @param width width of region to search
|
|
59
|
+
* @param height height of region to search
|
|
60
|
+
* @param moduleSize estimated module size so far
|
|
61
|
+
*/
|
|
62
|
+
AlignmentPatternFinder(BitMatrix image,
|
|
63
|
+
int startX,
|
|
64
|
+
int startY,
|
|
65
|
+
int width,
|
|
66
|
+
int height,
|
|
67
|
+
float moduleSize,
|
|
68
|
+
ResultPointCallback resultPointCallback) {
|
|
69
|
+
this.image = image;
|
|
70
|
+
this.possibleCenters = new Vector(5);
|
|
71
|
+
this.startX = startX;
|
|
72
|
+
this.startY = startY;
|
|
73
|
+
this.width = width;
|
|
74
|
+
this.height = height;
|
|
75
|
+
this.moduleSize = moduleSize;
|
|
76
|
+
this.crossCheckStateCount = new int[3];
|
|
77
|
+
this.resultPointCallback = resultPointCallback;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* <p>This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since
|
|
82
|
+
* it's pretty performance-critical and so is written to be fast foremost.</p>
|
|
83
|
+
*
|
|
84
|
+
* @return {@link AlignmentPattern} if found
|
|
85
|
+
* @throws NotFoundException if not found
|
|
86
|
+
*/
|
|
87
|
+
AlignmentPattern find() throws NotFoundException {
|
|
88
|
+
int startX = this.startX;
|
|
89
|
+
int height = this.height;
|
|
90
|
+
int maxJ = startX + width;
|
|
91
|
+
int middleI = startY + (height >> 1);
|
|
92
|
+
// We are looking for black/white/black modules in 1:1:1 ratio;
|
|
93
|
+
// this tracks the number of black/white/black modules seen so far
|
|
94
|
+
int[] stateCount = new int[3];
|
|
95
|
+
for (int iGen = 0; iGen < height; iGen++) {
|
|
96
|
+
// Search from middle outwards
|
|
97
|
+
int i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));
|
|
98
|
+
stateCount[0] = 0;
|
|
99
|
+
stateCount[1] = 0;
|
|
100
|
+
stateCount[2] = 0;
|
|
101
|
+
int j = startX;
|
|
102
|
+
// Burn off leading white pixels before anything else; if we start in the middle of
|
|
103
|
+
// a white run, it doesn't make sense to count its length, since we don't know if the
|
|
104
|
+
// white run continued to the left of the start point
|
|
105
|
+
while (j < maxJ && !image.get(j, i)) {
|
|
106
|
+
j++;
|
|
107
|
+
}
|
|
108
|
+
int currentState = 0;
|
|
109
|
+
while (j < maxJ) {
|
|
110
|
+
if (image.get(j, i)) {
|
|
111
|
+
// Black pixel
|
|
112
|
+
if (currentState == 1) { // Counting black pixels
|
|
113
|
+
stateCount[currentState]++;
|
|
114
|
+
} else { // Counting white pixels
|
|
115
|
+
if (currentState == 2) { // A winner?
|
|
116
|
+
if (foundPatternCross(stateCount)) { // Yes
|
|
117
|
+
AlignmentPattern confirmed = handlePossibleCenter(stateCount, i, j);
|
|
118
|
+
if (confirmed != null) {
|
|
119
|
+
return confirmed;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
stateCount[0] = stateCount[2];
|
|
123
|
+
stateCount[1] = 1;
|
|
124
|
+
stateCount[2] = 0;
|
|
125
|
+
currentState = 1;
|
|
126
|
+
} else {
|
|
127
|
+
stateCount[++currentState]++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
} else { // White pixel
|
|
131
|
+
if (currentState == 1) { // Counting black pixels
|
|
132
|
+
currentState++;
|
|
133
|
+
}
|
|
134
|
+
stateCount[currentState]++;
|
|
135
|
+
}
|
|
136
|
+
j++;
|
|
137
|
+
}
|
|
138
|
+
if (foundPatternCross(stateCount)) {
|
|
139
|
+
AlignmentPattern confirmed = handlePossibleCenter(stateCount, i, maxJ);
|
|
140
|
+
if (confirmed != null) {
|
|
141
|
+
return confirmed;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Hmm, nothing we saw was observed and confirmed twice. If we had
|
|
148
|
+
// any guess at all, return it.
|
|
149
|
+
if (!possibleCenters.isEmpty()) {
|
|
150
|
+
return (AlignmentPattern) possibleCenters.elementAt(0);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
throw NotFoundException.getNotFoundInstance();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Given a count of black/white/black pixels just seen and an end position,
|
|
158
|
+
* figures the location of the center of this black/white/black run.
|
|
159
|
+
*/
|
|
160
|
+
private static float centerFromEnd(int[] stateCount, int end) {
|
|
161
|
+
return (float) (end - stateCount[2]) - stateCount[1] / 2.0f;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @param stateCount count of black/white/black pixels just read
|
|
166
|
+
* @return true iff the proportions of the counts is close enough to the 1/1/1 ratios
|
|
167
|
+
* used by alignment patterns to be considered a match
|
|
168
|
+
*/
|
|
169
|
+
private boolean foundPatternCross(int[] stateCount) {
|
|
170
|
+
float moduleSize = this.moduleSize;
|
|
171
|
+
float maxVariance = moduleSize / 2.0f;
|
|
172
|
+
for (int i = 0; i < 3; i++) {
|
|
173
|
+
if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* <p>After a horizontal scan finds a potential alignment pattern, this method
|
|
182
|
+
* "cross-checks" by scanning down vertically through the center of the possible
|
|
183
|
+
* alignment pattern to see if the same proportion is detected.</p>
|
|
184
|
+
*
|
|
185
|
+
* @param startI row where an alignment pattern was detected
|
|
186
|
+
* @param centerJ center of the section that appears to cross an alignment pattern
|
|
187
|
+
* @param maxCount maximum reasonable number of modules that should be
|
|
188
|
+
* observed in any reading state, based on the results of the horizontal scan
|
|
189
|
+
* @return vertical center of alignment pattern, or {@link Float#NaN} if not found
|
|
190
|
+
*/
|
|
191
|
+
private float crossCheckVertical(int startI, int centerJ, int maxCount,
|
|
192
|
+
int originalStateCountTotal) {
|
|
193
|
+
BitMatrix image = this.image;
|
|
194
|
+
|
|
195
|
+
int maxI = image.getHeight();
|
|
196
|
+
int[] stateCount = crossCheckStateCount;
|
|
197
|
+
stateCount[0] = 0;
|
|
198
|
+
stateCount[1] = 0;
|
|
199
|
+
stateCount[2] = 0;
|
|
200
|
+
|
|
201
|
+
// Start counting up from center
|
|
202
|
+
int i = startI;
|
|
203
|
+
while (i >= 0 && image.get(centerJ, i) && stateCount[1] <= maxCount) {
|
|
204
|
+
stateCount[1]++;
|
|
205
|
+
i--;
|
|
206
|
+
}
|
|
207
|
+
// If already too many modules in this state or ran off the edge:
|
|
208
|
+
if (i < 0 || stateCount[1] > maxCount) {
|
|
209
|
+
return Float.NaN;
|
|
210
|
+
}
|
|
211
|
+
while (i >= 0 && !image.get(centerJ, i) && stateCount[0] <= maxCount) {
|
|
212
|
+
stateCount[0]++;
|
|
213
|
+
i--;
|
|
214
|
+
}
|
|
215
|
+
if (stateCount[0] > maxCount) {
|
|
216
|
+
return Float.NaN;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Now also count down from center
|
|
220
|
+
i = startI + 1;
|
|
221
|
+
while (i < maxI && image.get(centerJ, i) && stateCount[1] <= maxCount) {
|
|
222
|
+
stateCount[1]++;
|
|
223
|
+
i++;
|
|
224
|
+
}
|
|
225
|
+
if (i == maxI || stateCount[1] > maxCount) {
|
|
226
|
+
return Float.NaN;
|
|
227
|
+
}
|
|
228
|
+
while (i < maxI && !image.get(centerJ, i) && stateCount[2] <= maxCount) {
|
|
229
|
+
stateCount[2]++;
|
|
230
|
+
i++;
|
|
231
|
+
}
|
|
232
|
+
if (stateCount[2] > maxCount) {
|
|
233
|
+
return Float.NaN;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
|
|
237
|
+
if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) {
|
|
238
|
+
return Float.NaN;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : Float.NaN;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* <p>This is called when a horizontal scan finds a possible alignment pattern. It will
|
|
246
|
+
* cross check with a vertical scan, and if successful, will see if this pattern had been
|
|
247
|
+
* found on a previous horizontal scan. If so, we consider it confirmed and conclude we have
|
|
248
|
+
* found the alignment pattern.</p>
|
|
249
|
+
*
|
|
250
|
+
* @param stateCount reading state module counts from horizontal scan
|
|
251
|
+
* @param i row where alignment pattern may be found
|
|
252
|
+
* @param j end of possible alignment pattern in row
|
|
253
|
+
* @return {@link AlignmentPattern} if we have found the same pattern twice, or null if not
|
|
254
|
+
*/
|
|
255
|
+
private AlignmentPattern handlePossibleCenter(int[] stateCount, int i, int j) {
|
|
256
|
+
int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
|
|
257
|
+
float centerJ = centerFromEnd(stateCount, j);
|
|
258
|
+
float centerI = crossCheckVertical(i, (int) centerJ, 2 * stateCount[1], stateCountTotal);
|
|
259
|
+
if (!Float.isNaN(centerI)) {
|
|
260
|
+
float estimatedModuleSize = (float) (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f;
|
|
261
|
+
int max = possibleCenters.size();
|
|
262
|
+
for (int index = 0; index < max; index++) {
|
|
263
|
+
AlignmentPattern center = (AlignmentPattern) possibleCenters.elementAt(index);
|
|
264
|
+
// Look for about the same center and module size:
|
|
265
|
+
if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) {
|
|
266
|
+
return new AlignmentPattern(centerJ, centerI, estimatedModuleSize);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Hadn't found this before; save it
|
|
270
|
+
ResultPoint point = new AlignmentPattern(centerJ, centerI, estimatedModuleSize);
|
|
271
|
+
possibleCenters.addElement(point);
|
|
272
|
+
if (resultPointCallback != null) {
|
|
273
|
+
resultPointCallback.foundPossibleResultPoint(point);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
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.qrcode.detector;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.DecodeHintType;
|
|
20
|
+
import com.google.zxing.FormatException;
|
|
21
|
+
import com.google.zxing.NotFoundException;
|
|
22
|
+
import com.google.zxing.ResultPoint;
|
|
23
|
+
import com.google.zxing.ResultPointCallback;
|
|
24
|
+
import com.google.zxing.common.BitMatrix;
|
|
25
|
+
import com.google.zxing.common.DetectorResult;
|
|
26
|
+
import com.google.zxing.common.GridSampler;
|
|
27
|
+
import com.google.zxing.common.PerspectiveTransform;
|
|
28
|
+
import com.google.zxing.qrcode.decoder.Version;
|
|
29
|
+
|
|
30
|
+
import java.util.Hashtable;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* <p>Encapsulates logic that can detect a QR Code in an image, even if the QR Code
|
|
34
|
+
* is rotated or skewed, or partially obscured.</p>
|
|
35
|
+
*
|
|
36
|
+
* @author Sean Owen
|
|
37
|
+
*/
|
|
38
|
+
public class Detector {
|
|
39
|
+
|
|
40
|
+
private final BitMatrix image;
|
|
41
|
+
private ResultPointCallback resultPointCallback;
|
|
42
|
+
|
|
43
|
+
public Detector(BitMatrix image) {
|
|
44
|
+
this.image = image;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected BitMatrix getImage() {
|
|
48
|
+
return image;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
protected ResultPointCallback getResultPointCallback() {
|
|
52
|
+
return resultPointCallback;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* <p>Detects a QR Code in an image, simply.</p>
|
|
57
|
+
*
|
|
58
|
+
* @return {@link DetectorResult} encapsulating results of detecting a QR Code
|
|
59
|
+
* @throws NotFoundException if no QR Code can be found
|
|
60
|
+
*/
|
|
61
|
+
public DetectorResult detect() throws NotFoundException, FormatException {
|
|
62
|
+
return detect(null);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* <p>Detects a QR Code in an image, simply.</p>
|
|
67
|
+
*
|
|
68
|
+
* @param hints optional hints to detector
|
|
69
|
+
* @return {@link NotFoundException} encapsulating results of detecting a QR Code
|
|
70
|
+
* @throws NotFoundException if QR Code cannot be found
|
|
71
|
+
* @throws FormatException if a QR Code cannot be decoded
|
|
72
|
+
*/
|
|
73
|
+
public DetectorResult detect(Hashtable hints) throws NotFoundException, FormatException {
|
|
74
|
+
|
|
75
|
+
resultPointCallback = hints == null ? null :
|
|
76
|
+
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
|
|
77
|
+
|
|
78
|
+
FinderPatternFinder finder = new FinderPatternFinder(image, resultPointCallback);
|
|
79
|
+
FinderPatternInfo info = finder.find(hints);
|
|
80
|
+
|
|
81
|
+
return processFinderPatternInfo(info);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected DetectorResult processFinderPatternInfo(FinderPatternInfo info)
|
|
85
|
+
throws NotFoundException, FormatException {
|
|
86
|
+
|
|
87
|
+
FinderPattern topLeft = info.getTopLeft();
|
|
88
|
+
FinderPattern topRight = info.getTopRight();
|
|
89
|
+
FinderPattern bottomLeft = info.getBottomLeft();
|
|
90
|
+
|
|
91
|
+
float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft);
|
|
92
|
+
if (moduleSize < 1.0f) {
|
|
93
|
+
throw NotFoundException.getNotFoundInstance();
|
|
94
|
+
}
|
|
95
|
+
int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize);
|
|
96
|
+
Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension);
|
|
97
|
+
int modulesBetweenFPCenters = provisionalVersion.getDimensionForVersion() - 7;
|
|
98
|
+
|
|
99
|
+
AlignmentPattern alignmentPattern = null;
|
|
100
|
+
// Anything above version 1 has an alignment pattern
|
|
101
|
+
if (provisionalVersion.getAlignmentPatternCenters().length > 0) {
|
|
102
|
+
|
|
103
|
+
// Guess where a "bottom right" finder pattern would have been
|
|
104
|
+
float bottomRightX = topRight.getX() - topLeft.getX() + bottomLeft.getX();
|
|
105
|
+
float bottomRightY = topRight.getY() - topLeft.getY() + bottomLeft.getY();
|
|
106
|
+
|
|
107
|
+
// Estimate that alignment pattern is closer by 3 modules
|
|
108
|
+
// from "bottom right" to known top left location
|
|
109
|
+
float correctionToTopLeft = 1.0f - 3.0f / (float) modulesBetweenFPCenters;
|
|
110
|
+
int estAlignmentX = (int) (topLeft.getX() + correctionToTopLeft * (bottomRightX - topLeft.getX()));
|
|
111
|
+
int estAlignmentY = (int) (topLeft.getY() + correctionToTopLeft * (bottomRightY - topLeft.getY()));
|
|
112
|
+
|
|
113
|
+
// Kind of arbitrary -- expand search radius before giving up
|
|
114
|
+
for (int i = 4; i <= 16; i <<= 1) {
|
|
115
|
+
try {
|
|
116
|
+
alignmentPattern = findAlignmentInRegion(moduleSize,
|
|
117
|
+
estAlignmentX,
|
|
118
|
+
estAlignmentY,
|
|
119
|
+
(float) i);
|
|
120
|
+
break;
|
|
121
|
+
} catch (NotFoundException re) {
|
|
122
|
+
// try next round
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// If we didn't find alignment pattern... well try anyway without it
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
PerspectiveTransform transform =
|
|
129
|
+
createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension);
|
|
130
|
+
|
|
131
|
+
BitMatrix bits = sampleGrid(image, transform, dimension);
|
|
132
|
+
|
|
133
|
+
ResultPoint[] points;
|
|
134
|
+
if (alignmentPattern == null) {
|
|
135
|
+
points = new ResultPoint[]{bottomLeft, topLeft, topRight};
|
|
136
|
+
} else {
|
|
137
|
+
points = new ResultPoint[]{bottomLeft, topLeft, topRight, alignmentPattern};
|
|
138
|
+
}
|
|
139
|
+
return new DetectorResult(bits, points);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public PerspectiveTransform createTransform(ResultPoint topLeft,
|
|
143
|
+
ResultPoint topRight,
|
|
144
|
+
ResultPoint bottomLeft,
|
|
145
|
+
ResultPoint alignmentPattern,
|
|
146
|
+
int dimension) {
|
|
147
|
+
float dimMinusThree = (float) dimension - 3.5f;
|
|
148
|
+
float bottomRightX;
|
|
149
|
+
float bottomRightY;
|
|
150
|
+
float sourceBottomRightX;
|
|
151
|
+
float sourceBottomRightY;
|
|
152
|
+
if (alignmentPattern != null) {
|
|
153
|
+
bottomRightX = alignmentPattern.getX();
|
|
154
|
+
bottomRightY = alignmentPattern.getY();
|
|
155
|
+
sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0f;
|
|
156
|
+
} else {
|
|
157
|
+
// Don't have an alignment pattern, just make up the bottom-right point
|
|
158
|
+
bottomRightX = (topRight.getX() - topLeft.getX()) + bottomLeft.getX();
|
|
159
|
+
bottomRightY = (topRight.getY() - topLeft.getY()) + bottomLeft.getY();
|
|
160
|
+
sourceBottomRightX = sourceBottomRightY = dimMinusThree;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return PerspectiveTransform.quadrilateralToQuadrilateral(
|
|
164
|
+
3.5f,
|
|
165
|
+
3.5f,
|
|
166
|
+
dimMinusThree,
|
|
167
|
+
3.5f,
|
|
168
|
+
sourceBottomRightX,
|
|
169
|
+
sourceBottomRightY,
|
|
170
|
+
3.5f,
|
|
171
|
+
dimMinusThree,
|
|
172
|
+
topLeft.getX(),
|
|
173
|
+
topLeft.getY(),
|
|
174
|
+
topRight.getX(),
|
|
175
|
+
topRight.getY(),
|
|
176
|
+
bottomRightX,
|
|
177
|
+
bottomRightY,
|
|
178
|
+
bottomLeft.getX(),
|
|
179
|
+
bottomLeft.getY());
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private static BitMatrix sampleGrid(BitMatrix image,
|
|
183
|
+
PerspectiveTransform transform,
|
|
184
|
+
int dimension) throws NotFoundException {
|
|
185
|
+
|
|
186
|
+
GridSampler sampler = GridSampler.getInstance();
|
|
187
|
+
return sampler.sampleGrid(image, dimension, transform);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* <p>Computes the dimension (number of modules on a size) of the QR Code based on the position
|
|
192
|
+
* of the finder patterns and estimated module size.</p>
|
|
193
|
+
*/
|
|
194
|
+
protected static int computeDimension(ResultPoint topLeft,
|
|
195
|
+
ResultPoint topRight,
|
|
196
|
+
ResultPoint bottomLeft,
|
|
197
|
+
float moduleSize) throws NotFoundException {
|
|
198
|
+
int tltrCentersDimension = round(ResultPoint.distance(topLeft, topRight) / moduleSize);
|
|
199
|
+
int tlblCentersDimension = round(ResultPoint.distance(topLeft, bottomLeft) / moduleSize);
|
|
200
|
+
int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;
|
|
201
|
+
switch (dimension & 0x03) { // mod 4
|
|
202
|
+
case 0:
|
|
203
|
+
dimension++;
|
|
204
|
+
break;
|
|
205
|
+
// 1? do nothing
|
|
206
|
+
case 2:
|
|
207
|
+
dimension--;
|
|
208
|
+
break;
|
|
209
|
+
case 3:
|
|
210
|
+
throw NotFoundException.getNotFoundInstance();
|
|
211
|
+
}
|
|
212
|
+
return dimension;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* <p>Computes an average estimated module size based on estimated derived from the positions
|
|
217
|
+
* of the three finder patterns.</p>
|
|
218
|
+
*/
|
|
219
|
+
protected float calculateModuleSize(ResultPoint topLeft,
|
|
220
|
+
ResultPoint topRight,
|
|
221
|
+
ResultPoint bottomLeft) {
|
|
222
|
+
// Take the average
|
|
223
|
+
return (calculateModuleSizeOneWay(topLeft, topRight) +
|
|
224
|
+
calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0f;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* <p>Estimates module size based on two finder patterns -- it uses
|
|
229
|
+
* {@link #sizeOfBlackWhiteBlackRunBothWays(int, int, int, int)} to figure the
|
|
230
|
+
* width of each, measuring along the axis between their centers.</p>
|
|
231
|
+
*/
|
|
232
|
+
private float calculateModuleSizeOneWay(ResultPoint pattern, ResultPoint otherPattern) {
|
|
233
|
+
float moduleSizeEst1 = sizeOfBlackWhiteBlackRunBothWays((int) pattern.getX(),
|
|
234
|
+
(int) pattern.getY(),
|
|
235
|
+
(int) otherPattern.getX(),
|
|
236
|
+
(int) otherPattern.getY());
|
|
237
|
+
float moduleSizeEst2 = sizeOfBlackWhiteBlackRunBothWays((int) otherPattern.getX(),
|
|
238
|
+
(int) otherPattern.getY(),
|
|
239
|
+
(int) pattern.getX(),
|
|
240
|
+
(int) pattern.getY());
|
|
241
|
+
if (Float.isNaN(moduleSizeEst1)) {
|
|
242
|
+
return moduleSizeEst2 / 7.0f;
|
|
243
|
+
}
|
|
244
|
+
if (Float.isNaN(moduleSizeEst2)) {
|
|
245
|
+
return moduleSizeEst1 / 7.0f;
|
|
246
|
+
}
|
|
247
|
+
// Average them, and divide by 7 since we've counted the width of 3 black modules,
|
|
248
|
+
// and 1 white and 1 black module on either side. Ergo, divide sum by 14.
|
|
249
|
+
return (moduleSizeEst1 + moduleSizeEst2) / 14.0f;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* See {@link #sizeOfBlackWhiteBlackRun(int, int, int, int)}; computes the total width of
|
|
254
|
+
* a finder pattern by looking for a black-white-black run from the center in the direction
|
|
255
|
+
* of another point (another finder pattern center), and in the opposite direction too.</p>
|
|
256
|
+
*/
|
|
257
|
+
private float sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY) {
|
|
258
|
+
|
|
259
|
+
float result = sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY);
|
|
260
|
+
|
|
261
|
+
// Now count other way -- don't run off image though of course
|
|
262
|
+
float scale = 1.0f;
|
|
263
|
+
int otherToX = fromX - (toX - fromX);
|
|
264
|
+
if (otherToX < 0) {
|
|
265
|
+
scale = (float) fromX / (float) (fromX - otherToX);
|
|
266
|
+
otherToX = 0;
|
|
267
|
+
} else if (otherToX > image.getWidth()) {
|
|
268
|
+
scale = (float) (image.getWidth() - fromX) / (float) (otherToX - fromX);
|
|
269
|
+
otherToX = image.getWidth();
|
|
270
|
+
}
|
|
271
|
+
int otherToY = (int) (fromY - (toY - fromY) * scale);
|
|
272
|
+
|
|
273
|
+
scale = 1.0f;
|
|
274
|
+
if (otherToY < 0) {
|
|
275
|
+
scale = (float) fromY / (float) (fromY - otherToY);
|
|
276
|
+
otherToY = 0;
|
|
277
|
+
} else if (otherToY > image.getHeight()) {
|
|
278
|
+
scale = (float) (image.getHeight() - fromY) / (float) (otherToY - fromY);
|
|
279
|
+
otherToY = image.getHeight();
|
|
280
|
+
}
|
|
281
|
+
otherToX = (int) (fromX + (otherToX - fromX) * scale);
|
|
282
|
+
|
|
283
|
+
result += sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* <p>This method traces a line from a point in the image, in the direction towards another point.
|
|
289
|
+
* It begins in a black region, and keeps going until it finds white, then black, then white again.
|
|
290
|
+
* It reports the distance from the start to this point.</p>
|
|
291
|
+
*
|
|
292
|
+
* <p>This is used when figuring out how wide a finder pattern is, when the finder pattern
|
|
293
|
+
* may be skewed or rotated.</p>
|
|
294
|
+
*/
|
|
295
|
+
private float sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY) {
|
|
296
|
+
// Mild variant of Bresenham's algorithm;
|
|
297
|
+
// see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm
|
|
298
|
+
boolean steep = Math.abs(toY - fromY) > Math.abs(toX - fromX);
|
|
299
|
+
if (steep) {
|
|
300
|
+
int temp = fromX;
|
|
301
|
+
fromX = fromY;
|
|
302
|
+
fromY = temp;
|
|
303
|
+
temp = toX;
|
|
304
|
+
toX = toY;
|
|
305
|
+
toY = temp;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
int dx = Math.abs(toX - fromX);
|
|
309
|
+
int dy = Math.abs(toY - fromY);
|
|
310
|
+
int error = -dx >> 1;
|
|
311
|
+
int ystep = fromY < toY ? 1 : -1;
|
|
312
|
+
int xstep = fromX < toX ? 1 : -1;
|
|
313
|
+
int state = 0; // In black pixels, looking for white, first or second time
|
|
314
|
+
for (int x = fromX, y = fromY; x != toX; x += xstep) {
|
|
315
|
+
|
|
316
|
+
int realX = steep ? y : x;
|
|
317
|
+
int realY = steep ? x : y;
|
|
318
|
+
if (state == 1) { // In white pixels, looking for black
|
|
319
|
+
if (image.get(realX, realY)) {
|
|
320
|
+
state++;
|
|
321
|
+
}
|
|
322
|
+
} else {
|
|
323
|
+
if (!image.get(realX, realY)) {
|
|
324
|
+
state++;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (state == 3) { // Found black, white, black, and stumbled back onto white; done
|
|
329
|
+
int diffX = x - fromX;
|
|
330
|
+
int diffY = y - fromY;
|
|
331
|
+
if (xstep < 0) {
|
|
332
|
+
diffX++;
|
|
333
|
+
}
|
|
334
|
+
return (float) Math.sqrt((double) (diffX * diffX + diffY * diffY));
|
|
335
|
+
}
|
|
336
|
+
error += dy;
|
|
337
|
+
if (error > 0) {
|
|
338
|
+
if (y == toY) {
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
y += ystep;
|
|
342
|
+
error -= dx;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
int diffX = toX - fromX;
|
|
346
|
+
int diffY = toY - fromY;
|
|
347
|
+
return (float) Math.sqrt((double) (diffX * diffX + diffY * diffY));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* <p>Attempts to locate an alignment pattern in a limited region of the image, which is
|
|
352
|
+
* guessed to contain it. This method uses {@link AlignmentPattern}.</p>
|
|
353
|
+
*
|
|
354
|
+
* @param overallEstModuleSize estimated module size so far
|
|
355
|
+
* @param estAlignmentX x coordinate of center of area probably containing alignment pattern
|
|
356
|
+
* @param estAlignmentY y coordinate of above
|
|
357
|
+
* @param allowanceFactor number of pixels in all directions to search from the center
|
|
358
|
+
* @return {@link AlignmentPattern} if found, or null otherwise
|
|
359
|
+
* @throws NotFoundException if an unexpected error occurs during detection
|
|
360
|
+
*/
|
|
361
|
+
protected AlignmentPattern findAlignmentInRegion(float overallEstModuleSize,
|
|
362
|
+
int estAlignmentX,
|
|
363
|
+
int estAlignmentY,
|
|
364
|
+
float allowanceFactor)
|
|
365
|
+
throws NotFoundException {
|
|
366
|
+
// Look for an alignment pattern (3 modules in size) around where it
|
|
367
|
+
// should be
|
|
368
|
+
int allowance = (int) (allowanceFactor * overallEstModuleSize);
|
|
369
|
+
int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance);
|
|
370
|
+
int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance);
|
|
371
|
+
if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {
|
|
372
|
+
throw NotFoundException.getNotFoundInstance();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance);
|
|
376
|
+
int alignmentAreaBottomY = Math.min(image.getHeight() - 1, estAlignmentY + allowance);
|
|
377
|
+
if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) {
|
|
378
|
+
throw NotFoundException.getNotFoundInstance();
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
AlignmentPatternFinder alignmentFinder =
|
|
382
|
+
new AlignmentPatternFinder(
|
|
383
|
+
image,
|
|
384
|
+
alignmentAreaLeftX,
|
|
385
|
+
alignmentAreaTopY,
|
|
386
|
+
alignmentAreaRightX - alignmentAreaLeftX,
|
|
387
|
+
alignmentAreaBottomY - alignmentAreaTopY,
|
|
388
|
+
overallEstModuleSize,
|
|
389
|
+
resultPointCallback);
|
|
390
|
+
return alignmentFinder.find();
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Ends up being a bit faster than Math.round(). This merely rounds its argument to the nearest int,
|
|
395
|
+
* where x.5 rounds up.
|
|
396
|
+
*/
|
|
397
|
+
private static int round(float d) {
|
|
398
|
+
return (int) (d + 0.5f);
|
|
399
|
+
}
|
|
400
|
+
}
|