zxing_cpp 0.1.0

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 (332) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.gitmodules +3 -0
  4. data/CHANGELOG.rdoc +6 -0
  5. data/Gemfile +3 -0
  6. data/Manifest.txt +331 -0
  7. data/README.rdoc +138 -0
  8. data/Rakefile +28 -0
  9. data/bin/zxd +87 -0
  10. data/bin/zxe +53 -0
  11. data/ext/zxing/extconf.rb +27 -0
  12. data/ext/zxing/zxing-cpp/.gitignore +4 -0
  13. data/ext/zxing/zxing-cpp/AUTHORS +115 -0
  14. data/ext/zxing/zxing-cpp/CMakeLists.txt +84 -0
  15. data/ext/zxing/zxing-cpp/COPYING +201 -0
  16. data/ext/zxing/zxing-cpp/NOTICE +65 -0
  17. data/ext/zxing/zxing-cpp/README.md +50 -0
  18. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.cpp +112 -0
  19. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.h +40 -0
  20. data/ext/zxing/zxing-cpp/cli/src/jpgd.cpp +3174 -0
  21. data/ext/zxing/zxing-cpp/cli/src/jpgd.h +319 -0
  22. data/ext/zxing/zxing-cpp/cli/src/lodepng.cpp +6261 -0
  23. data/ext/zxing/zxing-cpp/cli/src/lodepng.h +1695 -0
  24. data/ext/zxing/zxing-cpp/cli/src/main.cpp +297 -0
  25. data/ext/zxing/zxing-cpp/cmake/FindCPPUNIT.cmake +54 -0
  26. data/ext/zxing/zxing-cpp/cmake/FindIconv.cmake +57 -0
  27. data/ext/zxing/zxing-cpp/core/src/bigint/.gitignore +6 -0
  28. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.cc +405 -0
  29. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.hh +215 -0
  30. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.cc +70 -0
  31. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.hh +25 -0
  32. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerLibrary.hh +8 -0
  33. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.cc +50 -0
  34. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.hh +72 -0
  35. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.cc +697 -0
  36. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.hh +418 -0
  37. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.cc +125 -0
  38. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.hh +122 -0
  39. data/ext/zxing/zxing-cpp/core/src/bigint/ChangeLog +146 -0
  40. data/ext/zxing/zxing-cpp/core/src/bigint/Makefile +73 -0
  41. data/ext/zxing/zxing-cpp/core/src/bigint/NumberlikeArray.hh +177 -0
  42. data/ext/zxing/zxing-cpp/core/src/bigint/README +71 -0
  43. data/ext/zxing/zxing-cpp/core/src/win32/zxing/iconv.h +14 -0
  44. data/ext/zxing/zxing-cpp/core/src/win32/zxing/stdint.h +247 -0
  45. data/ext/zxing/zxing-cpp/core/src/win32/zxing/win_iconv.c +2035 -0
  46. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.cpp +40 -0
  47. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.h +60 -0
  48. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.cpp +45 -0
  49. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.h +50 -0
  50. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.cpp +70 -0
  51. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.h +56 -0
  52. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.cpp +28 -0
  53. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.h +34 -0
  54. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.cpp +142 -0
  55. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.h +85 -0
  56. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.cpp +43 -0
  57. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.h +51 -0
  58. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.cpp +41 -0
  59. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.h +37 -0
  60. data/ext/zxing/zxing-cpp/core/src/zxing/IllegalStateException.h +35 -0
  61. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.cpp +68 -0
  62. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.h +48 -0
  63. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.cpp +86 -0
  64. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.h +59 -0
  65. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.cpp +124 -0
  66. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.h +48 -0
  67. data/ext/zxing/zxing-cpp/core/src/zxing/NotFoundException.h +35 -0
  68. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.cpp +31 -0
  69. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.h +40 -0
  70. data/ext/zxing/zxing-cpp/core/src/zxing/ReaderException.h +37 -0
  71. data/ext/zxing/zxing-cpp/core/src/zxing/Result.cpp +61 -0
  72. data/ext/zxing/zxing-cpp/core/src/zxing/Result.h +55 -0
  73. data/ext/zxing/zxing-cpp/core/src/zxing/ResultIO.cpp +34 -0
  74. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.cpp +108 -0
  75. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.h +55 -0
  76. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.cpp +26 -0
  77. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.h +39 -0
  78. data/ext/zxing/zxing-cpp/core/src/zxing/ZXing.h +133 -0
  79. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.cpp +54 -0
  80. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.h +48 -0
  81. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.cpp +68 -0
  82. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.h +49 -0
  83. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.cpp +489 -0
  84. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.h +69 -0
  85. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.cpp +548 -0
  86. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.h +92 -0
  87. data/ext/zxing/zxing-cpp/core/src/zxing/common/Array.h +170 -0
  88. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.cpp +155 -0
  89. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.h +81 -0
  90. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArrayIO.cpp +31 -0
  91. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.cpp +143 -0
  92. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.h +91 -0
  93. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.cpp +76 -0
  94. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.h +74 -0
  95. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.cpp +104 -0
  96. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.h +53 -0
  97. data/ext/zxing/zxing-cpp/core/src/zxing/common/Counted.h +140 -0
  98. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.cpp +46 -0
  99. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.h +51 -0
  100. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.cpp +39 -0
  101. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.h +43 -0
  102. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp +212 -0
  103. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.h +48 -0
  104. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp +80 -0
  105. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.h +53 -0
  106. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +81 -0
  107. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +46 -0
  108. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.cpp +122 -0
  109. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.h +45 -0
  110. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.cpp +226 -0
  111. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.h +67 -0
  112. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.cpp +27 -0
  113. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.h +36 -0
  114. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.cpp +107 -0
  115. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.h +49 -0
  116. data/ext/zxing/zxing-cpp/core/src/zxing/common/Point.h +47 -0
  117. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.cpp +61 -0
  118. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.h +51 -0
  119. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.cpp +198 -0
  120. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.h +52 -0
  121. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/JavaMath.h +43 -0
  122. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MathUtils.h +57 -0
  123. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp +174 -0
  124. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h +62 -0
  125. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp +330 -0
  126. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h +59 -0
  127. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp +150 -0
  128. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.h +73 -0
  129. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp +218 -0
  130. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h +56 -0
  131. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +174 -0
  132. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +49 -0
  133. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +30 -0
  134. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h +33 -0
  135. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp +54 -0
  136. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.h +45 -0
  137. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.cpp +199 -0
  138. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.h +87 -0
  139. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +361 -0
  140. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +59 -0
  141. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp +113 -0
  142. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.h +49 -0
  143. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +416 -0
  144. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +104 -0
  145. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp +93 -0
  146. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.h +49 -0
  147. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp +46 -0
  148. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.h +43 -0
  149. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.cpp +446 -0
  150. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.h +94 -0
  151. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp +23 -0
  152. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.h +23 -0
  153. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.cpp +75 -0
  154. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.h +42 -0
  155. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp +137 -0
  156. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h +51 -0
  157. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp +29 -0
  158. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.h +41 -0
  159. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp +58 -0
  160. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h +36 -0
  161. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp +47 -0
  162. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h +37 -0
  163. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp +236 -0
  164. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h +47 -0
  165. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.cpp +340 -0
  166. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.h +57 -0
  167. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.cpp +496 -0
  168. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.h +48 -0
  169. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.cpp +328 -0
  170. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.h +63 -0
  171. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.cpp +293 -0
  172. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.h +58 -0
  173. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.cpp +85 -0
  174. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.h +49 -0
  175. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.cpp +65 -0
  176. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.h +47 -0
  177. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.cpp +337 -0
  178. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.h +54 -0
  179. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp +96 -0
  180. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.h +38 -0
  181. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +110 -0
  182. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h +41 -0
  183. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.cpp +227 -0
  184. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.h +81 -0
  185. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.cpp +28 -0
  186. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.h +35 -0
  187. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.cpp +71 -0
  188. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.h +50 -0
  189. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.cpp +309 -0
  190. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.h +88 -0
  191. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.cpp +146 -0
  192. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.h +47 -0
  193. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.cpp +170 -0
  194. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.h +49 -0
  195. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp +997 -0
  196. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h +84 -0
  197. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp +563 -0
  198. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h +84 -0
  199. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.cpp +118 -0
  200. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.h +62 -0
  201. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp +214 -0
  202. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h +71 -0
  203. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp +120 -0
  204. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h +72 -0
  205. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp +284 -0
  206. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h +68 -0
  207. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.cpp +664 -0
  208. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.h +106 -0
  209. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp +714 -0
  210. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.h +122 -0
  211. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +65 -0
  212. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h +52 -0
  213. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.cpp +117 -0
  214. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.h +54 -0
  215. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.cpp +52 -0
  216. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.h +48 -0
  217. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.cpp +560 -0
  218. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.h +85 -0
  219. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +183 -0
  220. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h +56 -0
  221. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp +118 -0
  222. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.h +50 -0
  223. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.cpp +159 -0
  224. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.h +50 -0
  225. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +425 -0
  226. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +72 -0
  227. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.cpp +107 -0
  228. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.h +46 -0
  229. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.cpp +90 -0
  230. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.h +57 -0
  231. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +47 -0
  232. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h +45 -0
  233. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +208 -0
  234. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +68 -0
  235. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.cpp +314 -0
  236. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.h +69 -0
  237. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp +69 -0
  238. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.h +48 -0
  239. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +559 -0
  240. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h +76 -0
  241. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +41 -0
  242. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h +47 -0
  243. data/ext/zxing/zxing-cpp/core/tests/src/TestRunner.cpp +30 -0
  244. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.cpp +216 -0
  245. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.h +61 -0
  246. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.cpp +106 -0
  247. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.h +55 -0
  248. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.cpp +49 -0
  249. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.h +42 -0
  250. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.cpp +58 -0
  251. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.h +46 -0
  252. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.cpp +69 -0
  253. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.h +47 -0
  254. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +129 -0
  255. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h +62 -0
  256. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +47 -0
  257. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +45 -0
  258. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.cpp +88 -0
  259. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.h +47 -0
  260. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.cpp +88 -0
  261. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.h +49 -0
  262. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp +132 -0
  263. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.h +91 -0
  264. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.cpp +52 -0
  265. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.h +47 -0
  266. data/ext/zxing/zxing.cc +224 -0
  267. data/lib/zxing.rb +50 -0
  268. data/lib/zxing/.gitignore +2 -0
  269. data/lib/zxing/aztec.rb +5 -0
  270. data/lib/zxing/aztec/aztec_reader.rb +14 -0
  271. data/lib/zxing/bad_image_exception.rb +4 -0
  272. data/lib/zxing/binarizer.rb +8 -0
  273. data/lib/zxing/binary_bitmap.rb +15 -0
  274. data/lib/zxing/checksum_exception.rb +4 -0
  275. data/lib/zxing/common.rb +7 -0
  276. data/lib/zxing/common/bit_matrix.rb +9 -0
  277. data/lib/zxing/common/hybrid_binarizer.rb +17 -0
  278. data/lib/zxing/common/illegal_argument_exception.rb +4 -0
  279. data/lib/zxing/datamatrix.rb +5 -0
  280. data/lib/zxing/datamatrix/data_matrix_reader.rb +14 -0
  281. data/lib/zxing/decodable.rb +11 -0
  282. data/lib/zxing/exception.rb +4 -0
  283. data/lib/zxing/ffi.rb +20 -0
  284. data/lib/zxing/ffi/aztec.rb +6 -0
  285. data/lib/zxing/ffi/aztec/aztec_reader.rb +9 -0
  286. data/lib/zxing/ffi/binarizer.rb +25 -0
  287. data/lib/zxing/ffi/binary_bitmap.rb +15 -0
  288. data/lib/zxing/ffi/common.rb +8 -0
  289. data/lib/zxing/ffi/common/bit_matrix.rb +12 -0
  290. data/lib/zxing/ffi/common/greyscale_luminance_source.rb +30 -0
  291. data/lib/zxing/ffi/common/hybrid_binarizer.rb +10 -0
  292. data/lib/zxing/ffi/datamatrix.rb +6 -0
  293. data/lib/zxing/ffi/datamatrix/data_matrix_reader.rb +9 -0
  294. data/lib/zxing/ffi/library.rb +102 -0
  295. data/lib/zxing/ffi/luminance_source.rb +18 -0
  296. data/lib/zxing/ffi/multi_format_reader.rb +9 -0
  297. data/lib/zxing/ffi/oned.rb +6 -0
  298. data/lib/zxing/ffi/oned/code_39_reader.rb +10 -0
  299. data/lib/zxing/ffi/qrcode.rb +8 -0
  300. data/lib/zxing/ffi/qrcode/decoder.rb +10 -0
  301. data/lib/zxing/ffi/qrcode/detector.rb +10 -0
  302. data/lib/zxing/ffi/reader.rb +58 -0
  303. data/lib/zxing/ffi/result.rb +23 -0
  304. data/lib/zxing/format_exception.rb +4 -0
  305. data/lib/zxing/illegal_argument_exception.rb +4 -0
  306. data/lib/zxing/image.rb +15 -0
  307. data/lib/zxing/luminance_source.rb +18 -0
  308. data/lib/zxing/multi_format_reader.rb +11 -0
  309. data/lib/zxing/not_found_exception.rb +4 -0
  310. data/lib/zxing/oned.rb +5 -0
  311. data/lib/zxing/oned/code_39_reader.rb +15 -0
  312. data/lib/zxing/qrcode.rb +8 -0
  313. data/lib/zxing/qrcode/decoder.rb +14 -0
  314. data/lib/zxing/qrcode/detector.rb +14 -0
  315. data/lib/zxing/qrcode/encoder.rb +8 -0
  316. data/lib/zxing/qrcode/encoder/byte_matrix.rb +18 -0
  317. data/lib/zxing/qrcode/encoder/encoder.rb +9 -0
  318. data/lib/zxing/qrcode/encoder/qrcode.rb +18 -0
  319. data/lib/zxing/reader.rb +8 -0
  320. data/lib/zxing/reader_exception.rb +4 -0
  321. data/lib/zxing/reed_solomon_exception.rb +2 -0
  322. data/lib/zxing/result.rb +18 -0
  323. data/lib/zxing/rmagick.rb +5 -0
  324. data/lib/zxing/rmagick/image.rb +104 -0
  325. data/lib/zxing/version.rb +33 -0
  326. data/test/qrcode.png +0 -0
  327. data/test/test_helper.rb +5 -0
  328. data/test/test_zxing.rb +58 -0
  329. data/test/vendor.rb +360 -0
  330. data/test/zxing/test_decodable.rb +38 -0
  331. data/zxing_cpp.gemspec +48 -0
  332. metadata +473 -0
