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