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.
Files changed (395) hide show
  1. data/CHANGELOG +7 -0
  2. data/Rakefile +7 -36
  3. data/doc/build.txt +48 -22
  4. data/doc/device-caps.txt +130 -1
  5. data/doc/rhom.txt +9 -3
  6. data/doc/test-log-debug.txt +5 -2
  7. data/lib/extensions/barcode/ext/barcode/platform/android/Rakefile +40 -20
  8. data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/AUTHORS +58 -0
  9. data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/CHANGES +266 -0
  10. data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/COPYING +201 -0
  11. data/lib/extensions/barcode/ext/barcode/platform/android/ZXing_Info/README +11 -0
  12. data/lib/extensions/barcode/ext/barcode/platform/android/ext_build.files +173 -0
  13. data/lib/extensions/barcode/ext/barcode/platform/android/jni/src/barcode.cpp +34 -0
  14. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BarcodeFormat.java +103 -0
  15. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Binarizer.java +80 -0
  16. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/BinaryBitmap.java +128 -0
  17. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ChecksumException.java +37 -0
  18. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/DecodeHintType.java +79 -0
  19. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/EncodeHintType.java +39 -0
  20. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/FormatException.java +38 -0
  21. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/LuminanceSource.java +113 -0
  22. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatReader.java +166 -0
  23. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/MultiFormatWriter.java +65 -0
  24. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/NotFoundException.java +37 -0
  25. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Reader.java +64 -0
  26. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ReaderException.java +98 -0
  27. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Result.java +143 -0
  28. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultMetadataType.java +109 -0
  29. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPoint.java +127 -0
  30. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/ResultPointCallback.java +29 -0
  31. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/Writer.java +54 -0
  32. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/WriterException.java +35 -0
  33. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AbstractDoCoMoResultParser.java +39 -0
  34. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookAUResultParser.java +73 -0
  35. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookDoCoMoResultParser.java +85 -0
  36. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/AddressBookParsedResult.java +122 -0
  37. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BizcardResultParser.java +94 -0
  38. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/BookmarkDoCoMoResultParser.java +46 -0
  39. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/CalendarParsedResult.java +134 -0
  40. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressParsedResult.java +61 -0
  41. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailAddressResultParser.java +64 -0
  42. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/EmailDoCoMoResultParser.java +87 -0
  43. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductParsedResult.java +195 -0
  44. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ExpandedProductResultParser.java +199 -0
  45. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoParsedResult.java +132 -0
  46. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/GeoResultParser.java +77 -0
  47. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNParsedResult.java +39 -0
  48. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ISBNResultParser.java +54 -0
  49. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResult.java +73 -0
  50. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ParsedResultType.java +53 -0
  51. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductParsedResult.java +49 -0
  52. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ProductResultParser.java +66 -0
  53. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/ResultParser.java +319 -0
  54. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSMMSResultParser.java +107 -0
  55. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSParsedResult.java +104 -0
  56. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/SMSTOMMSTOResultParser.java +57 -0
  57. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelParsedResult.java +54 -0
  58. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TelResultParser.java +44 -0
  59. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/TextParsedResult.java +48 -0
  60. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIParsedResult.java +113 -0
  61. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URIResultParser.java +87 -0
  62. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/URLTOResultParser.java +47 -0
  63. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VCardResultParser.java +346 -0
  64. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/VEventResultParser.java +54 -0
  65. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiParsedResult.java +53 -0
  66. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/WifiResultParser.java +50 -0
  67. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/AbstractNDEFResultParser.java +45 -0
  68. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFRecord.java +87 -0
  69. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterParsedResult.java +63 -0
  70. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFSmartPosterResultParser.java +81 -0
  71. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFTextResultParser.java +57 -0
  72. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/client/result/optional/NDEFURIResultParser.java +95 -0
  73. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitArray.java +247 -0
  74. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitMatrix.java +226 -0
  75. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/BitSource.java +97 -0
  76. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/CharacterSetECI.java +110 -0
  77. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Collections.java +53 -0
  78. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/Comparator.java +27 -0
  79. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DecoderResult.java +63 -0
  80. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DefaultGridSampler.java +81 -0
  81. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/DetectorResult.java +46 -0
  82. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/ECI.java +52 -0
  83. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GlobalHistogramBinarizer.java +196 -0
  84. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/GridSampler.java +171 -0
  85. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/HybridBinarizer.java +185 -0
  86. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/PerspectiveTransform.java +148 -0
  87. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/StringUtils.java +191 -0
  88. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/MonochromeRectangleDetector.java +209 -0
  89. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/detector/WhiteRectangleDetector.java +316 -0
  90. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256.java +139 -0
  91. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/GF256Poly.java +263 -0
  92. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonDecoder.java +194 -0
  93. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonEncoder.java +75 -0
  94. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/common/reedsolomon/ReedSolomonException.java +31 -0
  95. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/DataMatrixReader.java +161 -0
  96. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +446 -0
  97. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DataBlock.java +118 -0
  98. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java +462 -0
  99. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Decoder.java +134 -0
  100. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/decoder/Version.java +242 -0
  101. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/datamatrix/detector/Detector.java +348 -0
  102. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/ByQuadrantReader.java +96 -0
  103. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/GenericMultipleBarcodeReader.java +156 -0
  104. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/MultipleBarcodeReader.java +37 -0
  105. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/QRCodeMultiReader.java +80 -0
  106. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiDetector.java +72 -0
  107. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/multi/qrcode/detector/MultiFinderPatternFinder.java +324 -0
  108. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/CodaBarReader.java +263 -0
  109. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Reader.java +473 -0
  110. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code128Writer.java +73 -0
  111. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Reader.java +333 -0
  112. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code39Writer.java +82 -0
  113. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/Code93Reader.java +273 -0
  114. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Reader.java +135 -0
  115. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN13Writer.java +81 -0
  116. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Reader.java +72 -0
  117. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EAN8Writer.java +76 -0
  118. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/EANManufacturerOrgSupport.java +170 -0
  119. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFReader.java +348 -0
  120. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/ITFWriter.java +68 -0
  121. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatOneDReader.java +109 -0
  122. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/MultiFormatUPCEANReader.java +113 -0
  123. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/OneDReader.java +297 -0
  124. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCAReader.java +75 -0
  125. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANExtensionSupport.java +186 -0
  126. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANReader.java +355 -0
  127. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEANWriter.java +104 -0
  128. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/UPCEReader.java +153 -0
  129. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/AbstractRSSReader.java +110 -0
  130. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/DataCharacter.java +37 -0
  131. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/FinderPattern.java +48 -0
  132. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/Pair.java +41 -0
  133. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSS14Reader.java +494 -0
  134. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/RSSUtils.java +155 -0
  135. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/BitArrayBuilder.java +85 -0
  136. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/ExpandedPair.java +68 -0
  137. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/RSSExpandedReader.java +578 -0
  138. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013103decoder.java +47 -0
  139. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01320xDecoder.java +55 -0
  140. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01392xDecoder.java +66 -0
  141. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01393xDecoder.java +76 -0
  142. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0x1xDecoder.java +106 -0
  143. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI013x0xDecoder.java +56 -0
  144. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01AndOtherAIs.java +56 -0
  145. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01decoder.java +81 -0
  146. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AI01weightDecoder.java +58 -0
  147. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AbstractExpandedDecoder.java +85 -0
  148. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/AnyAIDecoder.java +48 -0
  149. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/BlockParsedResult.java +60 -0
  150. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/CurrentParsingState.java +69 -0
  151. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedChar.java +52 -0
  152. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedInformation.java +63 -0
  153. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedNumeric.java +79 -0
  154. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/DecodedObject.java +44 -0
  155. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/FieldParser.java +285 -0
  156. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/oned/rss/expanded/decoders/GeneralAppIdDecoder.java +414 -0
  157. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/PDF417Reader.java +79 -0
  158. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/BitMatrixParser.java +1163 -0
  159. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/DecodedBitStreamParser.java +629 -0
  160. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/decoder/Decoder.java +150 -0
  161. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/pdf417/detector/Detector.java +498 -0
  162. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeReader.java +166 -0
  163. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/QRCodeWriter.java +108 -0
  164. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java +203 -0
  165. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataBlock.java +123 -0
  166. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DataMask.java +155 -0
  167. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java +261 -0
  168. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Decoder.java +148 -0
  169. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +86 -0
  170. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/FormatInformation.java +171 -0
  171. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Mode.java +112 -0
  172. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/decoder/Version.java +586 -0
  173. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPattern.java +48 -0
  174. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +279 -0
  175. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/Detector.java +400 -0
  176. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPattern.java +63 -0
  177. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java +585 -0
  178. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/detector/FinderPatternInfo.java +49 -0
  179. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/BlockPair.java +37 -0
  180. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/ByteMatrix.java +97 -0
  181. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/Encoder.java +557 -0
  182. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MaskUtil.java +217 -0
  183. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/MatrixUtil.java +524 -0
  184. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/google/zxing/qrcode/encoder/QRCode.java +239 -0
  185. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/Barcode.java +63 -0
  186. data/lib/extensions/barcode/ext/barcode/platform/android/src/com/rhomobile/barcode/RhoLuminanceSource.java +75 -0
  187. data/lib/extensions/barcode/ext/barcode/platform/iphone/Barcode.xcodeproj/project.pbxproj +74 -318
  188. data/lib/extensions/barcode/ext/barcode/platform/iphone/Classes/barcode.m +70 -0
  189. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/COPYING +27 -0
  190. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarCaptureReader.h +105 -0
  191. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarHelpController.h +60 -0
  192. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImage.h +69 -0
  193. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarImageScanner.h +51 -0
  194. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderController.h +142 -0
  195. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderView.h +118 -0
  196. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarReaderViewController.h +100 -0
  197. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSDK.h +33 -0
  198. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/ZBarSymbol.h +71 -0
  199. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar.h +1476 -0
  200. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Decoder.h +201 -0
  201. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Exception.h +187 -0
  202. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Image.h +321 -0
  203. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/ImageScanner.h +130 -0
  204. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Processor.h +223 -0
  205. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Scanner.h +162 -0
  206. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Symbol.h +529 -0
  207. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Video.h +170 -0
  208. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Headers/ZBarSDK/zbar/Window.h +136 -0
  209. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/LICENSE +504 -0
  210. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/README +59 -0
  211. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-back.png +0 -0
  212. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-help.html +88 -0
  213. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-helpicons.png +0 -0
  214. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/Resources/zbar-samples.png +0 -0
  215. data/lib/extensions/barcode/ext/barcode/platform/iphone/ZBarSDK/libzbar.a +0 -0
  216. data/lib/extensions/debugger/debugger.rb +215 -67
  217. data/lib/extensions/nfc/ext/nfc/platform/android/AndroidManifest.xml +1 -1
  218. data/lib/extensions/nfc/ext/nfc/platform/android/src/com/nfc/Nfc.java +14 -2
  219. data/lib/extensions/timeout/timeout.rb +114 -0
  220. data/lib/framework/rho/render.rb +14 -16
  221. data/lib/framework/rho/rho.rb +38 -14
  222. data/lib/framework/rho/rhoapplication.rb +1 -1
  223. data/lib/framework/rho/rhocontroller.rb +3 -3
  224. data/lib/framework/rho/rhofsconnector.rb +18 -6
  225. data/lib/framework/rho/rhoviewhelpers.rb +1 -1
  226. data/lib/framework/rhoappmanifest.rb +44 -0
  227. data/lib/framework/rhodes.rb +1 -1
  228. data/lib/framework/rhoframework.rb +31 -11
  229. data/lib/framework/rholang/localization_simplified.rb +10 -6
  230. data/lib/framework/rhom/rhom_object_factory.rb +3 -3
  231. data/lib/framework/version.rb +1 -1
  232. data/lib/rhodes.rb +1 -1
  233. data/platform/android/Rhodes/AndroidManifest.xml +2 -2
  234. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesApplication.h +32 -8
  235. data/platform/android/Rhodes/jni/include/rhodes/jni/com_rhomobile_rhodes_RhodesService.h +21 -21
  236. data/platform/android/Rhodes/jni/src/rhocryptimpl.cpp +1 -0
  237. data/platform/android/Rhodes/jni/src/rhodes.cpp +21 -9
  238. data/platform/android/Rhodes/jni/src/sslimpl.cpp +1 -0
  239. data/platform/android/Rhodes/src/com/rhomobile/rhodes/BaseActivity.java +7 -6
  240. data/platform/android/Rhodes/src/com/rhomobile/rhodes/PushReceiver.java +19 -1
  241. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhoCryptImpl.java +2 -2
  242. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesActivity.java +24 -15
  243. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesApplication.java +39 -47
  244. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +113 -106
  245. data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/Alert.java +11 -0
  246. data/platform/android/Rhodes/src/com/rhomobile/rhodes/alert/StatusNotification.java +49 -0
  247. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SimpleMainView.java +1 -1
  248. data/platform/android/Rhodes/src/com/rhomobile/rhodes/socket/SSLImpl.java +5 -1
  249. data/platform/android/build/RhodesSRC_build.files +1 -0
  250. data/platform/android/build/android.rake +93 -6
  251. data/platform/bb/RubyVM/src/com/rho/RhodesApp.java +5 -4
  252. data/platform/bb/RubyVM/src/com/rho/file/RhoFile.java +10 -0
  253. data/platform/bb/RubyVM/src/com/rho/sync/SyncEngine.java +16 -15
  254. data/platform/bb/RubyVM/src/com/rho/sync/SyncNotify.java +2 -2
  255. data/platform/bb/RubyVM/src/com/rho/sync/SyncSource.java +21 -19
  256. data/platform/bb/rhodes/src/com/rho/BrowserAdapter5.java +2 -2
  257. data/platform/bb/rhodes/src/com/rho/rubyext/System.java +6 -1
  258. data/platform/bb/rhodes/src/com/rho/rubyext/WebView.java +10 -3
  259. data/platform/bb/rhodes/src/rhomobile/RhodesApplication.java +21 -1
  260. data/platform/iphone/Classes/SimpleMainView.m +5 -5
  261. data/platform/iphone/Info.plist +1 -1
  262. data/platform/iphone/rbuild/iphone.rake +30 -1
  263. data/platform/iphone/rhorunner.xcodeproj/project.pbxproj +12 -0
  264. data/platform/shared/SyncClient/SyncClient.cpp +136 -20
  265. data/platform/shared/SyncClient/SyncClient.h +17 -0
  266. data/platform/shared/common/AppMenu.cpp +6 -1
  267. data/platform/shared/common/RhoConf.cpp +13 -1
  268. data/platform/shared/common/RhoConf.h +3 -1
  269. data/platform/shared/common/RhoDefs.h +10 -0
  270. data/platform/shared/common/RhoFile.cpp +15 -0
  271. data/platform/shared/common/RhoFile.h +1 -0
  272. data/platform/shared/common/RhodesApp.cpp +16 -3
  273. data/platform/shared/common/RhodesApp.h +1 -0
  274. data/platform/shared/common/RhodesAppBase.cpp +102 -62
  275. data/platform/shared/common/RhodesAppBase.h +7 -1
  276. data/platform/shared/curl/lib/rhossl.c +1 -0
  277. data/platform/shared/db/DBAdapter.cpp +14 -2
  278. data/platform/shared/logging/RhoLogConf.cpp +21 -0
  279. data/platform/shared/logging/RhoLogConf.h +11 -0
  280. data/platform/shared/logging/RhoLogSink.cpp +24 -0
  281. data/platform/shared/logging/RhoLogSink.h +20 -1
  282. data/platform/shared/net/HttpServer.cpp +8 -6
  283. data/platform/shared/net/RawSocket.cpp +130 -0
  284. data/platform/shared/net/RawSocket.h +74 -0
  285. data/platform/shared/ruby/ext/rho/rhoruby.c +37 -1
  286. data/platform/shared/ruby/ext/rho/rhosupport.c +74 -21
  287. data/platform/shared/ruby/ext/sqlite3_api/sqlite3_api_wrap.c +9 -1
  288. data/platform/shared/ruby/vm_eval.c +4 -3
  289. data/platform/shared/sync/SyncEngine.cpp +11 -12
  290. data/platform/shared/sync/SyncEngine.h +2 -2
  291. data/platform/shared/sync/SyncNotify.cpp +41 -13
  292. data/platform/shared/sync/SyncNotify.h +20 -3
  293. data/platform/shared/sync/SyncSource.cpp +21 -19
  294. data/platform/shared/sync/SyncThread.cpp +11 -1
  295. data/platform/shared/sync/SyncThread.h +3 -0
  296. data/platform/shared/test/test_helper.cpp +7 -0
  297. data/platform/win32/RhoSimulator/QtCore4.dll +0 -0
  298. data/platform/win32/RhoSimulator/QtGui4.dll +0 -0
  299. data/platform/win32/RhoSimulator/QtNetwork4.dll +0 -0
  300. data/platform/win32/RhoSimulator/QtWebKit4.dll +0 -0
  301. data/platform/win32/RhoSimulator/imageformats/qgif4.dll +0 -0
  302. data/platform/win32/RhoSimulator/imageformats/qjpeg4.dll +0 -0
  303. data/platform/win32/RhoSimulator/rhosimulator.exe +0 -0
  304. data/platform/wm/RhoLib/RhoLib.vcproj +762 -14
  305. data/platform/wm/build/wm.rake +87 -10
  306. data/platform/wm/rhodes.sln +155 -72
  307. data/platform/wm/rhodes/MainWindow.cpp +5 -2
  308. data/platform/wm/rhodes/MainWindow.h +9 -1
  309. data/platform/wm/rhodes/RhoNativeViewManager.cpp +4 -0
  310. data/platform/wm/rhodes/Rhodes.cpp +60 -6
  311. data/platform/wm/rhodes/emulator/ExternalWebView.cpp +20 -0
  312. data/platform/wm/rhodes/emulator/ExternalWebView.h +23 -0
  313. data/platform/wm/rhodes/emulator/ExternalWebView.ui +46 -0
  314. data/platform/wm/rhodes/emulator/MainWindowCallback.h +18 -0
  315. data/platform/wm/rhodes/emulator/MainWindowProxy.cpp +268 -0
  316. data/platform/wm/rhodes/emulator/MainWindowProxy.h +34 -0
  317. data/platform/wm/rhodes/emulator/MainWindowQt.cpp +345 -0
  318. data/platform/wm/rhodes/emulator/MainWindowQt.h +118 -0
  319. data/platform/wm/rhodes/emulator/NativeToolbarQt.cpp +57 -0
  320. data/platform/wm/rhodes/emulator/NativeToolbarQt.h +52 -0
  321. data/platform/wm/rhodes/emulator/QtMainWindow.cpp +219 -0
  322. data/platform/wm/rhodes/emulator/QtMainWindow.h +62 -0
  323. data/platform/wm/rhodes/emulator/QtMainWindow.ui +122 -0
  324. data/platform/wm/rhodes/{RhoCryptImpl.cpp → rho/common/RhoCryptImpl.cpp} +0 -0
  325. data/platform/wm/rhodes/{RhoCryptImpl.h → rho/common/RhoCryptImpl.h} +0 -0
  326. data/platform/wm/rhodes/rho/rubyext/NativeToolbar.cpp +2 -86
  327. data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.cpp +87 -0
  328. data/platform/wm/rhodes/rho/rubyext/NativeToolbarExt.h +6 -0
  329. data/platform/wm/rhodes/rho/rubyext/SystemImpl.cpp +60 -0
  330. data/platform/wm/rhodes/rhodes.vcproj +4025 -365
  331. data/platform/wm/rhodes/signature/Signature.cpp +29 -13
  332. data/platform/wm/rubylib/rubylib.vcproj +1167 -195
  333. data/platform/wm/shttpd/shttpd.vcproj +4 -4
  334. data/platform/wm/sqlite3/sqlite3.vcproj +441 -13
  335. data/platform/wm/syncengine/syncengine.vcproj +443 -15
  336. data/platform/wm/tcmalloc/tcmalloc.vcproj +0 -154
  337. data/platform/wm/tools/detool/LogServer.cpp +150 -0
  338. data/platform/wm/tools/detool/LogServer.h +23 -0
  339. data/platform/wm/tools/detool/detool.cpp +42 -4
  340. data/platform/wm/tools/detool/detool.vcproj +10 -1
  341. data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.Libraries.dll +0 -0
  342. data/platform/wp7/IronRuby/Bin/Silverlight3Release/IronRuby.dll +0 -0
  343. data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Dynamic.dll +0 -0
  344. data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.Core.dll +0 -0
  345. data/platform/wp7/IronRuby/Bin/Silverlight3Release/Microsoft.Scripting.dll +0 -0
  346. data/platform/wp7/RhoAppRunner/Program.cs +20 -3
  347. data/platform/wp7/RhoLogServer/Program.cs +22 -0
  348. data/platform/wp7/RhoLogServer/Properties/AssemblyInfo.cs +36 -0
  349. data/platform/wp7/RhoLogServer/RhoLogServer.csproj +65 -0
  350. data/platform/wp7/RhoLogServer/SocketServer.cs +210 -0
  351. data/platform/wp7/RhoRubyExtGen/RhoAsyncHttp.cs +6 -0
  352. data/platform/wp7/RhoRubyLib/Initializers.Generated.cs +3 -2
  353. data/platform/wp7/RhoRubyLib/RhoRuby.cs +82 -0
  354. data/platform/wp7/RhoRubyLib/RhoRubyLib.csproj +7 -5
  355. data/platform/wp7/RhoRubyLib/WP_PlatformAdaptationLayer.cs +1 -1
  356. data/platform/wp7/RhoRubyLib/common/RhoParams.cs +1 -1
  357. data/platform/wp7/RhoRubyLib/common/ThreadQueue.cs +4 -1
  358. data/platform/wp7/RhoRubyLib/db/DBAdapter.cs +2 -2
  359. data/platform/wp7/RhoRubyLib/logging/IRhoLogSink.cs +1 -1
  360. data/platform/wp7/RhoRubyLib/logging/RhoEmptyLogger.cs +30 -0
  361. data/platform/wp7/RhoRubyLib/logging/RhoLogConf.cs +10 -0
  362. data/platform/wp7/RhoRubyLib/logging/RhoLogFileSink.cs +6 -1
  363. data/platform/wp7/RhoRubyLib/logging/RhoLogServerSink.cs +56 -0
  364. data/platform/wp7/RhoRubyLib/logging/RhoLogger.cs +24 -11
  365. data/platform/wp7/RhoRubyLib/net/AsyncHttp.cs +57 -14
  366. data/platform/wp7/RhoRubyLib/net/NetRequest.cs +32 -9
  367. data/platform/wp7/RhoRubyLib/rubyext/RhoAsyncHttp.cs +7 -0
  368. data/platform/wp7/RhoRubyLib/rubyext/RhoKernelOps.cs +6 -0
  369. data/platform/wp7/RhoRubyLib/sync/SyncEngine.cs +20 -16
  370. data/platform/wp7/RhoRubyLib/sync/SyncNotify.cs +2 -2
  371. data/platform/wp7/RhoRubyLib/sync/SyncSource.cs +138 -40
  372. data/platform/wp7/WPApplication/rho/apps/app/layout.erb +3 -1
  373. data/platform/wp7/build/wp.rake +151 -12
  374. data/platform/wp7/rhodes.sln +10 -0
  375. data/platform/wp7/rhodes/App.xaml.cs +6 -0
  376. data/platform/wp7/rhodes/MainPage.xaml +3 -0
  377. data/platform/wp7/rhodes/MainPage.xaml.cs +19 -0
  378. data/platform/wp7/rhodes/Rhodes.csproj +4 -2
  379. data/rakefile.rb +7 -36
  380. data/res/build-tools/RhoAppRunner.exe +0 -0
  381. data/res/build-tools/RhoLogServer.exe +0 -0
  382. data/res/build-tools/detool.exe +0 -0
  383. data/res/build-tools/wp7explorer.exe +0 -0
  384. data/res/generators/templates/application/app/layout.erb +3 -1
  385. data/res/generators/templates/application/public/jqtouch/jqtouch.js +1 -1
  386. data/rhodes.gemspec +1 -1
  387. data/spec/framework_spec/app/layout.erb +1 -1
  388. data/spec/framework_spec/build.yml +1 -0
  389. data/spec/perfomance_spec/app/layout.erb +3 -0
  390. data/spec/phone_spec/app/Account_s/account_s.rb +4 -1
  391. data/spec/phone_spec/app/spec/rhom_object_spec.rb +30 -1
  392. data/spec/phone_spec/app/spec_runner.rb +1 -1
  393. data/spec/phone_spec/build.yml +4 -1
  394. metadata +262 -10
  395. data/platform/wp7/IronRuby/Languages/Ruby/Ruby/Builtins/ConsoleStream.cs +0 -107
