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,199 @@
1
+ /*
2
+ * Version.cpp
3
+ * zxing
4
+ *
5
+ * Created by Luiz Silva on 09/02/2010.
6
+ * Copyright 2010 ZXing authors All rights reserved.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ #include <zxing/datamatrix/Version.h>
22
+ #include <limits>
23
+ #include <iostream>
24
+
25
+ namespace zxing {
26
+ namespace datamatrix {
27
+ using namespace std;
28
+
29
+ ECB::ECB(int count, int dataCodewords) :
30
+ count_(count), dataCodewords_(dataCodewords) {
31
+ }
32
+
33
+ int ECB::getCount() {
34
+ return count_;
35
+ }
36
+
37
+ int ECB::getDataCodewords() {
38
+ return dataCodewords_;
39
+ }
40
+
41
+ ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks) :
42
+ ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks) {
43
+ }
44
+
45
+ ECBlocks::ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2) :
46
+ ecCodewords_(ecCodewords), ecBlocks_(1, ecBlocks1) {
47
+ ecBlocks_.push_back(ecBlocks2);
48
+ }
49
+
50
+ int ECBlocks::getECCodewords() {
51
+ return ecCodewords_;
52
+ }
53
+
54
+ std::vector<ECB*>& ECBlocks::getECBlocks() {
55
+ return ecBlocks_;
56
+ }
57
+
58
+ ECBlocks::~ECBlocks() {
59
+ for (size_t i = 0; i < ecBlocks_.size(); i++) {
60
+ delete ecBlocks_[i];
61
+ }
62
+ }
63
+
64
+ vector<Ref<Version> > Version::VERSIONS;
65
+ static int N_VERSIONS = Version::buildVersions();
66
+
67
+ Version::Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows,
68
+ int dataRegionSizeColumns, ECBlocks* ecBlocks) : versionNumber_(versionNumber),
69
+ symbolSizeRows_(symbolSizeRows), symbolSizeColumns_(symbolSizeColumns),
70
+ dataRegionSizeRows_(dataRegionSizeRows), dataRegionSizeColumns_(dataRegionSizeColumns),
71
+ ecBlocks_(ecBlocks), totalCodewords_(0) {
72
+ // Calculate the total number of codewords
73
+ int total = 0;
74
+ int ecCodewords = ecBlocks_->getECCodewords();
75
+ vector<ECB*> &ecbArray = ecBlocks_->getECBlocks();
76
+ for (unsigned int i = 0; i < ecbArray.size(); i++) {
77
+ ECB *ecBlock = ecbArray[i];
78
+ total += ecBlock->getCount() * (ecBlock->getDataCodewords() + ecCodewords);
79
+ }
80
+ totalCodewords_ = total;
81
+ }
82
+
83
+ Version::~Version() {
84
+ delete ecBlocks_;
85
+ }
86
+
87
+ int Version::getVersionNumber() {
88
+ return versionNumber_;
89
+ }
90
+
91
+ int Version::getSymbolSizeRows() {
92
+ return symbolSizeRows_;
93
+ }
94
+
95
+ int Version::getSymbolSizeColumns() {
96
+ return symbolSizeColumns_;
97
+ }
98
+
99
+ int Version::getDataRegionSizeRows() {
100
+ return dataRegionSizeRows_;
101
+ }
102
+
103
+ int Version::getDataRegionSizeColumns() {
104
+ return dataRegionSizeColumns_;
105
+ }
106
+
107
+ int Version::getTotalCodewords() {
108
+ return totalCodewords_;
109
+ }
110
+
111
+ ECBlocks* Version::getECBlocks() {
112
+ return ecBlocks_;
113
+ }
114
+
115
+ Ref<Version> Version::getVersionForDimensions(int numRows, int numColumns) {
116
+ if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) {
117
+ throw ReaderException("Number of rows and columns must be even");
118
+ }
119
+
120
+ // TODO(bbrown): This is doing a linear search through the array of versions.
121
+ // If we interleave the rectangular versions with the square versions we could
122
+ // do a binary search.
123
+ for (int i = 0; i < N_VERSIONS; ++i){
124
+ Ref<Version> version(VERSIONS[i]);
125
+ if (version->getSymbolSizeRows() == numRows && version->getSymbolSizeColumns() == numColumns) {
126
+ return version;
127
+ }
128
+ }
129
+ throw ReaderException("Error version not found");
130
+ }
131
+
132
+ /**
133
+ * See ISO 16022:2006 5.5.1 Table 7
134
+ */
135
+ int Version::buildVersions() {
136
+ VERSIONS.push_back(Ref<Version>(new Version(1, 10, 10, 8, 8,
137
+ new ECBlocks(5, new ECB(1, 3)))));
138
+ VERSIONS.push_back(Ref<Version>(new Version(2, 12, 12, 10, 10,
139
+ new ECBlocks(7, new ECB(1, 5)))));
140
+ VERSIONS.push_back(Ref<Version>(new Version(3, 14, 14, 12, 12,
141
+ new ECBlocks(10, new ECB(1, 8)))));
142
+ VERSIONS.push_back(Ref<Version>(new Version(4, 16, 16, 14, 14,
143
+ new ECBlocks(12, new ECB(1, 12)))));
144
+ VERSIONS.push_back(Ref<Version>(new Version(5, 18, 18, 16, 16,
145
+ new ECBlocks(14, new ECB(1, 18)))));
146
+ VERSIONS.push_back(Ref<Version>(new Version(6, 20, 20, 18, 18,
147
+ new ECBlocks(18, new ECB(1, 22)))));
148
+ VERSIONS.push_back(Ref<Version>(new Version(7, 22, 22, 20, 20,
149
+ new ECBlocks(20, new ECB(1, 30)))));
150
+ VERSIONS.push_back(Ref<Version>(new Version(8, 24, 24, 22, 22,
151
+ new ECBlocks(24, new ECB(1, 36)))));
152
+ VERSIONS.push_back(Ref<Version>(new Version(9, 26, 26, 24, 24,
153
+ new ECBlocks(28, new ECB(1, 44)))));
154
+ VERSIONS.push_back(Ref<Version>(new Version(10, 32, 32, 14, 14,
155
+ new ECBlocks(36, new ECB(1, 62)))));
156
+ VERSIONS.push_back(Ref<Version>(new Version(11, 36, 36, 16, 16,
157
+ new ECBlocks(42, new ECB(1, 86)))));
158
+ VERSIONS.push_back(Ref<Version>(new Version(12, 40, 40, 18, 18,
159
+ new ECBlocks(48, new ECB(1, 114)))));
160
+ VERSIONS.push_back(Ref<Version>(new Version(13, 44, 44, 20, 20,
161
+ new ECBlocks(56, new ECB(1, 144)))));
162
+ VERSIONS.push_back(Ref<Version>(new Version(14, 48, 48, 22, 22,
163
+ new ECBlocks(68, new ECB(1, 174)))));
164
+ VERSIONS.push_back(Ref<Version>(new Version(15, 52, 52, 24, 24,
165
+ new ECBlocks(42, new ECB(2, 102)))));
166
+ VERSIONS.push_back(Ref<Version>(new Version(16, 64, 64, 14, 14,
167
+ new ECBlocks(56, new ECB(2, 140)))));
168
+ VERSIONS.push_back(Ref<Version>(new Version(17, 72, 72, 16, 16,
169
+ new ECBlocks(36, new ECB(4, 92)))));
170
+ VERSIONS.push_back(Ref<Version>(new Version(18, 80, 80, 18, 18,
171
+ new ECBlocks(48, new ECB(4, 114)))));
172
+ VERSIONS.push_back(Ref<Version>(new Version(19, 88, 88, 20, 20,
173
+ new ECBlocks(56, new ECB(4, 144)))));
174
+ VERSIONS.push_back(Ref<Version>(new Version(20, 96, 96, 22, 22,
175
+ new ECBlocks(68, new ECB(4, 174)))));
176
+ VERSIONS.push_back(Ref<Version>(new Version(21, 104, 104, 24, 24,
177
+ new ECBlocks(56, new ECB(6, 136)))));
178
+ VERSIONS.push_back(Ref<Version>(new Version(22, 120, 120, 18, 18,
179
+ new ECBlocks(68, new ECB(6, 175)))));
180
+ VERSIONS.push_back(Ref<Version>(new Version(23, 132, 132, 20, 20,
181
+ new ECBlocks(62, new ECB(8, 163)))));
182
+ VERSIONS.push_back(Ref<Version>(new Version(24, 144, 144, 22, 22,
183
+ new ECBlocks(62, new ECB(8, 156), new ECB(2, 155)))));
184
+ VERSIONS.push_back(Ref<Version>(new Version(25, 8, 18, 6, 16,
185
+ new ECBlocks(7, new ECB(1, 5)))));
186
+ VERSIONS.push_back(Ref<Version>(new Version(26, 8, 32, 6, 14,
187
+ new ECBlocks(11, new ECB(1, 10)))));
188
+ VERSIONS.push_back(Ref<Version>(new Version(27, 12, 26, 10, 24,
189
+ new ECBlocks(14, new ECB(1, 16)))));
190
+ VERSIONS.push_back(Ref<Version>(new Version(28, 12, 36, 10, 16,
191
+ new ECBlocks(18, new ECB(1, 22)))));
192
+ VERSIONS.push_back(Ref<Version>(new Version(29, 16, 36, 14, 16,
193
+ new ECBlocks(24, new ECB(1, 32)))));
194
+ VERSIONS.push_back(Ref<Version>(new Version(30, 16, 48, 14, 22,
195
+ new ECBlocks(28, new ECB(1, 49)))));
196
+ return VERSIONS.size();
197
+ }
198
+ }
199
+ }
@@ -0,0 +1,87 @@
1
+ #ifndef __VERSION_H__
2
+ #define __VERSION_H__
3
+
4
+ /*
5
+ * Version.h
6
+ * zxing
7
+ *
8
+ * Created by Luiz Silva on 09/02/2010.
9
+ * Copyright 2010 ZXing authors All rights reserved.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License.
22
+ */
23
+
24
+ #include <zxing/ReaderException.h>
25
+ #include <zxing/common/BitMatrix.h>
26
+ #include <zxing/common/Counted.h>
27
+ #include <vector>
28
+
29
+ namespace zxing {
30
+ namespace datamatrix {
31
+
32
+ class ECB {
33
+ private:
34
+ int count_;
35
+ int dataCodewords_;
36
+ public:
37
+ ECB(int count, int dataCodewords);
38
+ int getCount();
39
+ int getDataCodewords();
40
+ };
41
+
42
+ class ECBlocks {
43
+ private:
44
+ int ecCodewords_;
45
+ std::vector<ECB*> ecBlocks_;
46
+ public:
47
+ ECBlocks(int ecCodewords, ECB *ecBlocks);
48
+ ECBlocks(int ecCodewords, ECB *ecBlocks1, ECB *ecBlocks2);
49
+ int getECCodewords();
50
+ std::vector<ECB*>& getECBlocks();
51
+ ~ECBlocks();
52
+ };
53
+
54
+ class Version : public Counted {
55
+ private:
56
+ int versionNumber_;
57
+ int symbolSizeRows_;
58
+ int symbolSizeColumns_;
59
+ int dataRegionSizeRows_;
60
+ int dataRegionSizeColumns_;
61
+ ECBlocks* ecBlocks_;
62
+ int totalCodewords_;
63
+ Version(int versionNumber, int symbolSizeRows, int symbolSizeColumns, int dataRegionSizeRows,
64
+ int dataRegionSizeColumns, ECBlocks *ecBlocks);
65
+
66
+ public:
67
+ static std::vector<Ref<Version> > VERSIONS;
68
+
69
+ ~Version();
70
+ int getVersionNumber();
71
+ int getSymbolSizeRows();
72
+ int getSymbolSizeColumns();
73
+ int getDataRegionSizeRows();
74
+ int getDataRegionSizeColumns();
75
+ int getTotalCodewords();
76
+ ECBlocks* getECBlocks();
77
+ static int buildVersions();
78
+ Ref<Version> getVersionForDimensions(int numRows, int numColumns);
79
+
80
+ private:
81
+ Version(const Version&);
82
+ Version & operator=(const Version&);
83
+ };
84
+ }
85
+ }
86
+
87
+ #endif // __VERSION_H__
@@ -0,0 +1,361 @@
1
+ /*
2
+ * BitMatrixParser.cpp
3
+ * zxing
4
+ *
5
+ * Created by Luiz Silva on 09/02/2010.
6
+ * Copyright 2010 ZXing authors All rights reserved.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ #include <zxing/datamatrix/decoder/BitMatrixParser.h>
22
+ #include <zxing/common/IllegalArgumentException.h>
23
+
24
+ #include <iostream>
25
+
26
+ namespace zxing {
27
+ namespace datamatrix {
28
+
29
+ int BitMatrixParser::copyBit(size_t x, size_t y, int versionBits) {
30
+ return bitMatrix_->get(x, y) ? (versionBits << 1) | 0x1 : versionBits << 1;
31
+ }
32
+
33
+ BitMatrixParser::BitMatrixParser(Ref<BitMatrix> bitMatrix) : bitMatrix_(NULL),
34
+ parsedVersion_(NULL),
35
+ readBitMatrix_(NULL) {
36
+ size_t dimension = bitMatrix->getHeight();
37
+ if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0)
38
+ throw ReaderException("Dimension must be even, > 8 < 144");
39
+
40
+ parsedVersion_ = readVersion(bitMatrix);
41
+ bitMatrix_ = extractDataRegion(bitMatrix);
42
+ readBitMatrix_ = new BitMatrix(bitMatrix_->getWidth(), bitMatrix_->getHeight());
43
+ }
44
+
45
+ Ref<Version> BitMatrixParser::readVersion(Ref<BitMatrix> bitMatrix) {
46
+ if (parsedVersion_ != 0) {
47
+ return parsedVersion_;
48
+ }
49
+
50
+ int numRows = bitMatrix->getHeight();
51
+ int numColumns = bitMatrix->getWidth();
52
+
53
+ Ref<Version> version = parsedVersion_->getVersionForDimensions(numRows, numColumns);
54
+ if (version != 0) {
55
+ return version;
56
+ }
57
+ throw ReaderException("Couldn't decode version");
58
+ }
59
+
60
+ ArrayRef<char> BitMatrixParser::readCodewords() {
61
+ ArrayRef<char> result(parsedVersion_->getTotalCodewords());
62
+ int resultOffset = 0;
63
+ int row = 4;
64
+ int column = 0;
65
+
66
+ int numRows = bitMatrix_->getHeight();
67
+ int numColumns = bitMatrix_->getWidth();
68
+
69
+ bool corner1Read = false;
70
+ bool corner2Read = false;
71
+ bool corner3Read = false;
72
+ bool corner4Read = false;
73
+
74
+ // Read all of the codewords
75
+ do {
76
+ // Check the four corner cases
77
+ if ((row == numRows) && (column == 0) && !corner1Read) {
78
+ result[resultOffset++] = (char) readCorner1(numRows, numColumns);
79
+ row -= 2;
80
+ column +=2;
81
+ corner1Read = true;
82
+ } else if ((row == numRows-2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) {
83
+ result[resultOffset++] = (char) readCorner2(numRows, numColumns);
84
+ row -= 2;
85
+ column +=2;
86
+ corner2Read = true;
87
+ } else if ((row == numRows+4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) {
88
+ result[resultOffset++] = (char) readCorner3(numRows, numColumns);
89
+ row -= 2;
90
+ column +=2;
91
+ corner3Read = true;
92
+ } else if ((row == numRows-2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) {
93
+ result[resultOffset++] = (char) readCorner4(numRows, numColumns);
94
+ row -= 2;
95
+ column +=2;
96
+ corner4Read = true;
97
+ } else {
98
+ // Sweep upward diagonally to the right
99
+ do {
100
+ if ((row < numRows) && (column >= 0) && !readBitMatrix_->get(column, row)) {
101
+ result[resultOffset++] = (char) readUtah(row, column, numRows, numColumns);
102
+ }
103
+ row -= 2;
104
+ column +=2;
105
+ } while ((row >= 0) && (column < numColumns));
106
+ row += 1;
107
+ column +=3;
108
+
109
+ // Sweep downward diagonally to the left
110
+ do {
111
+ if ((row >= 0) && (column < numColumns) && !readBitMatrix_->get(column, row)) {
112
+ result[resultOffset++] = (char) readUtah(row, column, numRows, numColumns);
113
+ }
114
+ row += 2;
115
+ column -=2;
116
+ } while ((row < numRows) && (column >= 0));
117
+ row += 3;
118
+ column +=1;
119
+ }
120
+ } while ((row < numRows) || (column < numColumns));
121
+
122
+ if (resultOffset != parsedVersion_->getTotalCodewords()) {
123
+ throw ReaderException("Did not read all codewords");
124
+ }
125
+ return result;
126
+ }
127
+
128
+ bool BitMatrixParser::readModule(int row, int column, int numRows, int numColumns) {
129
+ // Adjust the row and column indices based on boundary wrapping
130
+ if (row < 0) {
131
+ row += numRows;
132
+ column += 4 - ((numRows + 4) & 0x07);
133
+ }
134
+ if (column < 0) {
135
+ column += numColumns;
136
+ row += 4 - ((numColumns + 4) & 0x07);
137
+ }
138
+ readBitMatrix_->set(column, row);
139
+ return bitMatrix_->get(column, row);
140
+ }
141
+
142
+ int BitMatrixParser::readUtah(int row, int column, int numRows, int numColumns) {
143
+ int currentByte = 0;
144
+ if (readModule(row - 2, column - 2, numRows, numColumns)) {
145
+ currentByte |= 1;
146
+ }
147
+ currentByte <<= 1;
148
+ if (readModule(row - 2, column - 1, numRows, numColumns)) {
149
+ currentByte |= 1;
150
+ }
151
+ currentByte <<= 1;
152
+ if (readModule(row - 1, column - 2, numRows, numColumns)) {
153
+ currentByte |= 1;
154
+ }
155
+ currentByte <<= 1;
156
+ if (readModule(row - 1, column - 1, numRows, numColumns)) {
157
+ currentByte |= 1;
158
+ }
159
+ currentByte <<= 1;
160
+ if (readModule(row - 1, column, numRows, numColumns)) {
161
+ currentByte |= 1;
162
+ }
163
+ currentByte <<= 1;
164
+ if (readModule(row, column - 2, numRows, numColumns)) {
165
+ currentByte |= 1;
166
+ }
167
+ currentByte <<= 1;
168
+ if (readModule(row, column - 1, numRows, numColumns)) {
169
+ currentByte |= 1;
170
+ }
171
+ currentByte <<= 1;
172
+ if (readModule(row, column, numRows, numColumns)) {
173
+ currentByte |= 1;
174
+ }
175
+ return currentByte;
176
+ }
177
+
178
+ int BitMatrixParser::readCorner1(int numRows, int numColumns) {
179
+ int currentByte = 0;
180
+ if (readModule(numRows - 1, 0, numRows, numColumns)) {
181
+ currentByte |= 1;
182
+ }
183
+ currentByte <<= 1;
184
+ if (readModule(numRows - 1, 1, numRows, numColumns)) {
185
+ currentByte |= 1;
186
+ }
187
+ currentByte <<= 1;
188
+ if (readModule(numRows - 1, 2, numRows, numColumns)) {
189
+ currentByte |= 1;
190
+ }
191
+ currentByte <<= 1;
192
+ if (readModule(0, numColumns - 2, numRows, numColumns)) {
193
+ currentByte |= 1;
194
+ }
195
+ currentByte <<= 1;
196
+ if (readModule(0, numColumns - 1, numRows, numColumns)) {
197
+ currentByte |= 1;
198
+ }
199
+ currentByte <<= 1;
200
+ if (readModule(1, numColumns - 1, numRows, numColumns)) {
201
+ currentByte |= 1;
202
+ }
203
+ currentByte <<= 1;
204
+ if (readModule(2, numColumns - 1, numRows, numColumns)) {
205
+ currentByte |= 1;
206
+ }
207
+ currentByte <<= 1;
208
+ if (readModule(3, numColumns - 1, numRows, numColumns)) {
209
+ currentByte |= 1;
210
+ }
211
+ return currentByte;
212
+ }
213
+
214
+ int BitMatrixParser::readCorner2(int numRows, int numColumns) {
215
+ int currentByte = 0;
216
+ if (readModule(numRows - 3, 0, numRows, numColumns)) {
217
+ currentByte |= 1;
218
+ }
219
+ currentByte <<= 1;
220
+ if (readModule(numRows - 2, 0, numRows, numColumns)) {
221
+ currentByte |= 1;
222
+ }
223
+ currentByte <<= 1;
224
+ if (readModule(numRows - 1, 0, numRows, numColumns)) {
225
+ currentByte |= 1;
226
+ }
227
+ currentByte <<= 1;
228
+ if (readModule(0, numColumns - 4, numRows, numColumns)) {
229
+ currentByte |= 1;
230
+ }
231
+ currentByte <<= 1;
232
+ if (readModule(0, numColumns - 3, numRows, numColumns)) {
233
+ currentByte |= 1;
234
+ }
235
+ currentByte <<= 1;
236
+ if (readModule(0, numColumns - 2, numRows, numColumns)) {
237
+ currentByte |= 1;
238
+ }
239
+ currentByte <<= 1;
240
+ if (readModule(0, numColumns - 1, numRows, numColumns)) {
241
+ currentByte |= 1;
242
+ }
243
+ currentByte <<= 1;
244
+ if (readModule(1, numColumns - 1, numRows, numColumns)) {
245
+ currentByte |= 1;
246
+ }
247
+ return currentByte;
248
+ }
249
+
250
+ int BitMatrixParser::readCorner3(int numRows, int numColumns) {
251
+ int currentByte = 0;
252
+ if (readModule(numRows - 1, 0, numRows, numColumns)) {
253
+ currentByte |= 1;
254
+ }
255
+ currentByte <<= 1;
256
+ if (readModule(numRows - 1, numColumns - 1, numRows, numColumns)) {
257
+ currentByte |= 1;
258
+ }
259
+ currentByte <<= 1;
260
+ if (readModule(0, numColumns - 3, numRows, numColumns)) {
261
+ currentByte |= 1;
262
+ }
263
+ currentByte <<= 1;
264
+ if (readModule(0, numColumns - 2, numRows, numColumns)) {
265
+ currentByte |= 1;
266
+ }
267
+ currentByte <<= 1;
268
+ if (readModule(0, numColumns - 1, numRows, numColumns)) {
269
+ currentByte |= 1;
270
+ }
271
+ currentByte <<= 1;
272
+ if (readModule(1, numColumns - 3, numRows, numColumns)) {
273
+ currentByte |= 1;
274
+ }
275
+ currentByte <<= 1;
276
+ if (readModule(1, numColumns - 2, numRows, numColumns)) {
277
+ currentByte |= 1;
278
+ }
279
+ currentByte <<= 1;
280
+ if (readModule(1, numColumns - 1, numRows, numColumns)) {
281
+ currentByte |= 1;
282
+ }
283
+ return currentByte;
284
+ }
285
+
286
+ int BitMatrixParser::readCorner4(int numRows, int numColumns) {
287
+ int currentByte = 0;
288
+ if (readModule(numRows - 3, 0, numRows, numColumns)) {
289
+ currentByte |= 1;
290
+ }
291
+ currentByte <<= 1;
292
+ if (readModule(numRows - 2, 0, numRows, numColumns)) {
293
+ currentByte |= 1;
294
+ }
295
+ currentByte <<= 1;
296
+ if (readModule(numRows - 1, 0, numRows, numColumns)) {
297
+ currentByte |= 1;
298
+ }
299
+ currentByte <<= 1;
300
+ if (readModule(0, numColumns - 2, numRows, numColumns)) {
301
+ currentByte |= 1;
302
+ }
303
+ currentByte <<= 1;
304
+ if (readModule(0, numColumns - 1, numRows, numColumns)) {
305
+ currentByte |= 1;
306
+ }
307
+ currentByte <<= 1;
308
+ if (readModule(1, numColumns - 1, numRows, numColumns)) {
309
+ currentByte |= 1;
310
+ }
311
+ currentByte <<= 1;
312
+ if (readModule(2, numColumns - 1, numRows, numColumns)) {
313
+ currentByte |= 1;
314
+ }
315
+ currentByte <<= 1;
316
+ if (readModule(3, numColumns - 1, numRows, numColumns)) {
317
+ currentByte |= 1;
318
+ }
319
+ return currentByte;
320
+ }
321
+
322
+ Ref<BitMatrix> BitMatrixParser::extractDataRegion(Ref<BitMatrix> bitMatrix) {
323
+ int symbolSizeRows = parsedVersion_->getSymbolSizeRows();
324
+ int symbolSizeColumns = parsedVersion_->getSymbolSizeColumns();
325
+
326
+ if ((int)bitMatrix->getHeight() != symbolSizeRows) {
327
+ throw IllegalArgumentException("Dimension of bitMatrix must match the version size");
328
+ }
329
+
330
+ int dataRegionSizeRows = parsedVersion_->getDataRegionSizeRows();
331
+ int dataRegionSizeColumns = parsedVersion_->getDataRegionSizeColumns();
332
+
333
+ int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows;
334
+ int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns;
335
+
336
+ int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows;
337
+ int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns;
338
+
339
+ Ref<BitMatrix> bitMatrixWithoutAlignment(new BitMatrix(sizeDataRegionColumn, sizeDataRegionRow));
340
+ for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) {
341
+ int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows;
342
+ for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) {
343
+ int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns;
344
+ for (int i = 0; i < dataRegionSizeRows; ++i) {
345
+ int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i;
346
+ int writeRowOffset = dataRegionRowOffset + i;
347
+ for (int j = 0; j < dataRegionSizeColumns; ++j) {
348
+ int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j;
349
+ if (bitMatrix->get(readColumnOffset, readRowOffset)) {
350
+ int writeColumnOffset = dataRegionColumnOffset + j;
351
+ bitMatrixWithoutAlignment->set(writeColumnOffset, writeRowOffset);
352
+ }
353
+ }
354
+ }
355
+ }
356
+ }
357
+ return bitMatrixWithoutAlignment;
358
+ }
359
+
360
+ }
361
+ }