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,52 @@
|
|
|
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.common;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Superclass of classes encapsulating types ECIs, according to "Extended Channel Interpretations"
|
|
21
|
+
* 5.3 of ISO 18004.
|
|
22
|
+
*
|
|
23
|
+
* @author Sean Owen
|
|
24
|
+
*/
|
|
25
|
+
public abstract class ECI {
|
|
26
|
+
|
|
27
|
+
private final int value;
|
|
28
|
+
|
|
29
|
+
ECI(int value) {
|
|
30
|
+
this.value = value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public int getValue() {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param value ECI value
|
|
39
|
+
* @return {@link ECI} representing ECI of given value, or null if it is legal but unsupported
|
|
40
|
+
* @throws IllegalArgumentException if ECI value is invalid
|
|
41
|
+
*/
|
|
42
|
+
public static ECI getECIByValue(int value) {
|
|
43
|
+
if (value < 0 || value > 999999) {
|
|
44
|
+
throw new IllegalArgumentException("Bad ECI value: " + value);
|
|
45
|
+
}
|
|
46
|
+
if (value < 900) { // Character set ECIs use 000000 - 000899
|
|
47
|
+
return CharacterSetECI.getCharacterSetECIByValue(value);
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2009 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.common;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.Binarizer;
|
|
20
|
+
import com.google.zxing.LuminanceSource;
|
|
21
|
+
import com.google.zxing.NotFoundException;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* This Binarizer implementation uses the old ZXing global histogram approach. It is suitable
|
|
25
|
+
* for low-end mobile devices which don't have enough CPU or memory to use a local thresholding
|
|
26
|
+
* algorithm. However, because it picks a global black point, it cannot handle difficult shadows
|
|
27
|
+
* and gradients.
|
|
28
|
+
*
|
|
29
|
+
* Faster mobile devices and all desktop applications should probably use HybridBinarizer instead.
|
|
30
|
+
*
|
|
31
|
+
* @author dswitkin@google.com (Daniel Switkin)
|
|
32
|
+
* @author Sean Owen
|
|
33
|
+
*/
|
|
34
|
+
public class GlobalHistogramBinarizer extends Binarizer {
|
|
35
|
+
|
|
36
|
+
private static final int LUMINANCE_BITS = 5;
|
|
37
|
+
private static final int LUMINANCE_SHIFT = 8 - LUMINANCE_BITS;
|
|
38
|
+
private static final int LUMINANCE_BUCKETS = 1 << LUMINANCE_BITS;
|
|
39
|
+
|
|
40
|
+
private byte[] luminances = null;
|
|
41
|
+
private int[] buckets = null;
|
|
42
|
+
|
|
43
|
+
public GlobalHistogramBinarizer(LuminanceSource source) {
|
|
44
|
+
super(source);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Applies simple sharpening to the row data to improve performance of the 1D Readers.
|
|
48
|
+
public BitArray getBlackRow(int y, BitArray row) throws NotFoundException {
|
|
49
|
+
LuminanceSource source = getLuminanceSource();
|
|
50
|
+
int width = source.getWidth();
|
|
51
|
+
if (row == null || row.getSize() < width) {
|
|
52
|
+
row = new BitArray(width);
|
|
53
|
+
} else {
|
|
54
|
+
row.clear();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
initArrays(width);
|
|
58
|
+
byte[] localLuminances = source.getRow(y, luminances);
|
|
59
|
+
int[] localBuckets = buckets;
|
|
60
|
+
for (int x = 0; x < width; x++) {
|
|
61
|
+
int pixel = localLuminances[x] & 0xff;
|
|
62
|
+
localBuckets[pixel >> LUMINANCE_SHIFT]++;
|
|
63
|
+
}
|
|
64
|
+
int blackPoint = estimateBlackPoint(localBuckets);
|
|
65
|
+
|
|
66
|
+
int left = localLuminances[0] & 0xff;
|
|
67
|
+
int center = localLuminances[1] & 0xff;
|
|
68
|
+
for (int x = 1; x < width - 1; x++) {
|
|
69
|
+
int right = localLuminances[x + 1] & 0xff;
|
|
70
|
+
// A simple -1 4 -1 box filter with a weight of 2.
|
|
71
|
+
int luminance = ((center << 2) - left - right) >> 1;
|
|
72
|
+
if (luminance < blackPoint) {
|
|
73
|
+
row.set(x);
|
|
74
|
+
}
|
|
75
|
+
left = center;
|
|
76
|
+
center = right;
|
|
77
|
+
}
|
|
78
|
+
return row;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Does not sharpen the data, as this call is intended to only be used by 2D Readers.
|
|
82
|
+
public BitMatrix getBlackMatrix() throws NotFoundException {
|
|
83
|
+
LuminanceSource source = getLuminanceSource();
|
|
84
|
+
int width = source.getWidth();
|
|
85
|
+
int height = source.getHeight();
|
|
86
|
+
BitMatrix matrix = new BitMatrix(width, height);
|
|
87
|
+
|
|
88
|
+
// Quickly calculates the histogram by sampling four rows from the image. This proved to be
|
|
89
|
+
// more robust on the blackbox tests than sampling a diagonal as we used to do.
|
|
90
|
+
initArrays(width);
|
|
91
|
+
int[] localBuckets = buckets;
|
|
92
|
+
for (int y = 1; y < 5; y++) {
|
|
93
|
+
int row = height * y / 5;
|
|
94
|
+
byte[] localLuminances = source.getRow(row, luminances);
|
|
95
|
+
int right = (width << 2) / 5;
|
|
96
|
+
for (int x = width / 5; x < right; x++) {
|
|
97
|
+
int pixel = localLuminances[x] & 0xff;
|
|
98
|
+
localBuckets[pixel >> LUMINANCE_SHIFT]++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
int blackPoint = estimateBlackPoint(localBuckets);
|
|
102
|
+
|
|
103
|
+
// We delay reading the entire image luminance until the black point estimation succeeds.
|
|
104
|
+
// Although we end up reading four rows twice, it is consistent with our motto of
|
|
105
|
+
// "fail quickly" which is necessary for continuous scanning.
|
|
106
|
+
byte[] localLuminances = source.getMatrix();
|
|
107
|
+
for (int y = 0; y < height; y++) {
|
|
108
|
+
int offset = y * width;
|
|
109
|
+
for (int x = 0; x< width; x++) {
|
|
110
|
+
int pixel = localLuminances[offset + x] & 0xff;
|
|
111
|
+
if (pixel < blackPoint) {
|
|
112
|
+
matrix.set(x, y);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return matrix;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public Binarizer createBinarizer(LuminanceSource source) {
|
|
121
|
+
return new GlobalHistogramBinarizer(source);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private void initArrays(int luminanceSize) {
|
|
125
|
+
if (luminances == null || luminances.length < luminanceSize) {
|
|
126
|
+
luminances = new byte[luminanceSize];
|
|
127
|
+
}
|
|
128
|
+
if (buckets == null) {
|
|
129
|
+
buckets = new int[LUMINANCE_BUCKETS];
|
|
130
|
+
} else {
|
|
131
|
+
for (int x = 0; x < LUMINANCE_BUCKETS; x++) {
|
|
132
|
+
buckets[x] = 0;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private static int estimateBlackPoint(int[] buckets) throws NotFoundException {
|
|
138
|
+
// Find the tallest peak in the histogram.
|
|
139
|
+
int numBuckets = buckets.length;
|
|
140
|
+
int maxBucketCount = 0;
|
|
141
|
+
int firstPeak = 0;
|
|
142
|
+
int firstPeakSize = 0;
|
|
143
|
+
for (int x = 0; x < numBuckets; x++) {
|
|
144
|
+
if (buckets[x] > firstPeakSize) {
|
|
145
|
+
firstPeak = x;
|
|
146
|
+
firstPeakSize = buckets[x];
|
|
147
|
+
}
|
|
148
|
+
if (buckets[x] > maxBucketCount) {
|
|
149
|
+
maxBucketCount = buckets[x];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Find the second-tallest peak which is somewhat far from the tallest peak.
|
|
154
|
+
int secondPeak = 0;
|
|
155
|
+
int secondPeakScore = 0;
|
|
156
|
+
for (int x = 0; x < numBuckets; x++) {
|
|
157
|
+
int distanceToBiggest = x - firstPeak;
|
|
158
|
+
// Encourage more distant second peaks by multiplying by square of distance.
|
|
159
|
+
int score = buckets[x] * distanceToBiggest * distanceToBiggest;
|
|
160
|
+
if (score > secondPeakScore) {
|
|
161
|
+
secondPeak = x;
|
|
162
|
+
secondPeakScore = score;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Make sure firstPeak corresponds to the black peak.
|
|
167
|
+
if (firstPeak > secondPeak) {
|
|
168
|
+
int temp = firstPeak;
|
|
169
|
+
firstPeak = secondPeak;
|
|
170
|
+
secondPeak = temp;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// If there is too little contrast in the image to pick a meaningful black point, throw rather
|
|
174
|
+
// than waste time trying to decode the image, and risk false positives.
|
|
175
|
+
// TODO: It might be worth comparing the brightest and darkest pixels seen, rather than the
|
|
176
|
+
// two peaks, to determine the contrast.
|
|
177
|
+
if (secondPeak - firstPeak <= numBuckets >> 4) {
|
|
178
|
+
throw NotFoundException.getNotFoundInstance();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Find a valley between them that is low and closer to the white peak.
|
|
182
|
+
int bestValley = secondPeak - 1;
|
|
183
|
+
int bestValleyScore = -1;
|
|
184
|
+
for (int x = secondPeak - 1; x > firstPeak; x--) {
|
|
185
|
+
int fromFirst = x - firstPeak;
|
|
186
|
+
int score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets[x]);
|
|
187
|
+
if (score > bestValleyScore) {
|
|
188
|
+
bestValley = x;
|
|
189
|
+
bestValleyScore = score;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return bestValley << LUMINANCE_SHIFT;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
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.common;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.NotFoundException;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Implementations of this class can, given locations of finder patterns for a QR code in an
|
|
23
|
+
* image, sample the right points in the image to reconstruct the QR code, accounting for
|
|
24
|
+
* perspective distortion. It is abstracted since it is relatively expensive and should be allowed
|
|
25
|
+
* to take advantage of platform-specific optimized implementations, like Sun's Java Advanced
|
|
26
|
+
* Imaging library, but which may not be available in other environments such as J2ME, and vice
|
|
27
|
+
* versa.
|
|
28
|
+
*
|
|
29
|
+
* The implementation used can be controlled by calling {@link #setGridSampler(GridSampler)}
|
|
30
|
+
* with an instance of a class which implements this interface.
|
|
31
|
+
*
|
|
32
|
+
* @author Sean Owen
|
|
33
|
+
*/
|
|
34
|
+
public abstract class GridSampler {
|
|
35
|
+
|
|
36
|
+
private static GridSampler gridSampler = new DefaultGridSampler();
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Sets the implementation of {@link GridSampler} used by the library. One global
|
|
40
|
+
* instance is stored, which may sound problematic. But, the implementation provided
|
|
41
|
+
* ought to be appropriate for the entire platform, and all uses of this library
|
|
42
|
+
* in the whole lifetime of the JVM. For instance, an Android activity can swap in
|
|
43
|
+
* an implementation that takes advantage of native platform libraries.
|
|
44
|
+
*
|
|
45
|
+
* @param newGridSampler The platform-specific object to install.
|
|
46
|
+
*/
|
|
47
|
+
public static void setGridSampler(GridSampler newGridSampler) {
|
|
48
|
+
if (newGridSampler == null) {
|
|
49
|
+
throw new IllegalArgumentException();
|
|
50
|
+
}
|
|
51
|
+
gridSampler = newGridSampler;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @return the current implementation of {@link GridSampler}
|
|
56
|
+
*/
|
|
57
|
+
public static GridSampler getInstance() {
|
|
58
|
+
return gridSampler;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* <p>Samples an image for a square matrix of bits of the given dimension. This is used to extract
|
|
63
|
+
* the black/white modules of a 2D barcode like a QR Code found in an image. Because this barcode
|
|
64
|
+
* may be rotated or perspective-distorted, the caller supplies four points in the source image
|
|
65
|
+
* that define known points in the barcode, so that the image may be sampled appropriately.</p>
|
|
66
|
+
*
|
|
67
|
+
* <p>The last eight "from" parameters are four X/Y coordinate pairs of locations of points in
|
|
68
|
+
* the image that define some significant points in the image to be sample. For example,
|
|
69
|
+
* these may be the location of finder pattern in a QR Code.</p>
|
|
70
|
+
*
|
|
71
|
+
* <p>The first eight "to" parameters are four X/Y coordinate pairs measured in the destination
|
|
72
|
+
* {@link BitMatrix}, from the top left, where the known points in the image given by the "from"
|
|
73
|
+
* parameters map to.</p>
|
|
74
|
+
*
|
|
75
|
+
* <p>These 16 parameters define the transformation needed to sample the image.</p>
|
|
76
|
+
*
|
|
77
|
+
* @param image image to sample
|
|
78
|
+
* @param dimension width/height of {@link BitMatrix} to sample from image
|
|
79
|
+
* @return {@link BitMatrix} representing a grid of points sampled from the image within a region
|
|
80
|
+
* defined by the "from" parameters
|
|
81
|
+
* @throws NotFoundException if image can't be sampled, for example, if the transformation defined
|
|
82
|
+
* by the given points is invalid or results in sampling outside the image boundaries
|
|
83
|
+
*/
|
|
84
|
+
public abstract BitMatrix sampleGrid(BitMatrix image,
|
|
85
|
+
int dimension,
|
|
86
|
+
float p1ToX, float p1ToY,
|
|
87
|
+
float p2ToX, float p2ToY,
|
|
88
|
+
float p3ToX, float p3ToY,
|
|
89
|
+
float p4ToX, float p4ToY,
|
|
90
|
+
float p1FromX, float p1FromY,
|
|
91
|
+
float p2FromX, float p2FromY,
|
|
92
|
+
float p3FromX, float p3FromY,
|
|
93
|
+
float p4FromX, float p4FromY) throws NotFoundException;
|
|
94
|
+
|
|
95
|
+
public BitMatrix sampleGrid(BitMatrix image,
|
|
96
|
+
int dimension,
|
|
97
|
+
PerspectiveTransform transform) throws NotFoundException {
|
|
98
|
+
throw new IllegalStateException(); // Can't use UnsupportedOperationException
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* <p>Checks a set of points that have been transformed to sample points on an image against
|
|
104
|
+
* the image's dimensions to see if the point are even within the image.</p>
|
|
105
|
+
*
|
|
106
|
+
* <p>This method will actually "nudge" the endpoints back onto the image if they are found to be
|
|
107
|
+
* barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder
|
|
108
|
+
* patterns in an image where the QR Code runs all the way to the image border.</p>
|
|
109
|
+
*
|
|
110
|
+
* <p>For efficiency, the method will check points from either end of the line until one is found
|
|
111
|
+
* to be within the image. Because the set of points are assumed to be linear, this is valid.</p>
|
|
112
|
+
*
|
|
113
|
+
* @param image image into which the points should map
|
|
114
|
+
* @param points actual points in x1,y1,...,xn,yn form
|
|
115
|
+
* @throws NotFoundException if an endpoint is lies outside the image boundaries
|
|
116
|
+
*/
|
|
117
|
+
protected static void checkAndNudgePoints(BitMatrix image, float[] points)
|
|
118
|
+
throws NotFoundException {
|
|
119
|
+
int width = image.getWidth();
|
|
120
|
+
int height = image.getHeight();
|
|
121
|
+
// Check and nudge points from start until we see some that are OK:
|
|
122
|
+
boolean nudged = true;
|
|
123
|
+
for (int offset = 0; offset < points.length && nudged; offset += 2) {
|
|
124
|
+
int x = (int) points[offset];
|
|
125
|
+
int y = (int) points[offset + 1];
|
|
126
|
+
if (x < -1 || x > width || y < -1 || y > height) {
|
|
127
|
+
throw NotFoundException.getNotFoundInstance();
|
|
128
|
+
}
|
|
129
|
+
nudged = false;
|
|
130
|
+
if (x == -1) {
|
|
131
|
+
points[offset] = 0.0f;
|
|
132
|
+
nudged = true;
|
|
133
|
+
} else if (x == width) {
|
|
134
|
+
points[offset] = width - 1;
|
|
135
|
+
nudged = true;
|
|
136
|
+
}
|
|
137
|
+
if (y == -1) {
|
|
138
|
+
points[offset + 1] = 0.0f;
|
|
139
|
+
nudged = true;
|
|
140
|
+
} else if (y == height) {
|
|
141
|
+
points[offset + 1] = height - 1;
|
|
142
|
+
nudged = true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Check and nudge points from end:
|
|
146
|
+
nudged = true;
|
|
147
|
+
for (int offset = points.length - 2; offset >= 0 && nudged; offset -= 2) {
|
|
148
|
+
int x = (int) points[offset];
|
|
149
|
+
int y = (int) points[offset + 1];
|
|
150
|
+
if (x < -1 || x > width || y < -1 || y > height) {
|
|
151
|
+
throw NotFoundException.getNotFoundInstance();
|
|
152
|
+
}
|
|
153
|
+
nudged = false;
|
|
154
|
+
if (x == -1) {
|
|
155
|
+
points[offset] = 0.0f;
|
|
156
|
+
nudged = true;
|
|
157
|
+
} else if (x == width) {
|
|
158
|
+
points[offset] = width - 1;
|
|
159
|
+
nudged = true;
|
|
160
|
+
}
|
|
161
|
+
if (y == -1) {
|
|
162
|
+
points[offset + 1] = 0.0f;
|
|
163
|
+
nudged = true;
|
|
164
|
+
} else if (y == height) {
|
|
165
|
+
points[offset + 1] = height - 1;
|
|
166
|
+
nudged = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2009 ZXing authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
package com.google.zxing.common;
|
|
18
|
+
|
|
19
|
+
import com.google.zxing.Binarizer;
|
|
20
|
+
import com.google.zxing.LuminanceSource;
|
|
21
|
+
import com.google.zxing.NotFoundException;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* This class implements a local thresholding algorithm, which while slower than the
|
|
25
|
+
* GlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for
|
|
26
|
+
* high frequency images of barcodes with black data on white backgrounds. For this application,
|
|
27
|
+
* it does a much better job than a global blackpoint with severe shadows and gradients.
|
|
28
|
+
* However it tends to produce artifacts on lower frequency images and is therefore not
|
|
29
|
+
* a good general purpose binarizer for uses outside ZXing.
|
|
30
|
+
*
|
|
31
|
+
* This class extends GlobalHistogramBinarizer, using the older histogram approach for 1D readers,
|
|
32
|
+
* and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already
|
|
33
|
+
* inherently local, and only fails for horizontal gradients. We can revisit that problem later,
|
|
34
|
+
* but for now it was not a win to use local blocks for 1D.
|
|
35
|
+
*
|
|
36
|
+
* This Binarizer is the default for the unit tests and the recommended class for library users.
|
|
37
|
+
*
|
|
38
|
+
* @author dswitkin@google.com (Daniel Switkin)
|
|
39
|
+
*/
|
|
40
|
+
public final class HybridBinarizer extends GlobalHistogramBinarizer {
|
|
41
|
+
|
|
42
|
+
// This class uses 5x5 blocks to compute local luminance, where each block is 8x8 pixels.
|
|
43
|
+
// So this is the smallest dimension in each axis we can accept.
|
|
44
|
+
private static final int MINIMUM_DIMENSION = 40;
|
|
45
|
+
|
|
46
|
+
private BitMatrix matrix = null;
|
|
47
|
+
|
|
48
|
+
public HybridBinarizer(LuminanceSource source) {
|
|
49
|
+
super(source);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public BitMatrix getBlackMatrix() throws NotFoundException {
|
|
53
|
+
binarizeEntireImage();
|
|
54
|
+
return matrix;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public Binarizer createBinarizer(LuminanceSource source) {
|
|
58
|
+
return new HybridBinarizer(source);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Calculates the final BitMatrix once for all requests. This could be called once from the
|
|
62
|
+
// constructor instead, but there are some advantages to doing it lazily, such as making
|
|
63
|
+
// profiling easier, and not doing heavy lifting when callers don't expect it.
|
|
64
|
+
private void binarizeEntireImage() throws NotFoundException {
|
|
65
|
+
if (matrix == null) {
|
|
66
|
+
LuminanceSource source = getLuminanceSource();
|
|
67
|
+
if (source.getWidth() >= MINIMUM_DIMENSION && source.getHeight() >= MINIMUM_DIMENSION) {
|
|
68
|
+
byte[] luminances = source.getMatrix();
|
|
69
|
+
int width = source.getWidth();
|
|
70
|
+
int height = source.getHeight();
|
|
71
|
+
int subWidth = width >> 3;
|
|
72
|
+
if ((width & 0x07) != 0) {
|
|
73
|
+
subWidth++;
|
|
74
|
+
}
|
|
75
|
+
int subHeight = height >> 3;
|
|
76
|
+
if ((height & 0x07) != 0) {
|
|
77
|
+
subHeight++;
|
|
78
|
+
}
|
|
79
|
+
int[][] blackPoints = calculateBlackPoints(luminances, subWidth, subHeight, width, height);
|
|
80
|
+
|
|
81
|
+
matrix = new BitMatrix(width, height);
|
|
82
|
+
calculateThresholdForBlock(luminances, subWidth, subHeight, width, height, blackPoints, matrix);
|
|
83
|
+
} else {
|
|
84
|
+
// If the image is too small, fall back to the global histogram approach.
|
|
85
|
+
matrix = super.getBlackMatrix();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// For each 8x8 block in the image, calculate the average black point using a 5x5 grid
|
|
91
|
+
// of the blocks around it. Also handles the corner cases (fractional blocks are computed based
|
|
92
|
+
// on the last 8 pixels in the row/column which are also used in the previous block).
|
|
93
|
+
private static void calculateThresholdForBlock(byte[] luminances, int subWidth, int subHeight,
|
|
94
|
+
int width, int height, int[][] blackPoints, BitMatrix matrix) {
|
|
95
|
+
for (int y = 0; y < subHeight; y++) {
|
|
96
|
+
int yoffset = y << 3;
|
|
97
|
+
if ((yoffset + 8) >= height) {
|
|
98
|
+
yoffset = height - 8;
|
|
99
|
+
}
|
|
100
|
+
for (int x = 0; x < subWidth; x++) {
|
|
101
|
+
int xoffset = x << 3;
|
|
102
|
+
if ((xoffset + 8) >= width) {
|
|
103
|
+
xoffset = width - 8;
|
|
104
|
+
}
|
|
105
|
+
int left = (x > 1) ? x : 2;
|
|
106
|
+
left = (left < subWidth - 2) ? left : subWidth - 3;
|
|
107
|
+
int top = (y > 1) ? y : 2;
|
|
108
|
+
top = (top < subHeight - 2) ? top : subHeight - 3;
|
|
109
|
+
int sum = 0;
|
|
110
|
+
for (int z = -2; z <= 2; z++) {
|
|
111
|
+
int[] blackRow = blackPoints[top + z];
|
|
112
|
+
sum += blackRow[left - 2];
|
|
113
|
+
sum += blackRow[left - 1];
|
|
114
|
+
sum += blackRow[left];
|
|
115
|
+
sum += blackRow[left + 1];
|
|
116
|
+
sum += blackRow[left + 2];
|
|
117
|
+
}
|
|
118
|
+
int average = sum / 25;
|
|
119
|
+
threshold8x8Block(luminances, xoffset, yoffset, average, width, matrix);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Applies a single threshold to an 8x8 block of pixels.
|
|
125
|
+
private static void threshold8x8Block(byte[] luminances, int xoffset, int yoffset, int threshold,
|
|
126
|
+
int stride, BitMatrix matrix) {
|
|
127
|
+
for (int y = 0; y < 8; y++) {
|
|
128
|
+
int offset = (yoffset + y) * stride + xoffset;
|
|
129
|
+
for (int x = 0; x < 8; x++) {
|
|
130
|
+
int pixel = luminances[offset + x] & 0xff;
|
|
131
|
+
if (pixel < threshold) {
|
|
132
|
+
matrix.set(xoffset + x, yoffset + y);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Calculates a single black point for each 8x8 block of pixels and saves it away.
|
|
139
|
+
private static int[][] calculateBlackPoints(byte[] luminances, int subWidth, int subHeight,
|
|
140
|
+
int width, int height) {
|
|
141
|
+
int[][] blackPoints = new int[subHeight][subWidth];
|
|
142
|
+
for (int y = 0; y < subHeight; y++) {
|
|
143
|
+
int yoffset = y << 3;
|
|
144
|
+
if ((yoffset + 8) >= height) {
|
|
145
|
+
yoffset = height - 8;
|
|
146
|
+
}
|
|
147
|
+
for (int x = 0; x < subWidth; x++) {
|
|
148
|
+
int xoffset = x << 3;
|
|
149
|
+
if ((xoffset + 8) >= width) {
|
|
150
|
+
xoffset = width - 8;
|
|
151
|
+
}
|
|
152
|
+
int sum = 0;
|
|
153
|
+
int min = 255;
|
|
154
|
+
int max = 0;
|
|
155
|
+
for (int yy = 0; yy < 8; yy++) {
|
|
156
|
+
int offset = (yoffset + yy) * width + xoffset;
|
|
157
|
+
for (int xx = 0; xx < 8; xx++) {
|
|
158
|
+
int pixel = luminances[offset + xx] & 0xff;
|
|
159
|
+
sum += pixel;
|
|
160
|
+
if (pixel < min) {
|
|
161
|
+
min = pixel;
|
|
162
|
+
}
|
|
163
|
+
if (pixel > max) {
|
|
164
|
+
max = pixel;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// If the contrast is inadequate, use half the minimum, so that this block will be
|
|
170
|
+
// treated as part of the white background, but won't drag down neighboring blocks
|
|
171
|
+
// too much.
|
|
172
|
+
int average;
|
|
173
|
+
if (max - min > 24) {
|
|
174
|
+
average = sum >> 6;
|
|
175
|
+
} else {
|
|
176
|
+
// When min == max == 0, let average be 1 so all is black
|
|
177
|
+
average = max == 0 ? 1 : min >> 1;
|
|
178
|
+
}
|
|
179
|
+
blackPoints[y][x] = average;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return blackPoints;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
}
|