@@ -0,0 +1,63 @@
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 a finder pattern, which are the three square patterns found in
23
+ * the corners of QR Codes. It also encapsulates a count of similar finder patterns,
24
+ * as a convenience to the finder's bookkeeping.</p>
25
+ *
26
+ * @author Sean Owen
27
+ */
28
+ public final class FinderPattern extends ResultPoint {
29
+
30
+ private final float estimatedModuleSize;
31
+ private int count;
32
+
33
+ FinderPattern(float posX, float posY, float estimatedModuleSize) {
34
+ super(posX, posY);
35
+ this.estimatedModuleSize = estimatedModuleSize;
36
+ this.count = 1;
37
+ }
38
+
39
+ public float getEstimatedModuleSize() {
40
+ return estimatedModuleSize;
41
+ }
42
+
43
+ int getCount() {
44
+ return count;
45
+ }
46
+
47
+ void incrementCount() {
48
+ this.count++;
49
+ }
50
+
51
+ /**
52
+ * <p>Determines if this finder pattern "about equals" a finder pattern at the stated
53
+ * position and size -- meaning, it is at nearly the same center with nearly the same size.</p>
54
+ */
55
+ boolean aboutEquals(float moduleSize, float i, float j) {
56
+ if (Math.abs(i - getY()) <= moduleSize && Math.abs(j - getX()) <= moduleSize) {
57
+ float moduleSizeDiff = Math.abs(moduleSize - estimatedModuleSize);
58
+ return moduleSizeDiff <= 1.0f || moduleSizeDiff / estimatedModuleSize <= 1.0f;
59
+ }
60
+ return false;
61
+ }
62
+
63
+ }
@@ -0,0 +1,585 @@
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.NotFoundException;
21
+ import com.google.zxing.ResultPoint;
22
+ import com.google.zxing.ResultPointCallback;
23
+ import com.google.zxing.common.BitMatrix;
24
+ import com.google.zxing.common.Collections;
25
+ import com.google.zxing.common.Comparator;
26
+
27
+ import java.util.Hashtable;
28
+ import java.util.Vector;
29
+
30
+ /**
31
+ * <p>This class attempts to find finder patterns in a QR Code. Finder patterns are the square
32
+ * markers at three corners of a QR Code.</p>
33
+ *
34
+ * <p>This class is thread-safe but not reentrant. Each thread must allocate its own object.
35
+ *
36
+ * @author Sean Owen
37
+ */
38
+ public class FinderPatternFinder {
39
+
40
+ private static final int CENTER_QUORUM = 2;
41
+ protected static final int MIN_SKIP = 3; // 1 pixel/module times 3 modules/center
42
+ protected static final int MAX_MODULES = 57; // support up to version 10 for mobile clients
43
+ private static final int INTEGER_MATH_SHIFT = 8;
44
+
45
+ private final BitMatrix image;
46
+ private final Vector possibleCenters;
47
+ private boolean hasSkipped;
48
+ private final int[] crossCheckStateCount;
49
+ private final ResultPointCallback resultPointCallback;
50
+
51
+ /**
52
+ * <p>Creates a finder that will search the image for three finder patterns.</p>
53
+ *
54
+ * @param image image to search
55
+ */
56
+ public FinderPatternFinder(BitMatrix image) {
57
+ this(image, null);
58
+ }
59
+
60
+ public FinderPatternFinder(BitMatrix image, ResultPointCallback resultPointCallback) {
61
+ this.image = image;
62
+ this.possibleCenters = new Vector();
63
+ this.crossCheckStateCount = new int[5];
64
+ this.resultPointCallback = resultPointCallback;
65
+ }
66
+
67
+ protected BitMatrix getImage() {
68
+ return image;
69
+ }
70
+
71
+ protected Vector getPossibleCenters() {
72
+ return possibleCenters;
73
+ }
74
+
75
+ FinderPatternInfo find(Hashtable hints) throws NotFoundException {
76
+ boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER);
77
+ int maxI = image.getHeight();
78
+ int maxJ = image.getWidth();
79
+ // We are looking for black/white/black/white/black modules in
80
+ // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far
81
+
82
+ // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the
83
+ // image, and then account for the center being 3 modules in size. This gives the smallest
84
+ // number of pixels the center could be, so skip this often. When trying harder, look for all
85
+ // QR versions regardless of how dense they are.
86
+ int iSkip = (3 * maxI) / (4 * MAX_MODULES);
87
+ if (iSkip < MIN_SKIP || tryHarder) {
88
+ iSkip = MIN_SKIP;
89
+ }
90
+
91
+ boolean done = false;
92
+ int[] stateCount = new int[5];
93
+ for (int i = iSkip - 1; i < maxI && !done; i += iSkip) {
94
+ // Get a row of black/white values
95
+ stateCount[0] = 0;
96
+ stateCount[1] = 0;
97
+ stateCount[2] = 0;
98
+ stateCount[3] = 0;
99
+ stateCount[4] = 0;
100
+ int currentState = 0;
101
+ for (int j = 0; j < maxJ; j++) {
102
+ if (image.get(j, i)) {
103
+ // Black pixel
104
+ if ((currentState & 1) == 1) { // Counting white pixels
105
+ currentState++;
106
+ }
107
+ stateCount[currentState]++;
108
+ } else { // White pixel
109
+ if ((currentState & 1) == 0) { // Counting black pixels
110
+ if (currentState == 4) { // A winner?
111
+ if (foundPatternCross(stateCount)) { // Yes
112
+ boolean confirmed = handlePossibleCenter(stateCount, i, j);
113
+ if (confirmed) {
114
+ // Start examining every other line. Checking each line turned out to be too
115
+ // expensive and didn't improve performance.
116
+ iSkip = 2;
117
+ if (hasSkipped) {
118
+ done = haveMultiplyConfirmedCenters();
119
+ } else {
120
+ int rowSkip = findRowSkip();
121
+ if (rowSkip > stateCount[2]) {
122
+ // Skip rows between row of lower confirmed center
123
+ // and top of presumed third confirmed center
124
+ // but back up a bit to get a full chance of detecting
125
+ // it, entire width of center of finder pattern
126
+
127
+ // Skip by rowSkip, but back off by stateCount[2] (size of last center
128
+ // of pattern we saw) to be conservative, and also back off by iSkip which
129
+ // is about to be re-added
130
+ i += rowSkip - stateCount[2] - iSkip;
131
+ j = maxJ - 1;
132
+ }
133
+ }
134
+ } else {
135
+ stateCount[0] = stateCount[2];
136
+ stateCount[1] = stateCount[3];
137
+ stateCount[2] = stateCount[4];
138
+ stateCount[3] = 1;
139
+ stateCount[4] = 0;
140
+ currentState = 3;
141
+ continue;
142
+ }
143
+ // Clear state to start looking again
144
+ currentState = 0;
145
+ stateCount[0] = 0;
146
+ stateCount[1] = 0;
147
+ stateCount[2] = 0;
148
+ stateCount[3] = 0;
149
+ stateCount[4] = 0;
150
+ } else { // No, shift counts back by two
151
+ stateCount[0] = stateCount[2];
152
+ stateCount[1] = stateCount[3];
153
+ stateCount[2] = stateCount[4];
154
+ stateCount[3] = 1;
155
+ stateCount[4] = 0;
156
+ currentState = 3;
157
+ }
158
+ } else {
159
+ stateCount[++currentState]++;
160
+ }
161
+ } else { // Counting white pixels
162
+ stateCount[currentState]++;
163
+ }
164
+ }
165
+ }
166
+ if (foundPatternCross(stateCount)) {
167
+ boolean confirmed = handlePossibleCenter(stateCount, i, maxJ);
168
+ if (confirmed) {
169
+ iSkip = stateCount[0];
170
+ if (hasSkipped) {
171
+ // Found a third one
172
+ done = haveMultiplyConfirmedCenters();
173
+ }
174
+ }
175
+ }
176
+ }
177
+
178
+ FinderPattern[] patternInfo = selectBestPatterns();
179
+ ResultPoint.orderBestPatterns(patternInfo);
180
+
181
+ return new FinderPatternInfo(patternInfo);
182
+ }
183
+
184
+ /**
185
+ * Given a count of black/white/black/white/black pixels just seen and an end position,
186
+ * figures the location of the center of this run.
187
+ */
188
+ private static float centerFromEnd(int[] stateCount, int end) {
189
+ return (float) (end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f;
190
+ }
191
+
192
+ /**
193
+ * @param stateCount count of black/white/black/white/black pixels just read
194
+ * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios
195
+ * used by finder patterns to be considered a match
196
+ */
197
+ protected static boolean foundPatternCross(int[] stateCount) {
198
+ int totalModuleSize = 0;
199
+ for (int i = 0; i < 5; i++) {
200
+ int count = stateCount[i];
201
+ if (count == 0) {
202
+ return false;
203
+ }
204
+ totalModuleSize += count;
205
+ }
206
+ if (totalModuleSize < 7) {
207
+ return false;
208
+ }
209
+ int moduleSize = (totalModuleSize << INTEGER_MATH_SHIFT) / 7;
210
+ int maxVariance = moduleSize / 2;
211
+ // Allow less than 50% variance from 1-1-3-1-1 proportions
212
+ return Math.abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance &&
213
+ Math.abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance &&
214
+ Math.abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance &&
215
+ Math.abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance &&
216
+ Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance;
217
+ }
218
+
219
+ private int[] getCrossCheckStateCount() {
220
+ crossCheckStateCount[0] = 0;
221
+ crossCheckStateCount[1] = 0;
222
+ crossCheckStateCount[2] = 0;
223
+ crossCheckStateCount[3] = 0;
224
+ crossCheckStateCount[4] = 0;
225
+ return crossCheckStateCount;
226
+ }
227
+
228
+ /**
229
+ * <p>After a horizontal scan finds a potential finder pattern, this method
230
+ * "cross-checks" by scanning down vertically through the center of the possible
231
+ * finder pattern to see if the same proportion is detected.</p>
232
+ *
233
+ * @param startI row where a finder pattern was detected
234
+ * @param centerJ center of the section that appears to cross a finder pattern
235
+ * @param maxCount maximum reasonable number of modules that should be
236
+ * observed in any reading state, based on the results of the horizontal scan
237
+ * @return vertical center of finder pattern, or {@link Float#NaN} if not found
238
+ */
239
+ private float crossCheckVertical(int startI, int centerJ, int maxCount,
240
+ int originalStateCountTotal) {
241
+ BitMatrix image = this.image;
242
+
243
+ int maxI = image.getHeight();
244
+ int[] stateCount = getCrossCheckStateCount();
245
+
246
+ // Start counting up from center
247
+ int i = startI;
248
+ while (i >= 0 && image.get(centerJ, i)) {
249
+ stateCount[2]++;
250
+ i--;
251
+ }
252
+ if (i < 0) {
253
+ return Float.NaN;
254
+ }
255
+ while (i >= 0 && !image.get(centerJ, i) && stateCount[1] <= maxCount) {
256
+ stateCount[1]++;
257
+ i--;
258
+ }
259
+ // If already too many modules in this state or ran off the edge:
260
+ if (i < 0 || stateCount[1] > maxCount) {
261
+ return Float.NaN;
262
+ }
263
+ while (i >= 0 && image.get(centerJ, i) && stateCount[0] <= maxCount) {
264
+ stateCount[0]++;
265
+ i--;
266
+ }
267
+ if (stateCount[0] > maxCount) {
268
+ return Float.NaN;
269
+ }
270
+
271
+ // Now also count down from center
272
+ i = startI + 1;
273
+ while (i < maxI && image.get(centerJ, i)) {
274
+ stateCount[2]++;
275
+ i++;
276
+ }
277
+ if (i == maxI) {
278
+ return Float.NaN;
279
+ }
280
+ while (i < maxI && !image.get(centerJ, i) && stateCount[3] < maxCount) {
281
+ stateCount[3]++;
282
+ i++;
283
+ }
284
+ if (i == maxI || stateCount[3] >= maxCount) {
285
+ return Float.NaN;
286
+ }
287
+ while (i < maxI && image.get(centerJ, i) && stateCount[4] < maxCount) {
288
+ stateCount[4]++;
289
+ i++;
290
+ }
291
+ if (stateCount[4] >= maxCount) {
292
+ return Float.NaN;
293
+ }
294
+
295
+ // If we found a finder-pattern-like section, but its size is more than 40% different than
296
+ // the original, assume it's a false positive
297
+ int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] +
298
+ stateCount[4];
299
+ if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) {
300
+ return Float.NaN;
301
+ }
302
+
303
+ return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : Float.NaN;
304
+ }
305
+
306
+ /**
307
+ * <p>Like {@link #crossCheckVertical(int, int, int, int)}, and in fact is basically identical,
308
+ * except it reads horizontally instead of vertically. This is used to cross-cross
309
+ * check a vertical cross check and locate the real center of the alignment pattern.</p>
310
+ */
311
+ private float crossCheckHorizontal(int startJ, int centerI, int maxCount,
312
+ int originalStateCountTotal) {
313
+ BitMatrix image = this.image;
314
+
315
+ int maxJ = image.getWidth();
316
+ int[] stateCount = getCrossCheckStateCount();
317
+
318
+ int j = startJ;
319
+ while (j >= 0 && image.get(j, centerI)) {
320
+ stateCount[2]++;
321
+ j--;
322
+ }
323
+ if (j < 0) {
324
+ return Float.NaN;
325
+ }
326
+ while (j >= 0 && !image.get(j, centerI) && stateCount[1] <= maxCount) {
327
+ stateCount[1]++;
328
+ j--;
329
+ }
330
+ if (j < 0 || stateCount[1] > maxCount) {
331
+ return Float.NaN;
332
+ }
333
+ while (j >= 0 && image.get(j, centerI) && stateCount[0] <= maxCount) {
334
+ stateCount[0]++;
335
+ j--;
336
+ }
337
+ if (stateCount[0] > maxCount) {
338
+ return Float.NaN;
339
+ }
340
+
341
+ j = startJ + 1;
342
+ while (j < maxJ && image.get(j, centerI)) {
343
+ stateCount[2]++;
344
+ j++;
345
+ }
346
+ if (j == maxJ) {
347
+ return Float.NaN;
348
+ }
349
+ while (j < maxJ && !image.get(j, centerI) && stateCount[3] < maxCount) {
350
+ stateCount[3]++;
351
+ j++;
352
+ }
353
+ if (j == maxJ || stateCount[3] >= maxCount) {
354
+ return Float.NaN;
355
+ }
356
+ while (j < maxJ && image.get(j, centerI) && stateCount[4] < maxCount) {
357
+ stateCount[4]++;
358
+ j++;
359
+ }
360
+ if (stateCount[4] >= maxCount) {
361
+ return Float.NaN;
362
+ }
363
+
364
+ // If we found a finder-pattern-like section, but its size is significantly different than
365
+ // the original, assume it's a false positive
366
+ int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] +
367
+ stateCount[4];
368
+ if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) {
369
+ return Float.NaN;
370
+ }
371
+
372
+ return foundPatternCross(stateCount) ? centerFromEnd(stateCount, j) : Float.NaN;
373
+ }
374
+
375
+ /**
376
+ * <p>This is called when a horizontal scan finds a possible alignment pattern. It will
377
+ * cross check with a vertical scan, and if successful, will, ah, cross-cross-check
378
+ * with another horizontal scan. This is needed primarily to locate the real horizontal
379
+ * center of the pattern in cases of extreme skew.</p>
380
+ *
381
+ * <p>If that succeeds the finder pattern location is added to a list that tracks
382
+ * the number of times each location has been nearly-matched as a finder pattern.
383
+ * Each additional find is more evidence that the location is in fact a finder
384
+ * pattern center
385
+ *
386
+ * @param stateCount reading state module counts from horizontal scan
387
+ * @param i row where finder pattern may be found
388
+ * @param j end of possible finder pattern in row
389
+ * @return true if a finder pattern candidate was found this time
390
+ */
391
+ protected boolean handlePossibleCenter(int[] stateCount, int i, int j) {
392
+ int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] +
393
+ stateCount[4];
394
+ float centerJ = centerFromEnd(stateCount, j);
395
+ float centerI = crossCheckVertical(i, (int) centerJ, stateCount[2], stateCountTotal);
396
+ if (!Float.isNaN(centerI)) {
397
+ // Re-cross check
398
+ centerJ = crossCheckHorizontal((int) centerJ, (int) centerI, stateCount[2], stateCountTotal);
399
+ if (!Float.isNaN(centerJ)) {
400
+ float estimatedModuleSize = (float) stateCountTotal / 7.0f;
401
+ boolean found = false;
402
+ int max = possibleCenters.size();
403
+ for (int index = 0; index < max; index++) {
404
+ FinderPattern center = (FinderPattern) possibleCenters.elementAt(index);
405
+ // Look for about the same center and module size:
406
+ if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) {
407
+ center.incrementCount();
408
+ found = true;
409
+ break;
410
+ }
411
+ }
412
+ if (!found) {
413
+ ResultPoint point = new FinderPattern(centerJ, centerI, estimatedModuleSize);
414
+ possibleCenters.addElement(point);
415
+ if (resultPointCallback != null) {
416
+ resultPointCallback.foundPossibleResultPoint(point);
417
+ }
418
+ }
419
+ return true;
420
+ }
421
+ }
422
+ return false;
423
+ }
424
+
425
+ /**
426
+ * @return number of rows we could safely skip during scanning, based on the first
427
+ * two finder patterns that have been located. In some cases their position will
428
+ * allow us to infer that the third pattern must lie below a certain point farther
429
+ * down in the image.
430
+ */
431
+ private int findRowSkip() {
432
+ int max = possibleCenters.size();
433
+ if (max <= 1) {
434
+ return 0;
435
+ }
436
+ FinderPattern firstConfirmedCenter = null;
437
+ for (int i = 0; i < max; i++) {
438
+ FinderPattern center = (FinderPattern) possibleCenters.elementAt(i);
439
+ if (center.getCount() >= CENTER_QUORUM) {
440
+ if (firstConfirmedCenter == null) {
441
+ firstConfirmedCenter = center;
442
+ } else {
443
+ // We have two confirmed centers
444
+ // How far down can we skip before resuming looking for the next
445
+ // pattern? In the worst case, only the difference between the
446
+ // difference in the x / y coordinates of the two centers.
447
+ // This is the case where you find top left last.
448
+ hasSkipped = true;
449
+ return (int) (Math.abs(firstConfirmedCenter.getX() - center.getX()) -
450
+ Math.abs(firstConfirmedCenter.getY() - center.getY())) / 2;
451
+ }
452
+ }
453
+ }
454
+ return 0;
455
+ }
456
+
457
+ /**
458
+ * @return true iff we have found at least 3 finder patterns that have been detected
459
+ * at least {@link #CENTER_QUORUM} times each, and, the estimated module size of the
460
+ * candidates is "pretty similar"
461
+ */
462
+ private boolean haveMultiplyConfirmedCenters() {
463
+ int confirmedCount = 0;
464
+ float totalModuleSize = 0.0f;
465
+ int max = possibleCenters.size();
466
+ for (int i = 0; i < max; i++) {
467
+ FinderPattern pattern = (FinderPattern) possibleCenters.elementAt(i);
468
+ if (pattern.getCount() >= CENTER_QUORUM) {
469
+ confirmedCount++;
470
+ totalModuleSize += pattern.getEstimatedModuleSize();
471
+ }
472
+ }
473
+ if (confirmedCount < 3) {
474
+ return false;
475
+ }
476
+ // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive"
477
+ // and that we need to keep looking. We detect this by asking if the estimated module sizes
478
+ // vary too much. We arbitrarily say that when the total deviation from average exceeds
479
+ // 5% of the total module size estimates, it's too much.
480
+ float average = totalModuleSize / (float) max;
481
+ float totalDeviation = 0.0f;
482
+ for (int i = 0; i < max; i++) {
483
+ FinderPattern pattern = (FinderPattern) possibleCenters.elementAt(i);
484
+ totalDeviation += Math.abs(pattern.getEstimatedModuleSize() - average);
485
+ }
486
+ return totalDeviation <= 0.05f * totalModuleSize;
487
+ }
488
+
489
+ /**
490
+ * @return the 3 best {@link FinderPattern}s from our list of candidates. The "best" are
491
+ * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module
492
+ * size differs from the average among those patterns the least
493
+ * @throws NotFoundException if 3 such finder patterns do not exist
494
+ */
495
+ private FinderPattern[] selectBestPatterns() throws NotFoundException {
496
+
497
+ int startSize = possibleCenters.size();
498
+ if (startSize < 3) {
499
+ // Couldn't find enough finder patterns
500
+ throw NotFoundException.getNotFoundInstance();
501
+ }
502
+
503
+ // Filter outlier possibilities whose module size is too different
504
+ if (startSize > 3) {
505
+ // But we can only afford to do so if we have at least 4 possibilities to choose from
506
+ float totalModuleSize = 0.0f;
507
+ float square = 0.0f;
508
+ for (int i = 0; i < startSize; i++) {
509
+ float size = ((FinderPattern) possibleCenters.elementAt(i)).getEstimatedModuleSize();
510
+ totalModuleSize += size;
511
+ square += size * size;
512
+ }
513
+ float average = totalModuleSize / (float) startSize;
514
+ float stdDev = (float) Math.sqrt(square / startSize - average * average);
515
+
516
+ Collections.insertionSort(possibleCenters, new FurthestFromAverageComparator(average));
517
+
518
+ float limit = Math.max(0.2f * average, stdDev);
519
+
520
+ for (int i = 0; i < possibleCenters.size() && possibleCenters.size() > 3; i++) {
521
+ FinderPattern pattern = (FinderPattern) possibleCenters.elementAt(i);
522
+ if (Math.abs(pattern.getEstimatedModuleSize() - average) > limit) {
523
+ possibleCenters.removeElementAt(i);
524
+ i--;
525
+ }
526
+ }
527
+ }
528
+
529
+ if (possibleCenters.size() > 3) {
530
+ // Throw away all but those first size candidate points we found.
531
+
532
+ float totalModuleSize = 0.0f;
533
+ for (int i = 0; i < possibleCenters.size(); i++) {
534
+ totalModuleSize += ((FinderPattern) possibleCenters.elementAt(i)).getEstimatedModuleSize();
535
+ }
536
+
537
+ float average = totalModuleSize / (float) possibleCenters.size();
538
+
539
+ Collections.insertionSort(possibleCenters, new CenterComparator(average));
540
+
541
+ possibleCenters.setSize(3);
542
+ }
543
+
544
+ return new FinderPattern[]{
545
+ (FinderPattern) possibleCenters.elementAt(0),
546
+ (FinderPattern) possibleCenters.elementAt(1),
547
+ (FinderPattern) possibleCenters.elementAt(2)
548
+ };
549
+ }
550
+
551
+ /**
552
+ * <p>Orders by furthest from average</p>
553
+ */
554
+ private static class FurthestFromAverageComparator implements Comparator {
555
+ private final float average;
556
+ public FurthestFromAverageComparator(float f) {
557
+ average = f;
558
+ }
559
+ public int compare(Object center1, Object center2) {
560
+ float dA = Math.abs(((FinderPattern) center2).getEstimatedModuleSize() - average);
561
+ float dB = Math.abs(((FinderPattern) center1).getEstimatedModuleSize() - average);
562
+ return dA < dB ? -1 : (dA == dB ? 0 : 1);
563
+ }
564
+ }
565
+
566
+ /**
567
+ * <p>Orders by {@link FinderPattern#getCount()}, descending.</p>
568
+ */
569
+ private static class CenterComparator implements Comparator {
570
+ private final float average;
571
+ public CenterComparator(float f) {
572
+ average = f;
573
+ }
574
+ public int compare(Object center1, Object center2) {
575
+ if (((FinderPattern) center2).getCount() != ((FinderPattern) center1).getCount()) {
576
+ return ((FinderPattern) center2).getCount() - ((FinderPattern) center1).getCount();
577
+ } else {
578
+ float dA = Math.abs(((FinderPattern) center2).getEstimatedModuleSize() - average);
579
+ float dB = Math.abs(((FinderPattern) center1).getEstimatedModuleSize() - average);
580
+ return dA < dB ? 1 : (dA == dB ? 0 : -1);
581
+ }
582
+ }
583
+ }
584
+
585
+ }