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,58 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __CODE_93_READER_H__
3
+ #define __CODE_93_READER_H__
4
+ /*
5
+ * Code93Reader.h
6
+ * ZXing
7
+ *
8
+ * Copyright 2010 ZXing authors All rights reserved.
9
+ *
10
+ * Licensed under the Apache License, Version 2.0 (the "License");
11
+ * you may not use this file except in compliance with the License.
12
+ * You may obtain a copy of the License at
13
+ *
14
+ * http://www.apache.org/licenses/LICENSE-2.0
15
+ *
16
+ * Unless required by applicable law or agreed to in writing, software
17
+ * distributed under the License is distributed on an "AS IS" BASIS,
18
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ * See the License for the specific language governing permissions and
20
+ * limitations under the License.
21
+ */
22
+
23
+ #include <zxing/oned/OneDReader.h>
24
+ #include <zxing/common/BitArray.h>
25
+ #include <zxing/Result.h>
26
+
27
+ namespace zxing {
28
+ namespace oned {
29
+
30
+ /**
31
+ * <p>Decodes Code 93 barcodes. This does not support "Full ASCII Code 93" yet.</p>
32
+ * Ported form Java (author Sean Owen)
33
+ * @author Lukasz Warchol
34
+ */
35
+ class Code93Reader : public OneDReader {
36
+ public:
37
+ Code93Reader();
38
+ Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
39
+
40
+ private:
41
+ std::string decodeRowResult;
42
+ std::vector<int> counters;
43
+
44
+ Range findAsteriskPattern(Ref<BitArray> row);
45
+
46
+ static int toPattern(std::vector<int>& counters);
47
+ static char patternToChar(int pattern);
48
+ static Ref<String> decodeExtended(std::string const& encoded);
49
+ static void checkChecksums(std::string const& result);
50
+ static void checkOneChecksum(std::string const& result,
51
+ int checkPosition,
52
+ int weightMax);
53
+ };
54
+
55
+ }
56
+ }
57
+
58
+ #endif
@@ -0,0 +1,85 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2010 ZXing authors All rights reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "EAN13Reader.h"
19
+ #include <zxing/NotFoundException.h>
20
+
21
+ using std::vector;
22
+ using zxing::Ref;
23
+ using zxing::BitArray;
24
+ using zxing::oned::EAN13Reader;
25
+
26
+ namespace {
27
+ const int FIRST_DIGIT_ENCODINGS[10] = {
28
+ 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A
29
+ };
30
+ }
31
+
32
+ EAN13Reader::EAN13Reader() : decodeMiddleCounters(4, 0) { }
33
+
34
+ int EAN13Reader::decodeMiddle(Ref<BitArray> row,
35
+ Range const& startRange,
36
+ std::string& resultString) {
37
+ vector<int>& counters (decodeMiddleCounters);
38
+ counters.clear();
39
+ counters.resize(4);
40
+ int end = row->getSize();
41
+ int rowOffset = startRange[1];
42
+
43
+ int lgPatternFound = 0;
44
+
45
+ for (int x = 0; x < 6 && rowOffset < end; x++) {
46
+ int bestMatch = decodeDigit(row, counters, rowOffset, L_AND_G_PATTERNS);
47
+ resultString.append(1, (char) ('0' + bestMatch % 10));
48
+ for (int i = 0, end = counters.size(); i <end; i++) {
49
+ rowOffset += counters[i];
50
+ }
51
+ if (bestMatch >= 10) {
52
+ lgPatternFound |= 1 << (5 - x);
53
+ }
54
+ }
55
+
56
+ determineFirstDigit(resultString, lgPatternFound);
57
+
58
+ Range middleRange = findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN) ;
59
+ rowOffset = middleRange[1];
60
+
61
+ for (int x = 0; x < 6 && rowOffset < end; x++) {
62
+ int bestMatch =
63
+ decodeDigit(row, counters, rowOffset, L_PATTERNS);
64
+ resultString.append(1, (char) ('0' + bestMatch));
65
+ for (int i = 0, end = counters.size(); i < end; i++) {
66
+ rowOffset += counters[i];
67
+ }
68
+ }
69
+ return rowOffset;
70
+ }
71
+
72
+ void EAN13Reader::determineFirstDigit(std::string& resultString, int lgPatternFound) {
73
+ // std::cerr << "K " << resultString << " " << lgPatternFound << " " <<FIRST_DIGIT_ENCODINGS << std::endl;
74
+ for (int d = 0; d < 10; d++) {
75
+ if (lgPatternFound == FIRST_DIGIT_ENCODINGS[d]) {
76
+ resultString.insert(0, 1, (char) ('0' + d));
77
+ return;
78
+ }
79
+ }
80
+ throw NotFoundException();
81
+ }
82
+
83
+ zxing::BarcodeFormat EAN13Reader::getBarcodeFormat(){
84
+ return BarcodeFormat::EAN_13;
85
+ }
@@ -0,0 +1,49 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __EAN_13_READER_H__
3
+ #define __EAN_13_READER_H__
4
+
5
+ /*
6
+ * EAN13Reader.h
7
+ * ZXing
8
+ *
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/oned/UPCEANReader.h>
25
+ #include <zxing/Result.h>
26
+
27
+ namespace zxing {
28
+ namespace oned {
29
+
30
+ class EAN13Reader : public UPCEANReader {
31
+ private:
32
+ std::vector<int> decodeMiddleCounters;
33
+ static void determineFirstDigit(std::string& resultString,
34
+ int lgPatternFound);
35
+
36
+ public:
37
+ EAN13Reader();
38
+
39
+ int decodeMiddle(Ref<BitArray> row,
40
+ Range const& startRange,
41
+ std::string& resultString);
42
+
43
+ BarcodeFormat getBarcodeFormat();
44
+ };
45
+
46
+ }
47
+ }
48
+
49
+ #endif
@@ -0,0 +1,65 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2010 ZXing authors All rights reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "EAN8Reader.h"
19
+ #include <zxing/ReaderException.h>
20
+
21
+ using std::vector;
22
+ using zxing::oned::EAN8Reader;
23
+
24
+ // VC++
25
+ using zxing::Ref;
26
+ using zxing::BitArray;
27
+
28
+ EAN8Reader::EAN8Reader() : decodeMiddleCounters(4, 0) {}
29
+
30
+ int EAN8Reader::decodeMiddle(Ref<BitArray> row,
31
+ Range const& startRange,
32
+ std::string& result){
33
+ vector<int>& counters (decodeMiddleCounters);
34
+ counters[0] = 0;
35
+ counters[1] = 0;
36
+ counters[2] = 0;
37
+ counters[3] = 0;
38
+
39
+ int end = row->getSize();
40
+ int rowOffset = startRange[1];
41
+
42
+ for (int x = 0; x < 4 && rowOffset < end; x++) {
43
+ int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS);
44
+ result.append(1, (char) ('0' + bestMatch));
45
+ for (int i = 0, end = counters.size(); i < end; i++) {
46
+ rowOffset += counters[i];
47
+ }
48
+ }
49
+
50
+ Range middleRange =
51
+ findGuardPattern(row, rowOffset, true, MIDDLE_PATTERN);
52
+ rowOffset = middleRange[1];
53
+ for (int x = 0; x < 4 && rowOffset < end; x++) {
54
+ int bestMatch = decodeDigit(row, counters, rowOffset, L_PATTERNS);
55
+ result.append(1, (char) ('0' + bestMatch));
56
+ for (int i = 0, end = counters.size(); i < end; i++) {
57
+ rowOffset += counters[i];
58
+ }
59
+ }
60
+ return rowOffset;
61
+ }
62
+
63
+ zxing::BarcodeFormat EAN8Reader::getBarcodeFormat(){
64
+ return BarcodeFormat::EAN_8;
65
+ }
@@ -0,0 +1,47 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __EAN_8_READER_H__
3
+ #define __EAN_8_READER_H__
4
+
5
+ /*
6
+ * EAN8Reader.h
7
+ * ZXing
8
+ *
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/oned/UPCEANReader.h>
25
+ #include <zxing/Result.h>
26
+
27
+ namespace zxing {
28
+ namespace oned {
29
+
30
+ class EAN8Reader : public UPCEANReader {
31
+ private:
32
+ std::vector<int> decodeMiddleCounters;
33
+
34
+ public:
35
+ EAN8Reader();
36
+
37
+ int decodeMiddle(Ref<BitArray> row,
38
+ Range const& startRange,
39
+ std::string& resultString);
40
+
41
+ BarcodeFormat getBarcodeFormat();
42
+ };
43
+
44
+ }
45
+ }
46
+
47
+ #endif
@@ -0,0 +1,337 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2010 ZXing authors All rights reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include <zxing/ZXing.h>
19
+ #include <zxing/oned/ITFReader.h>
20
+ #include <zxing/oned/OneDResultPoint.h>
21
+ #include <zxing/common/Array.h>
22
+ #include <zxing/ReaderException.h>
23
+ #include <zxing/FormatException.h>
24
+ #include <zxing/NotFoundException.h>
25
+ #include <math.h>
26
+
27
+ using std::vector;
28
+ using zxing::Ref;
29
+ using zxing::ArrayRef;
30
+ using zxing::Array;
31
+ using zxing::Result;
32
+ using zxing::FormatException;
33
+ using zxing::NotFoundException;
34
+ using zxing::oned::ITFReader;
35
+
36
+ // VC++
37
+ using zxing::BitArray;
38
+
39
+ #define VECTOR_INIT(v) v, v + sizeof(v)/sizeof(v[0])
40
+
41
+ namespace {
42
+
43
+ const int W = 3; // Pixel width of a wide line
44
+ const int N = 1; // Pixed width of a narrow line
45
+
46
+ const int DEFAULT_ALLOWED_LENGTHS_[] =
47
+ { 48, 44, 24, 20, 18, 16, 14, 12, 10, 8, 6 };
48
+ const ArrayRef<int> DEFAULT_ALLOWED_LENGTHS (new Array<int>(VECTOR_INIT(DEFAULT_ALLOWED_LENGTHS_)));
49
+
50
+ /**
51
+ * Start/end guard pattern.
52
+ *
53
+ * Note: The end pattern is reversed because the row is reversed before
54
+ * searching for the END_PATTERN
55
+ */
56
+ const int START_PATTERN_[] = {N, N, N, N};
57
+ const vector<int> START_PATTERN (VECTOR_INIT(START_PATTERN_));
58
+
59
+ const int END_PATTERN_REVERSED_[] = {N, N, W};
60
+ const vector<int> END_PATTERN_REVERSED (VECTOR_INIT(END_PATTERN_REVERSED_));
61
+
62
+ /**
63
+ * Patterns of Wide / Narrow lines to indicate each digit
64
+ */
65
+ const int PATTERNS[][5] = {
66
+ {N, N, W, W, N}, // 0
67
+ {W, N, N, N, W}, // 1
68
+ {N, W, N, N, W}, // 2
69
+ {W, W, N, N, N}, // 3
70
+ {N, N, W, N, W}, // 4
71
+ {W, N, W, N, N}, // 5
72
+ {N, W, W, N, N}, // 6
73
+ {N, N, N, W, W}, // 7
74
+ {W, N, N, W, N}, // 8
75
+ {N, W, N, W, N} // 9
76
+ };
77
+
78
+ }
79
+
80
+ ITFReader::ITFReader() : narrowLineWidth(-1) {
81
+ }
82
+
83
+
84
+ Ref<Result> ITFReader::decodeRow(int rowNumber, Ref<BitArray> row) {
85
+ // Find out where the Middle section (payload) starts & ends
86
+
87
+ Range startRange = decodeStart(row);
88
+ Range endRange = decodeEnd(row);
89
+
90
+ std::string result;
91
+ decodeMiddle(row, startRange[1], endRange[0], result);
92
+ Ref<String> resultString(new String(result));
93
+
94
+ ArrayRef<int> allowedLengths;
95
+ // Java hints stuff missing
96
+ if (!allowedLengths) {
97
+ allowedLengths = DEFAULT_ALLOWED_LENGTHS;
98
+ }
99
+
100
+ // To avoid false positives with 2D barcodes (and other patterns), make
101
+ // an assumption that the decoded string must be 6, 10 or 14 digits.
102
+ int length = resultString->size();
103
+ bool lengthOK = false;
104
+ for (int i = 0, e = allowedLengths->size(); i < e; i++) {
105
+ if (length == allowedLengths[i]) {
106
+ lengthOK = true;
107
+ break;
108
+ }
109
+ }
110
+
111
+ if (!lengthOK) {
112
+ throw FormatException();
113
+ }
114
+
115
+ ArrayRef< Ref<ResultPoint> > resultPoints(2);
116
+ resultPoints[0] =
117
+ Ref<OneDResultPoint>(new OneDResultPoint(float(startRange[1]), float(rowNumber)));
118
+ resultPoints[1] =
119
+ Ref<OneDResultPoint>(new OneDResultPoint(float(endRange[0]), float(rowNumber)));
120
+ return Ref<Result>(new Result(resultString, ArrayRef<char>(), resultPoints, BarcodeFormat::ITF));
121
+ }
122
+
123
+ /**
124
+ * @param row row of black/white values to search
125
+ * @param payloadStart offset of start pattern
126
+ * @param resultString {@link StringBuffer} to append decoded chars to
127
+ * @throws ReaderException if decoding could not complete successfully
128
+ */
129
+ void ITFReader::decodeMiddle(Ref<BitArray> row,
130
+ int payloadStart,
131
+ int payloadEnd,
132
+ std::string& resultString) {
133
+ // Digits are interleaved in pairs - 5 black lines for one digit, and the
134
+ // 5
135
+ // interleaved white lines for the second digit.
136
+ // Therefore, need to scan 10 lines and then
137
+ // split these into two arrays
138
+ vector<int> counterDigitPair(10, 0);
139
+ vector<int> counterBlack(5, 0);
140
+ vector<int> counterWhite(5, 0);
141
+
142
+ while (payloadStart < payloadEnd) {
143
+
144
+ // Get 10 runs of black/white.
145
+ recordPattern(row, payloadStart, counterDigitPair);
146
+ // Split them into each array
147
+ for (int k = 0; k < 5; k++) {
148
+ int twoK = k << 1;
149
+ counterBlack[k] = counterDigitPair[twoK];
150
+ counterWhite[k] = counterDigitPair[twoK + 1];
151
+ }
152
+
153
+ int bestMatch = decodeDigit(counterBlack);
154
+ resultString.append(1, (char) ('0' + bestMatch));
155
+ bestMatch = decodeDigit(counterWhite);
156
+ resultString.append(1, (char) ('0' + bestMatch));
157
+
158
+ for (int i = 0, e = counterDigitPair.size(); i < e; i++) {
159
+ payloadStart += counterDigitPair[i];
160
+ }
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Identify where the start of the middle / payload section starts.
166
+ *
167
+ * @param row row of black/white values to search
168
+ * @return Array, containing index of start of 'start block' and end of
169
+ * 'start block'
170
+ * @throws ReaderException
171
+ */
172
+ ITFReader::Range ITFReader::decodeStart(Ref<BitArray> row) {
173
+ int endStart = skipWhiteSpace(row);
174
+ Range startPattern = findGuardPattern(row, endStart, START_PATTERN);
175
+
176
+ // Determine the width of a narrow line in pixels. We can do this by
177
+ // getting the width of the start pattern and dividing by 4 because its
178
+ // made up of 4 narrow lines.
179
+ narrowLineWidth = (startPattern[1] - startPattern[0]) >> 2;
180
+
181
+ validateQuietZone(row, startPattern[0]);
182
+ return startPattern;
183
+ }
184
+
185
+ /**
186
+ * Identify where the end of the middle / payload section ends.
187
+ *
188
+ * @param row row of black/white values to search
189
+ * @return Array, containing index of start of 'end block' and end of 'end
190
+ * block'
191
+ * @throws ReaderException
192
+ */
193
+
194
+ ITFReader::Range ITFReader::decodeEnd(Ref<BitArray> row) {
195
+ // For convenience, reverse the row and then
196
+ // search from 'the start' for the end block
197
+ BitArray::Reverse r (row);
198
+
199
+ int endStart = skipWhiteSpace(row);
200
+ Range endPattern = findGuardPattern(row, endStart, END_PATTERN_REVERSED);
201
+
202
+ // The start & end patterns must be pre/post fixed by a quiet zone. This
203
+ // zone must be at least 10 times the width of a narrow line.
204
+ // ref: http://www.barcode-1.net/i25code.html
205
+ validateQuietZone(row, endPattern[0]);
206
+
207
+ // Now recalculate the indices of where the 'endblock' starts & stops to
208
+ // accommodate
209
+ // the reversed nature of the search
210
+ int temp = endPattern[0];
211
+ endPattern[0] = row->getSize() - endPattern[1];
212
+ endPattern[1] = row->getSize() - temp;
213
+
214
+ return endPattern;
215
+ }
216
+
217
+ /**
218
+ * The start & end patterns must be pre/post fixed by a quiet zone. This
219
+ * zone must be at least 10 times the width of a narrow line. Scan back until
220
+ * we either get to the start of the barcode or match the necessary number of
221
+ * quiet zone pixels.
222
+ *
223
+ * Note: Its assumed the row is reversed when using this method to find
224
+ * quiet zone after the end pattern.
225
+ *
226
+ * ref: http://www.barcode-1.net/i25code.html
227
+ *
228
+ * @param row bit array representing the scanned barcode.
229
+ * @param startPattern index into row of the start or end pattern.
230
+ * @throws ReaderException if the quiet zone cannot be found, a ReaderException is thrown.
231
+ */
232
+ void ITFReader::validateQuietZone(Ref<BitArray> row, int startPattern) {
233
+ int quietCount = this->narrowLineWidth * 10; // expect to find this many pixels of quiet zone
234
+
235
+ for (int i = startPattern - 1; quietCount > 0 && i >= 0; i--) {
236
+ if (row->get(i)) {
237
+ break;
238
+ }
239
+ quietCount--;
240
+ }
241
+ if (quietCount != 0) {
242
+ // Unable to find the necessary number of quiet zone pixels.
243
+ throw NotFoundException();
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Skip all whitespace until we get to the first black line.
249
+ *
250
+ * @param row row of black/white values to search
251
+ * @return index of the first black line.
252
+ * @throws ReaderException Throws exception if no black lines are found in the row
253
+ */
254
+ int ITFReader::skipWhiteSpace(Ref<BitArray> row) {
255
+ int width = row->getSize();
256
+ int endStart = row->getNextSet(0);
257
+ if (endStart == width) {
258
+ throw NotFoundException();
259
+ }
260
+ return endStart;
261
+ }
262
+
263
+ /**
264
+ * @param row row of black/white values to search
265
+ * @param rowOffset position to start search
266
+ * @param pattern pattern of counts of number of black and white pixels that are
267
+ * being searched for as a pattern
268
+ * @return start/end horizontal offset of guard pattern, as an array of two
269
+ * ints
270
+ * @throws ReaderException if pattern is not found
271
+ */
272
+ ITFReader::Range ITFReader::findGuardPattern(Ref<BitArray> row,
273
+ int rowOffset,
274
+ vector<int> const& pattern) {
275
+ // TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
276
+ // merged to a single method.
277
+ int patternLength = pattern.size();
278
+ vector<int> counters(patternLength);
279
+ int width = row->getSize();
280
+ bool isWhite = false;
281
+
282
+ int counterPosition = 0;
283
+ int patternStart = rowOffset;
284
+ for (int x = rowOffset; x < width; x++) {
285
+ if (row->get(x) ^ isWhite) {
286
+ counters[counterPosition]++;
287
+ } else {
288
+ if (counterPosition == patternLength - 1) {
289
+ if (patternMatchVariance(counters, &pattern[0], MAX_INDIVIDUAL_VARIANCE) < MAX_AVG_VARIANCE) {
290
+ return Range(patternStart, x);
291
+ }
292
+ patternStart += counters[0] + counters[1];
293
+ for (int y = 2; y < patternLength; y++) {
294
+ counters[y - 2] = counters[y];
295
+ }
296
+ counters[patternLength - 2] = 0;
297
+ counters[patternLength - 1] = 0;
298
+ counterPosition--;
299
+ } else {
300
+ counterPosition++;
301
+ }
302
+ counters[counterPosition] = 1;
303
+ isWhite = !isWhite;
304
+ }
305
+ }
306
+ throw NotFoundException();
307
+ }
308
+
309
+ /**
310
+ * Attempts to decode a sequence of ITF black/white lines into single
311
+ * digit.
312
+ *
313
+ * @param counters the counts of runs of observed black/white/black/... values
314
+ * @return The decoded digit
315
+ * @throws ReaderException if digit cannot be decoded
316
+ */
317
+ int ITFReader::decodeDigit(vector<int>& counters){
318
+
319
+ int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
320
+ int bestMatch = -1;
321
+ int max = sizeof(PATTERNS)/sizeof(PATTERNS[0]);
322
+ for (int i = 0; i < max; i++) {
323
+ int const* pattern = PATTERNS[i];
324
+ int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE);
325
+ if (variance < bestVariance) {
326
+ bestVariance = variance;
327
+ bestMatch = i;
328
+ }
329
+ }
330
+ if (bestMatch >= 0) {
331
+ return bestMatch;
332
+ } else {
333
+ throw NotFoundException();
334
+ }
335
+ }
336
+
337
+ ITFReader::~ITFReader(){}