@@ -0,0 +1,43 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __ZXING_COMMON_DETECTOR_MATH_H__
3
+ #define __ZXING_COMMON_DETECTOR_MATH_H__
4
+ /*
5
+ * Copyright 2012 ZXing authors All rights reserved.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ #include <cmath>
21
+
22
+ namespace zxing {
23
+ namespace common {
24
+ namespace detector {
25
+
26
+ class Math {
27
+ private:
28
+ Math();
29
+ ~Math();
30
+ public:
31
+
32
+ // Java standard Math.round
33
+ static inline int round(float a) {
34
+ return (int)std::floor(a +0.5f);
35
+ }
36
+
37
+ };
38
+
39
+ }
40
+ }
41
+ }
42
+
43
+ #endif
@@ -0,0 +1,57 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __ZXING_COMMON_DETECTOR_MATHUTILS_H__
3
+ #define __ZXING_COMMON_DETECTOR_MATHUTILS_H__
4
+ /*
5
+ * Copyright 2012 ZXing authors All rights reserved.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ #include <cmath>
21
+
22
+ namespace zxing {
23
+ namespace common {
24
+ namespace detector {
25
+
26
+ class MathUtils {
27
+ private:
28
+ MathUtils();
29
+ ~MathUtils();
30
+ public:
31
+
32
+ /**
33
+ * Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its
34
+ * argument to the nearest int, where x.5 rounds up to x+1.
35
+ */
36
+ static inline int round(float d) {
37
+ return (int) (d + 0.5f);
38
+ }
39
+
40
+ static inline float distance(float aX, float aY, float bX, float bY) {
41
+ float xDiff = aX - bX;
42
+ float yDiff = aY - bY;
43
+ return sqrt(xDiff * xDiff + yDiff * yDiff);
44
+ }
45
+
46
+ static inline float distance(int aX, int aY, int bX, int bY) {
47
+ int xDiff = aX - bX;
48
+ int yDiff = aY - bY;
49
+ return sqrt(float(xDiff * xDiff + yDiff * yDiff));
50
+ }
51
+ };
52
+
53
+ }
54
+ }
55
+ }
56
+
57
+ #endif
@@ -0,0 +1,174 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * MonochromeRectangleDetector.cpp
4
+ * y_wmk
5
+ *
6
+ * Created by Luiz Silva on 09/02/2010.
7
+ * Copyright 2010 y_wmk authors All rights reserved.
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+
22
+ #include <zxing/NotFoundException.h>
23
+ #include <zxing/common/detector/MonochromeRectangleDetector.h>
24
+ #include <sstream>
25
+
26
+ using std::vector;
27
+ using zxing::Ref;
28
+ using zxing::ResultPoint;
29
+ using zxing::TwoInts;
30
+ using zxing::MonochromeRectangleDetector;
31
+
32
+ vector<Ref<ResultPoint> > MonochromeRectangleDetector::detect() {
33
+ int height = image_->getHeight();
34
+ int width = image_->getWidth();
35
+ int halfHeight = height >> 1;
36
+ int halfWidth = width >> 1;
37
+ int deltaY = std::max(1, height / (MAX_MODULES << 3));
38
+ int deltaX = std::max(1, width / (MAX_MODULES << 3));
39
+
40
+ int top = 0;
41
+ int bottom = height;
42
+ int left = 0;
43
+ int right = width;
44
+ Ref<ResultPoint> pointA(findCornerFromCenter(halfWidth, 0, left, right,
45
+ halfHeight, -deltaY, top, bottom, halfWidth >> 1));
46
+ top = (int) pointA->getY() - 1;;
47
+ Ref<ResultPoint> pointB(findCornerFromCenter(halfWidth, -deltaX, left, right,
48
+ halfHeight, 0, top, bottom, halfHeight >> 1));
49
+ left = (int) pointB->getX() - 1;
50
+ Ref<ResultPoint> pointC(findCornerFromCenter(halfWidth, deltaX, left, right,
51
+ halfHeight, 0, top, bottom, halfHeight >> 1));
52
+ right = (int) pointC->getX() + 1;
53
+ Ref<ResultPoint> pointD(findCornerFromCenter(halfWidth, 0, left, right,
54
+ halfHeight, deltaY, top, bottom, halfWidth >> 1));
55
+ bottom = (int) pointD->getY() + 1;
56
+
57
+ // Go try to find point A again with better information -- might have been off at first.
58
+ pointA.reset(findCornerFromCenter(halfWidth, 0, left, right,
59
+ halfHeight, -deltaY, top, bottom, halfWidth >> 2));
60
+
61
+ vector<Ref<ResultPoint> > corners(4);
62
+ corners[0].reset(pointA);
63
+ corners[1].reset(pointB);
64
+ corners[2].reset(pointC);
65
+ corners[3].reset(pointD);
66
+ return corners;
67
+ }
68
+
69
+ Ref<ResultPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX, int deltaX, int left, int right,
70
+ int centerY, int deltaY, int top, int bottom, int maxWhiteRun) {
71
+ Ref<TwoInts> lastRange(NULL);
72
+ for (int y = centerY, x = centerX;
73
+ y < bottom && y >= top && x < right && x >= left;
74
+ y += deltaY, x += deltaX) {
75
+ Ref<TwoInts> range(NULL);
76
+ if (deltaX == 0) {
77
+ // horizontal slices, up and down
78
+ range = blackWhiteRange(y, maxWhiteRun, left, right, true);
79
+ } else {
80
+ // vertical slices, left and right
81
+ range = blackWhiteRange(x, maxWhiteRun, top, bottom, false);
82
+ }
83
+ if (range == NULL) {
84
+ if (lastRange == NULL) {
85
+ throw NotFoundException("Couldn't find corners (lastRange = NULL) ");
86
+ } else {
87
+ // lastRange was found
88
+ if (deltaX == 0) {
89
+ int lastY = y - deltaY;
90
+ if (lastRange->start < centerX) {
91
+ if (lastRange->end > centerX) {
92
+ // straddle, choose one or the other based on direction
93
+ Ref<ResultPoint> result(new ResultPoint(deltaY > 0 ? lastRange->start : lastRange->end, lastY));
94
+ return result;
95
+ }
96
+ Ref<ResultPoint> result(new ResultPoint(lastRange->start, lastY));
97
+ return result;
98
+ } else {
99
+ Ref<ResultPoint> result(new ResultPoint(lastRange->end, lastY));
100
+ return result;
101
+ }
102
+ } else {
103
+ int lastX = x - deltaX;
104
+ if (lastRange->start < centerY) {
105
+ if (lastRange->end > centerY) {
106
+ Ref<ResultPoint> result(new ResultPoint(lastX, deltaX < 0 ? lastRange->start : lastRange->end));
107
+ return result;
108
+ }
109
+ Ref<ResultPoint> result(new ResultPoint(lastX, lastRange->start));
110
+ return result;
111
+ } else {
112
+ Ref<ResultPoint> result(new ResultPoint(lastX, lastRange->end));
113
+ return result;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ lastRange = range;
119
+ }
120
+ throw NotFoundException("Couldn't find corners");
121
+ }
122
+
123
+ Ref<TwoInts> MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim,
124
+ bool horizontal) {
125
+
126
+ int center = (minDim + maxDim) >> 1;
127
+
128
+ // Scan left/up first
129
+ int start = center;
130
+ while (start >= minDim) {
131
+ if (horizontal ? image_->get(start, fixedDimension) : image_->get(fixedDimension, start)) {
132
+ start--;
133
+ } else {
134
+ int whiteRunStart = start;
135
+ do {
136
+ start--;
137
+ } while (start >= minDim && !(horizontal ? image_->get(start, fixedDimension) :
138
+ image_->get(fixedDimension, start)));
139
+ int whiteRunSize = whiteRunStart - start;
140
+ if (start < minDim || whiteRunSize > maxWhiteRun) {
141
+ start = whiteRunStart;
142
+ break;
143
+ }
144
+ }
145
+ }
146
+ start++;
147
+
148
+ // Then try right/down
149
+ int end = center;
150
+ while (end < maxDim) {
151
+ if (horizontal ? image_->get(end, fixedDimension) : image_->get(fixedDimension, end)) {
152
+ end++;
153
+ } else {
154
+ int whiteRunStart = end;
155
+ do {
156
+ end++;
157
+ } while (end < maxDim && !(horizontal ? image_->get(end, fixedDimension) :
158
+ image_->get(fixedDimension, end)));
159
+ int whiteRunSize = end - whiteRunStart;
160
+ if (end >= maxDim || whiteRunSize > maxWhiteRun) {
161
+ end = whiteRunStart;
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ end--;
167
+ Ref<TwoInts> result(NULL);
168
+ if (end > start) {
169
+ result = new TwoInts;
170
+ result->start = start;
171
+ result->end = end;
172
+ }
173
+ return result;
174
+ }
@@ -0,0 +1,62 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+
3
+ #ifndef __MONOCHROMERECTANGLEDETECTOR_H__
4
+ #define __MONOCHROMERECTANGLEDETECTOR_H__
5
+
6
+ /*
7
+ * MonochromeRectangleDetector.h
8
+ * y_wmk
9
+ *
10
+ * Created by Luiz Silva on 09/02/2010.
11
+ * Copyright 2010 y_wmk authors All rights reserved.
12
+ *
13
+ * Licensed under the Apache License, Version 2.0 (the "License");
14
+ * you may not use this file except in compliance with the License.
15
+ * You may obtain a copy of the License at
16
+ *
17
+ * http://www.apache.org/licenses/LICENSE-2.0
18
+ *
19
+ * Unless required by applicable law or agreed to in writing, software
20
+ * distributed under the License is distributed on an "AS IS" BASIS,
21
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
+ * See the License for the specific language governing permissions and
23
+ * limitations under the License.
24
+ */
25
+
26
+ #include <vector>
27
+ #include <zxing/NotFoundException.h>
28
+ #include <zxing/ResultPoint.h>
29
+ #include <zxing/common/BitMatrix.h>
30
+ #include <zxing/common/Counted.h>
31
+ #include <zxing/ResultPoint.h>
32
+
33
+ namespace zxing {
34
+
35
+ struct TwoInts: public Counted {
36
+ int start;
37
+ int end;
38
+ };
39
+
40
+ class MonochromeRectangleDetector : public Counted {
41
+ private:
42
+ static const int MAX_MODULES = 32;
43
+ Ref<BitMatrix> image_;
44
+
45
+ public:
46
+ MonochromeRectangleDetector(Ref<BitMatrix> image) : image_(image) { };
47
+
48
+ std::vector<Ref<ResultPoint> > detect();
49
+
50
+ private:
51
+ Ref<ResultPoint> findCornerFromCenter(int centerX, int deltaX, int left, int right,
52
+ int centerY, int deltaY, int top, int bottom, int maxWhiteRun);
53
+
54
+ Ref<TwoInts> blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim,
55
+ bool horizontal);
56
+
57
+ int max(int a, float b) { return (float) a > b ? a : (int) b;};
58
+ };
59
+
60
+ }
61
+
62
+ #endif // __MONOCHROMERECTANGLEDETECTOR_H__
@@ -0,0 +1,330 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * WhiteRectangleDetector.cpp
4
+ * y_wmk
5
+ *
6
+ * Created by Luiz Silva on 09/02/2010.
7
+ * Copyright 2010 y_wmk authors All rights reserved.
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+
22
+ #include <zxing/NotFoundException.h>
23
+ #include <zxing/common/detector/WhiteRectangleDetector.h>
24
+ #include <zxing/common/detector/MathUtils.h>
25
+ #include <sstream>
26
+
27
+ using std::vector;
28
+ using zxing::Ref;
29
+ using zxing::ResultPoint;
30
+ using zxing::WhiteRectangleDetector;
31
+ using zxing::common::detector::MathUtils;
32
+
33
+ // VC++
34
+ using zxing::BitMatrix;
35
+
36
+ int WhiteRectangleDetector::INIT_SIZE = 30;
37
+ int WhiteRectangleDetector::CORR = 1;
38
+
39
+ WhiteRectangleDetector::WhiteRectangleDetector(Ref<BitMatrix> image) : image_(image) {
40
+ width_ = image->getWidth();
41
+ height_ = image->getHeight();
42
+
43
+ leftInit_ = (width_ - INIT_SIZE) >> 1;
44
+ rightInit_ = (width_ + INIT_SIZE) >> 1;
45
+ upInit_ = (height_ - INIT_SIZE) >> 1;
46
+ downInit_ = (height_ + INIT_SIZE) >> 1;
47
+
48
+ if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) {
49
+ throw NotFoundException("Invalid dimensions WhiteRectangleDetector");
50
+ }
51
+ }
52
+
53
+ WhiteRectangleDetector::WhiteRectangleDetector(Ref<BitMatrix> image, int initSize, int x, int y) : image_(image) {
54
+ width_ = image->getWidth();
55
+ height_ = image->getHeight();
56
+
57
+ int halfsize = initSize >> 1;
58
+ leftInit_ = x - halfsize;
59
+ rightInit_ = x + halfsize;
60
+ upInit_ = y - halfsize;
61
+ downInit_ = y + halfsize;
62
+
63
+ if (upInit_ < 0 || leftInit_ < 0 || downInit_ >= height_ || rightInit_ >= width_) {
64
+ throw NotFoundException("Invalid dimensions WhiteRectangleDetector");
65
+ }
66
+ }
67
+
68
+ /**
69
+ * <p>
70
+ * Detects a candidate barcode-like rectangular region within an image. It
71
+ * starts around the center of the image, increases the size of the candidate
72
+ * region until it finds a white rectangular region.
73
+ * </p>
74
+ *
75
+ * @return {@link vector<Ref<ResultPoint> >} describing the corners of the rectangular
76
+ * region. The first and last points are opposed on the diagonal, as
77
+ * are the second and third. The first point will be the topmost
78
+ * point and the last, the bottommost. The second point will be
79
+ * leftmost and the third, the rightmost
80
+ * @throws NotFoundException if no Data Matrix Code can be found
81
+ */
82
+ std::vector<Ref<ResultPoint> > WhiteRectangleDetector::detect() {
83
+ int left = leftInit_;
84
+ int right = rightInit_;
85
+ int up = upInit_;
86
+ int down = downInit_;
87
+
88
+ bool sizeExceeded = false;
89
+ bool aBlackPointFoundOnBorder = true;
90
+ bool atLeastOneBlackPointFoundOnBorder = false;
91
+
92
+ while (aBlackPointFoundOnBorder) {
93
+ aBlackPointFoundOnBorder = false;
94
+
95
+ // .....
96
+ // . |
97
+ // .....
98
+ bool rightBorderNotWhite = true;
99
+ while (rightBorderNotWhite && right < width_) {
100
+ rightBorderNotWhite = containsBlackPoint(up, down, right, false);
101
+ if (rightBorderNotWhite) {
102
+ right++;
103
+ aBlackPointFoundOnBorder = true;
104
+ }
105
+ }
106
+
107
+ if (right >= width_) {
108
+ sizeExceeded = true;
109
+ break;
110
+ }
111
+
112
+ // .....
113
+ // . .
114
+ // .___.
115
+ bool bottomBorderNotWhite = true;
116
+ while (bottomBorderNotWhite && down < height_) {
117
+ bottomBorderNotWhite = containsBlackPoint(left, right, down, true);
118
+ if (bottomBorderNotWhite) {
119
+ down++;
120
+ aBlackPointFoundOnBorder = true;
121
+ }
122
+ }
123
+
124
+ if (down >= height_) {
125
+ sizeExceeded = true;
126
+ break;
127
+ }
128
+
129
+ // .....
130
+ // | .
131
+ // .....
132
+ bool leftBorderNotWhite = true;
133
+ while (leftBorderNotWhite && left >= 0) {
134
+ leftBorderNotWhite = containsBlackPoint(up, down, left, false);
135
+ if (leftBorderNotWhite) {
136
+ left--;
137
+ aBlackPointFoundOnBorder = true;
138
+ }
139
+ }
140
+
141
+ if (left < 0) {
142
+ sizeExceeded = true;
143
+ break;
144
+ }
145
+
146
+ // .___.
147
+ // . .
148
+ // .....
149
+ bool topBorderNotWhite = true;
150
+ while (topBorderNotWhite && up >= 0) {
151
+ topBorderNotWhite = containsBlackPoint(left, right, up, true);
152
+ if (topBorderNotWhite) {
153
+ up--;
154
+ aBlackPointFoundOnBorder = true;
155
+ }
156
+ }
157
+
158
+ if (up < 0) {
159
+ sizeExceeded = true;
160
+ break;
161
+ }
162
+
163
+ if (aBlackPointFoundOnBorder) {
164
+ atLeastOneBlackPointFoundOnBorder = true;
165
+ }
166
+
167
+ }
168
+ if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) {
169
+
170
+ int maxSize = right - left;
171
+
172
+ Ref<ResultPoint> z(NULL);
173
+ //go up right
174
+ for (int i = 1; i < maxSize; i++) {
175
+ z = getBlackPointOnSegment(left, down - i, left + i, down);
176
+ if (z != NULL) {
177
+ break;
178
+ }
179
+ }
180
+
181
+ if (z == NULL) {
182
+ throw NotFoundException("z == NULL");
183
+ }
184
+
185
+ Ref<ResultPoint> t(NULL);
186
+ //go down right
187
+ for (int i = 1; i < maxSize; i++) {
188
+ t = getBlackPointOnSegment(left, up + i, left + i, up);
189
+ if (t != NULL) {
190
+ break;
191
+ }
192
+ }
193
+
194
+ if (t == NULL) {
195
+ throw NotFoundException("t == NULL");
196
+ }
197
+
198
+ Ref<ResultPoint> x(NULL);
199
+ //go down left
200
+ for (int i = 1; i < maxSize; i++) {
201
+ x = getBlackPointOnSegment(right, up + i, right - i, up);
202
+ if (x != NULL) {
203
+ break;
204
+ }
205
+ }
206
+
207
+ if (x == NULL) {
208
+ throw NotFoundException("x == NULL");
209
+ }
210
+
211
+ Ref<ResultPoint> y(NULL);
212
+ //go up left
213
+ for (int i = 1; i < maxSize; i++) {
214
+ y = getBlackPointOnSegment(right, down - i, right - i, down);
215
+ if (y != NULL) {
216
+ break;
217
+ }
218
+ }
219
+
220
+ if (y == NULL) {
221
+ throw NotFoundException("y == NULL");
222
+ }
223
+
224
+ return centerEdges(y, z, x, t);
225
+
226
+ } else {
227
+ throw NotFoundException("No black point found on border");
228
+ }
229
+ }
230
+
231
+ Ref<ResultPoint>
232
+ WhiteRectangleDetector::getBlackPointOnSegment(int aX_, int aY_, int bX_, int bY_) {
233
+ float aX = float(aX_), aY = float(aY_), bX = float(bX_), bY = float(bY_);
234
+ int dist = MathUtils::round(MathUtils::distance(aX, aY, bX, bY));
235
+ float xStep = (bX - aX) / dist;
236
+ float yStep = (bY - aY) / dist;
237
+
238
+ for (int i = 0; i < dist; i++) {
239
+ int x = MathUtils::round(aX + i * xStep);
240
+ int y = MathUtils::round(aY + i * yStep);
241
+ if (image_->get(x, y)) {
242
+ Ref<ResultPoint> point(new ResultPoint(float(x), float(y)));
243
+ return point;
244
+ }
245
+ }
246
+ Ref<ResultPoint> point(NULL);
247
+ return point;
248
+ }
249
+
250
+ /**
251
+ * recenters the points of a constant distance towards the center
252
+ *
253
+ * @param y bottom most point
254
+ * @param z left most point
255
+ * @param x right most point
256
+ * @param t top most point
257
+ * @return {@link vector<Ref<ResultPoint> >} describing the corners of the rectangular
258
+ * region. The first and last points are opposed on the diagonal, as
259
+ * are the second and third. The first point will be the topmost
260
+ * point and the last, the bottommost. The second point will be
261
+ * leftmost and the third, the rightmost
262
+ */
263
+ vector<Ref<ResultPoint> > WhiteRectangleDetector::centerEdges(Ref<ResultPoint> y, Ref<ResultPoint> z,
264
+ Ref<ResultPoint> x, Ref<ResultPoint> t) {
265
+
266
+ //
267
+ // t t
268
+ // z x
269
+ // x OR z
270
+ // y y
271
+ //
272
+
273
+ float yi = y->getX();
274
+ float yj = y->getY();
275
+ float zi = z->getX();
276
+ float zj = z->getY();
277
+ float xi = x->getX();
278
+ float xj = x->getY();
279
+ float ti = t->getX();
280
+ float tj = t->getY();
281
+
282
+ std::vector<Ref<ResultPoint> > corners(4);
283
+ if (yi < (float)width_/2.0f) {
284
+ Ref<ResultPoint> pointA(new ResultPoint(ti - CORR, tj + CORR));
285
+ Ref<ResultPoint> pointB(new ResultPoint(zi + CORR, zj + CORR));
286
+ Ref<ResultPoint> pointC(new ResultPoint(xi - CORR, xj - CORR));
287
+ Ref<ResultPoint> pointD(new ResultPoint(yi + CORR, yj - CORR));
288
+ corners[0].reset(pointA);
289
+ corners[1].reset(pointB);
290
+ corners[2].reset(pointC);
291
+ corners[3].reset(pointD);
292
+ } else {
293
+ Ref<ResultPoint> pointA(new ResultPoint(ti + CORR, tj + CORR));
294
+ Ref<ResultPoint> pointB(new ResultPoint(zi + CORR, zj - CORR));
295
+ Ref<ResultPoint> pointC(new ResultPoint(xi - CORR, xj + CORR));
296
+ Ref<ResultPoint> pointD(new ResultPoint(yi - CORR, yj - CORR));
297
+ corners[0].reset(pointA);
298
+ corners[1].reset(pointB);
299
+ corners[2].reset(pointC);
300
+ corners[3].reset(pointD);
301
+ }
302
+ return corners;
303
+ }
304
+
305
+ /**
306
+ * Determines whether a segment contains a black point
307
+ *
308
+ * @param a min value of the scanned coordinate
309
+ * @param b max value of the scanned coordinate
310
+ * @param fixed value of fixed coordinate
311
+ * @param horizontal set to true if scan must be horizontal, false if vertical
312
+ * @return true if a black point has been found, else false.
313
+ */
314
+ bool WhiteRectangleDetector::containsBlackPoint(int a, int b, int fixed, bool horizontal) {
315
+ if (horizontal) {
316
+ for (int x = a; x <= b; x++) {
317
+ if (image_->get(x, fixed)) {
318
+ return true;
319
+ }
320
+ }
321
+ } else {
322
+ for (int y = a; y <= b; y++) {
323
+ if (image_->get(fixed, y)) {
324
+ return true;
325
+ }
326
+ }
327
+ }
328
+
329
+ return false;
330
+ }