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