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,47 @@
1
+ #ifndef __MULTI_FINDER_PATTERN_FINDER_H__
2
+ #define __MULTI_FINDER_PATTERN_FINDER_H__
3
+
4
+ /*
5
+ * Copyright 2011 ZXing authors
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 <zxing/qrcode/detector/FinderPattern.h>
21
+ #include <zxing/qrcode/detector/FinderPatternFinder.h>
22
+ #include <zxing/qrcode/detector/FinderPatternInfo.h>
23
+
24
+ namespace zxing {
25
+ namespace multi {
26
+
27
+ class MultiFinderPatternFinder : zxing::qrcode::FinderPatternFinder {
28
+ private:
29
+ std::vector<std::vector<Ref<zxing::qrcode::FinderPattern> > > selectBestPatterns();
30
+
31
+ static const float MAX_MODULE_COUNT_PER_EDGE;
32
+ static const float MIN_MODULE_COUNT_PER_EDGE;
33
+ static const float DIFF_MODSIZE_CUTOFF_PERCENT;
34
+ static const float DIFF_MODSIZE_CUTOFF;
35
+
36
+ public:
37
+ MultiFinderPatternFinder(Ref<BitMatrix> image, Ref<ResultPointCallback> resultPointCallback);
38
+ virtual ~MultiFinderPatternFinder();
39
+ virtual std::vector<Ref<zxing::qrcode::FinderPatternInfo> > findMulti(DecodeHints const& hints);
40
+
41
+
42
+ };
43
+
44
+ }
45
+ }
46
+
47
+ #endif // __MULTI_FINDER_PATTERN_FINDER_H__
@@ -0,0 +1,340 @@
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/CodaBarReader.h>
20
+ #include <zxing/oned/OneDResultPoint.h>
21
+ #include <zxing/common/Array.h>
22
+ #include <zxing/ReaderException.h>
23
+ #include <zxing/NotFoundException.h>
24
+ #include <zxing/FormatException.h>
25
+ #include <zxing/ChecksumException.h>
26
+ #include <math.h>
27
+ #include <sstream>
28
+
29
+ using std::vector;
30
+ using std::string;
31
+ using zxing::NotFoundException;
32
+ using zxing::FormatException;
33
+ using zxing::ChecksumException;
34
+ using zxing::Ref;
35
+ using zxing::Result;
36
+ using zxing::oned::CodaBarReader;
37
+
38
+ // VC++
39
+ using zxing::BitArray;
40
+
41
+ namespace {
42
+ char const ALPHABET_STRING[] = "0123456789-$:/.+ABCD";
43
+ char const* const ALPHABET = ALPHABET_STRING;
44
+
45
+ /**
46
+ * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of
47
+ * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow.
48
+ */
49
+ const int CHARACTER_ENCODINGS[] = {
50
+ 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9
51
+ 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD
52
+ };
53
+
54
+ // minimal number of characters that should be present (inclusing start and stop characters)
55
+ // under normal circumstances this should be set to 3, but can be set higher
56
+ // as a last-ditch attempt to reduce false positives.
57
+ const int MIN_CHARACTER_LENGTH = 3;
58
+
59
+ // official start and end patterns
60
+ const char STARTEND_ENCODING[] = {'A', 'B', 'C', 'D', 0};
61
+ // some codabar generator allow the codabar string to be closed by every
62
+ // character. This will cause lots of false positives!
63
+
64
+ // some industries use a checksum standard but this is not part of the original codabar standard
65
+ // for more information see : http://www.mecsw.com/specs/codabar.html
66
+ }
67
+
68
+ // These values are critical for determining how permissive the decoding
69
+ // will be. All stripe sizes must be within the window these define, as
70
+ // compared to the average stripe size.
71
+ const int CodaBarReader::MAX_ACCEPTABLE =
72
+ (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 2.0f);
73
+ const int CodaBarReader::PADDING =
74
+ (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 1.5f);
75
+
76
+ CodaBarReader::CodaBarReader()
77
+ : counters(80, 0), counterLength(0) {}
78
+
79
+ Ref<Result> CodaBarReader::decodeRow(int rowNumber, Ref<BitArray> row) {
80
+
81
+ { // Arrays.fill(counters, 0);
82
+ int size = counters.size();
83
+ counters.resize(0);
84
+ counters.resize(size); }
85
+
86
+ setCounters(row);
87
+ int startOffset = findStartPattern();
88
+ int nextStart = startOffset;
89
+
90
+ decodeRowResult.clear();
91
+ do {
92
+ int charOffset = toNarrowWidePattern(nextStart);
93
+ if (charOffset == -1) {
94
+ throw NotFoundException();
95
+ }
96
+ // Hack: We store the position in the alphabet table into a
97
+ // StringBuilder, so that we can access the decoded patterns in
98
+ // validatePattern. We'll translate to the actual characters later.
99
+ decodeRowResult.append(1, (char)charOffset);
100
+ nextStart += 8;
101
+ // Stop as soon as we see the end character.
102
+ if (decodeRowResult.length() > 1 &&
103
+ arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) {
104
+ break;
105
+ }
106
+ } while (nextStart < counterLength); // no fixed end pattern so keep on reading while data is available
107
+
108
+ // Look for whitespace after pattern:
109
+ int trailingWhitespace = counters[nextStart - 1];
110
+ int lastPatternSize = 0;
111
+ for (int i = -8; i < -1; i++) {
112
+ lastPatternSize += counters[nextStart + i];
113
+ }
114
+
115
+ // We need to see whitespace equal to 50% of the last pattern size,
116
+ // otherwise this is probably a false positive. The exception is if we are
117
+ // at the end of the row. (I.e. the barcode barely fits.)
118
+ if (nextStart < counterLength && trailingWhitespace < lastPatternSize / 2) {
119
+ throw NotFoundException();
120
+ }
121
+
122
+ validatePattern(startOffset);
123
+
124
+ // Translate character table offsets to actual characters.
125
+ for (int i = 0; i < (int)decodeRowResult.length(); i++) {
126
+ decodeRowResult[i] = ALPHABET[(int)decodeRowResult[i]];
127
+ }
128
+ // Ensure a valid start and end character
129
+ char startchar = decodeRowResult[0];
130
+ if (!arrayContains(STARTEND_ENCODING, startchar)) {
131
+ throw NotFoundException();
132
+ }
133
+ char endchar = decodeRowResult[decodeRowResult.length() - 1];
134
+ if (!arrayContains(STARTEND_ENCODING, endchar)) {
135
+ throw NotFoundException();
136
+ }
137
+
138
+ // remove stop/start characters character and check if a long enough string is contained
139
+ if ((int)decodeRowResult.length() <= MIN_CHARACTER_LENGTH) {
140
+ // Almost surely a false positive ( start + stop + at least 1 character)
141
+ throw NotFoundException();
142
+ }
143
+
144
+ decodeRowResult.erase(decodeRowResult.length() - 1, 1);
145
+ decodeRowResult.erase(0, 1);
146
+
147
+ int runningCount = 0;
148
+ for (int i = 0; i < startOffset; i++) {
149
+ runningCount += counters[i];
150
+ }
151
+ float left = (float) runningCount;
152
+ for (int i = startOffset; i < nextStart - 1; i++) {
153
+ runningCount += counters[i];
154
+ }
155
+ float right = (float) runningCount;
156
+
157
+ ArrayRef< Ref<ResultPoint> > resultPoints(2);
158
+ resultPoints[0] =
159
+ Ref<OneDResultPoint>(new OneDResultPoint(left, (float) rowNumber));
160
+ resultPoints[1] =
161
+ Ref<OneDResultPoint>(new OneDResultPoint(right, (float) rowNumber));
162
+
163
+ return Ref<Result>(new Result(Ref<String>(new String(decodeRowResult)),
164
+ ArrayRef<char>(),
165
+ resultPoints,
166
+ BarcodeFormat::CODABAR));
167
+ }
168
+
169
+ void CodaBarReader::validatePattern(int start) {
170
+ // First, sum up the total size of our four categories of stripe sizes;
171
+ vector<int> sizes (4, 0);
172
+ vector<int> counts (4, 0);
173
+ int end = decodeRowResult.length() - 1;
174
+
175
+ // We break out of this loop in the middle, in order to handle
176
+ // inter-character spaces properly.
177
+ int pos = start;
178
+ for (int i = 0; true; i++) {
179
+ int pattern = CHARACTER_ENCODINGS[(int)decodeRowResult[i]];
180
+ for (int j = 6; j >= 0; j--) {
181
+ // Even j = bars, while odd j = spaces. Categories 2 and 3 are for
182
+ // long stripes, while 0 and 1 are for short stripes.
183
+ int category = (j & 1) + (pattern & 1) * 2;
184
+ sizes[category] += counters[pos + j];
185
+ counts[category]++;
186
+ pattern >>= 1;
187
+ }
188
+ if (i >= end) {
189
+ break;
190
+ }
191
+ // We ignore the inter-character space - it could be of any size.
192
+ pos += 8;
193
+ }
194
+
195
+ // Calculate our allowable size thresholds using fixed-point math.
196
+ vector<int> maxes (4, 0);
197
+ vector<int> mins (4, 0);
198
+ // Define the threshold of acceptability to be the midpoint between the
199
+ // average small stripe and the average large stripe. No stripe lengths
200
+ // should be on the "wrong" side of that line.
201
+ for (int i = 0; i < 2; i++) {
202
+ mins[i] = 0; // Accept arbitrarily small "short" stripes.
203
+ mins[i + 2] = ((sizes[i] << INTEGER_MATH_SHIFT) / counts[i] +
204
+ (sizes[i + 2] << INTEGER_MATH_SHIFT) / counts[i + 2]) >> 1;
205
+ maxes[i] = mins[i + 2];
206
+ maxes[i + 2] = (sizes[i + 2] * MAX_ACCEPTABLE + PADDING) / counts[i + 2];
207
+ }
208
+
209
+ // Now verify that all of the stripes are within the thresholds.
210
+ pos = start;
211
+ for (int i = 0; true; i++) {
212
+ int pattern = CHARACTER_ENCODINGS[(int)decodeRowResult[i]];
213
+ for (int j = 6; j >= 0; j--) {
214
+ // Even j = bars, while odd j = spaces. Categories 2 and 3 are for
215
+ // long stripes, while 0 and 1 are for short stripes.
216
+ int category = (j & 1) + (pattern & 1) * 2;
217
+ int size = counters[pos + j] << INTEGER_MATH_SHIFT;
218
+ if (size < mins[category] || size > maxes[category]) {
219
+ throw NotFoundException();
220
+ }
221
+ pattern >>= 1;
222
+ }
223
+ if (i >= end) {
224
+ break;
225
+ }
226
+ pos += 8;
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Records the size of all runs of white and black pixels, starting with white.
232
+ * This is just like recordPattern, except it records all the counters, and
233
+ * uses our builtin "counters" member for storage.
234
+ * @param row row to count from
235
+ */
236
+ void CodaBarReader::setCounters(Ref<BitArray> row) {
237
+ counterLength = 0;
238
+ // Start from the first white bit.
239
+ int i = row->getNextUnset(0);
240
+ int end = row->getSize();
241
+ if (i >= end) {
242
+ throw NotFoundException();
243
+ }
244
+ bool isWhite = true;
245
+ int count = 0;
246
+ for (; i < end; i++) {
247
+ if (row->get(i) ^ isWhite) { // that is, exactly one is true
248
+ count++;
249
+ } else {
250
+ counterAppend(count);
251
+ count = 1;
252
+ isWhite = !isWhite;
253
+ }
254
+ }
255
+ counterAppend(count);
256
+ }
257
+
258
+ void CodaBarReader::counterAppend(int e) {
259
+ if (counterLength < (int)counters.size()) {
260
+ counters[counterLength] = e;
261
+ } else {
262
+ counters.push_back(e);
263
+ }
264
+ counterLength++;
265
+ }
266
+
267
+ int CodaBarReader::findStartPattern() {
268
+ for (int i = 1; i < counterLength; i += 2) {
269
+ int charOffset = toNarrowWidePattern(i);
270
+ if (charOffset != -1 && arrayContains(STARTEND_ENCODING, ALPHABET[charOffset])) {
271
+ // Look for whitespace before start pattern, >= 50% of width of start pattern
272
+ // We make an exception if the whitespace is the first element.
273
+ int patternSize = 0;
274
+ for (int j = i; j < i + 7; j++) {
275
+ patternSize += counters[j];
276
+ }
277
+ if (i == 1 || counters[i-1] >= patternSize / 2) {
278
+ return i;
279
+ }
280
+ }
281
+ }
282
+ throw NotFoundException();
283
+ }
284
+
285
+ bool CodaBarReader::arrayContains(char const array[], char key) {
286
+ return strchr(array, key) != 0;
287
+ }
288
+
289
+
290
+ int CodaBarReader::toNarrowWidePattern(int position) {
291
+ int end = position + 7;
292
+ if (end >= counterLength) {
293
+ return -1;
294
+ }
295
+
296
+ vector<int>& theCounters = counters;
297
+
298
+ int maxBar = 0;
299
+ int minBar = std::numeric_limits<int>::max();
300
+ for (int j = position; j < end; j += 2) {
301
+ int currentCounter = theCounters[j];
302
+ if (currentCounter < minBar) {
303
+ minBar = currentCounter;
304
+ }
305
+ if (currentCounter > maxBar) {
306
+ maxBar = currentCounter;
307
+ }
308
+ }
309
+ int thresholdBar = (minBar + maxBar) / 2;
310
+
311
+ int maxSpace = 0;
312
+ int minSpace = std::numeric_limits<int>::max();
313
+ for (int j = position + 1; j < end; j += 2) {
314
+ int currentCounter = theCounters[j];
315
+ if (currentCounter < minSpace) {
316
+ minSpace = currentCounter;
317
+ }
318
+ if (currentCounter > maxSpace) {
319
+ maxSpace = currentCounter;
320
+ }
321
+ }
322
+ int thresholdSpace = (minSpace + maxSpace) / 2;
323
+
324
+ int bitmask = 1 << 7;
325
+ int pattern = 0;
326
+ for (int i = 0; i < 7; i++) {
327
+ int threshold = (i & 1) == 0 ? thresholdBar : thresholdSpace;
328
+ bitmask >>= 1;
329
+ if (theCounters[position + i] > threshold) {
330
+ pattern |= bitmask;
331
+ }
332
+ }
333
+
334
+ for (int i = 0; i < ZXING_ARRAY_LEN(CHARACTER_ENCODINGS); i++) {
335
+ if (CHARACTER_ENCODINGS[i] == pattern) {
336
+ return i;
337
+ }
338
+ }
339
+ return -1;
340
+ }
@@ -0,0 +1,57 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __CODA_BAR_READER_H__
3
+ #define __CODA_BAR_READER_H__
4
+ /*
5
+ * Copyright 2010 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 <zxing/oned/OneDReader.h>
21
+ #include <zxing/common/BitArray.h>
22
+ #include <zxing/Result.h>
23
+
24
+ namespace zxing {
25
+ namespace oned {
26
+
27
+ class CodaBarReader : public OneDReader {
28
+ private:
29
+ static const int MAX_ACCEPTABLE;
30
+ static const int PADDING;
31
+
32
+ // Keep some instance variables to avoid reallocations
33
+ std::string decodeRowResult;
34
+ std::vector<int> counters;
35
+ int counterLength;
36
+
37
+ public:
38
+ CodaBarReader();
39
+
40
+ Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
41
+
42
+ void validatePattern(int start);
43
+
44
+ private:
45
+ void setCounters(Ref<BitArray> row);
46
+ void counterAppend(int e);
47
+ int findStartPattern();
48
+
49
+ static bool arrayContains(char const array[], char key);
50
+
51
+ int toNarrowWidePattern(int position);
52
+ };
53
+
54
+ }
55
+ }
56
+
57
+ #endif
@@ -0,0 +1,496 @@
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/Code128Reader.h>
20
+ #include <zxing/oned/OneDResultPoint.h>
21
+ #include <zxing/common/Array.h>
22
+ #include <zxing/ReaderException.h>
23
+ #include <zxing/NotFoundException.h>
24
+ #include <zxing/FormatException.h>
25
+ #include <zxing/ChecksumException.h>
26
+ #include <math.h>
27
+ #include <string.h>
28
+ #include <sstream>
29
+
30
+ using std::vector;
31
+ using std::string;
32
+ using zxing::NotFoundException;
33
+ using zxing::FormatException;
34
+ using zxing::ChecksumException;
35
+ using zxing::Ref;
36
+ using zxing::Result;
37
+ using zxing::oned::Code128Reader;
38
+
39
+ // VC++
40
+ using zxing::BitArray;
41
+
42
+ const int Code128Reader::MAX_AVG_VARIANCE = int(PATTERN_MATCH_RESULT_SCALE_FACTOR * 250/1000);
43
+ const int Code128Reader::MAX_INDIVIDUAL_VARIANCE = int(PATTERN_MATCH_RESULT_SCALE_FACTOR * 700/1000);
44
+
45
+ namespace {
46
+
47
+ const int CODE_SHIFT = 98;
48
+
49
+ const int CODE_CODE_C = 99;
50
+ const int CODE_CODE_B = 100;
51
+ const int CODE_CODE_A = 101;
52
+
53
+ const int CODE_FNC_1 = 102;
54
+ const int CODE_FNC_2 = 97;
55
+ const int CODE_FNC_3 = 96;
56
+ const int CODE_FNC_4_A = 101;
57
+ const int CODE_FNC_4_B = 100;
58
+
59
+ const int CODE_START_A = 103;
60
+ const int CODE_START_B = 104;
61
+ const int CODE_START_C = 105;
62
+ const int CODE_STOP = 106;
63
+
64
+ const int CODE_PATTERNS_LENGTH = 107;
65
+ const int CODE_PATTERNS[CODE_PATTERNS_LENGTH][6] = {
66
+ {2, 1, 2, 2, 2, 2}, /* 0 */
67
+ {2, 2, 2, 1, 2, 2},
68
+ {2, 2, 2, 2, 2, 1},
69
+ {1, 2, 1, 2, 2, 3},
70
+ {1, 2, 1, 3, 2, 2},
71
+ {1, 3, 1, 2, 2, 2}, /* 5 */
72
+ {1, 2, 2, 2, 1, 3},
73
+ {1, 2, 2, 3, 1, 2},
74
+ {1, 3, 2, 2, 1, 2},
75
+ {2, 2, 1, 2, 1, 3},
76
+ {2, 2, 1, 3, 1, 2}, /* 10 */
77
+ {2, 3, 1, 2, 1, 2},
78
+ {1, 1, 2, 2, 3, 2},
79
+ {1, 2, 2, 1, 3, 2},
80
+ {1, 2, 2, 2, 3, 1},
81
+ {1, 1, 3, 2, 2, 2}, /* 15 */
82
+ {1, 2, 3, 1, 2, 2},
83
+ {1, 2, 3, 2, 2, 1},
84
+ {2, 2, 3, 2, 1, 1},
85
+ {2, 2, 1, 1, 3, 2},
86
+ {2, 2, 1, 2, 3, 1}, /* 20 */
87
+ {2, 1, 3, 2, 1, 2},
88
+ {2, 2, 3, 1, 1, 2},
89
+ {3, 1, 2, 1, 3, 1},
90
+ {3, 1, 1, 2, 2, 2},
91
+ {3, 2, 1, 1, 2, 2}, /* 25 */
92
+ {3, 2, 1, 2, 2, 1},
93
+ {3, 1, 2, 2, 1, 2},
94
+ {3, 2, 2, 1, 1, 2},
95
+ {3, 2, 2, 2, 1, 1},
96
+ {2, 1, 2, 1, 2, 3}, /* 30 */
97
+ {2, 1, 2, 3, 2, 1},
98
+ {2, 3, 2, 1, 2, 1},
99
+ {1, 1, 1, 3, 2, 3},
100
+ {1, 3, 1, 1, 2, 3},
101
+ {1, 3, 1, 3, 2, 1}, /* 35 */
102
+ {1, 1, 2, 3, 1, 3},
103
+ {1, 3, 2, 1, 1, 3},
104
+ {1, 3, 2, 3, 1, 1},
105
+ {2, 1, 1, 3, 1, 3},
106
+ {2, 3, 1, 1, 1, 3}, /* 40 */
107
+ {2, 3, 1, 3, 1, 1},
108
+ {1, 1, 2, 1, 3, 3},
109
+ {1, 1, 2, 3, 3, 1},
110
+ {1, 3, 2, 1, 3, 1},
111
+ {1, 1, 3, 1, 2, 3}, /* 45 */
112
+ {1, 1, 3, 3, 2, 1},
113
+ {1, 3, 3, 1, 2, 1},
114
+ {3, 1, 3, 1, 2, 1},
115
+ {2, 1, 1, 3, 3, 1},
116
+ {2, 3, 1, 1, 3, 1}, /* 50 */
117
+ {2, 1, 3, 1, 1, 3},
118
+ {2, 1, 3, 3, 1, 1},
119
+ {2, 1, 3, 1, 3, 1},
120
+ {3, 1, 1, 1, 2, 3},
121
+ {3, 1, 1, 3, 2, 1}, /* 55 */
122
+ {3, 3, 1, 1, 2, 1},
123
+ {3, 1, 2, 1, 1, 3},
124
+ {3, 1, 2, 3, 1, 1},
125
+ {3, 3, 2, 1, 1, 1},
126
+ {3, 1, 4, 1, 1, 1}, /* 60 */
127
+ {2, 2, 1, 4, 1, 1},
128
+ {4, 3, 1, 1, 1, 1},
129
+ {1, 1, 1, 2, 2, 4},
130
+ {1, 1, 1, 4, 2, 2},
131
+ {1, 2, 1, 1, 2, 4}, /* 65 */
132
+ {1, 2, 1, 4, 2, 1},
133
+ {1, 4, 1, 1, 2, 2},
134
+ {1, 4, 1, 2, 2, 1},
135
+ {1, 1, 2, 2, 1, 4},
136
+ {1, 1, 2, 4, 1, 2}, /* 70 */
137
+ {1, 2, 2, 1, 1, 4},
138
+ {1, 2, 2, 4, 1, 1},
139
+ {1, 4, 2, 1, 1, 2},
140
+ {1, 4, 2, 2, 1, 1},
141
+ {2, 4, 1, 2, 1, 1}, /* 75 */
142
+ {2, 2, 1, 1, 1, 4},
143
+ {4, 1, 3, 1, 1, 1},
144
+ {2, 4, 1, 1, 1, 2},
145
+ {1, 3, 4, 1, 1, 1},
146
+ {1, 1, 1, 2, 4, 2}, /* 80 */
147
+ {1, 2, 1, 1, 4, 2},
148
+ {1, 2, 1, 2, 4, 1},
149
+ {1, 1, 4, 2, 1, 2},
150
+ {1, 2, 4, 1, 1, 2},
151
+ {1, 2, 4, 2, 1, 1}, /* 85 */
152
+ {4, 1, 1, 2, 1, 2},
153
+ {4, 2, 1, 1, 1, 2},
154
+ {4, 2, 1, 2, 1, 1},
155
+ {2, 1, 2, 1, 4, 1},
156
+ {2, 1, 4, 1, 2, 1}, /* 90 */
157
+ {4, 1, 2, 1, 2, 1},
158
+ {1, 1, 1, 1, 4, 3},
159
+ {1, 1, 1, 3, 4, 1},
160
+ {1, 3, 1, 1, 4, 1},
161
+ {1, 1, 4, 1, 1, 3}, /* 95 */
162
+ {1, 1, 4, 3, 1, 1},
163
+ {4, 1, 1, 1, 1, 3},
164
+ {4, 1, 1, 3, 1, 1},
165
+ {1, 1, 3, 1, 4, 1},
166
+ {1, 1, 4, 1, 3, 1}, /* 100 */
167
+ {3, 1, 1, 1, 4, 1},
168
+ {4, 1, 1, 1, 3, 1},
169
+ {2, 1, 1, 4, 1, 2},
170
+ {2, 1, 1, 2, 1, 4},
171
+ {2, 1, 1, 2, 3, 2}, /* 105 */
172
+ {2, 3, 3, 1, 1, 1}
173
+ };
174
+
175
+ }
176
+
177
+ Code128Reader::Code128Reader(){}
178
+
179
+ vector<int> Code128Reader::findStartPattern(Ref<BitArray> row){
180
+ int width = row->getSize();
181
+ int rowOffset = row->getNextSet(0);
182
+
183
+ int counterPosition = 0;
184
+ vector<int> counters (6, 0);
185
+ int patternStart = rowOffset;
186
+ bool isWhite = false;
187
+ int patternLength = counters.size();
188
+
189
+ for (int i = rowOffset; i < width; i++) {
190
+ if (row->get(i) ^ isWhite) {
191
+ counters[counterPosition]++;
192
+ } else {
193
+ if (counterPosition == patternLength - 1) {
194
+ int bestVariance = MAX_AVG_VARIANCE;
195
+ int bestMatch = -1;
196
+ for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) {
197
+ int variance = patternMatchVariance(counters, CODE_PATTERNS[startCode], MAX_INDIVIDUAL_VARIANCE);
198
+ if (variance < bestVariance) {
199
+ bestVariance = variance;
200
+ bestMatch = startCode;
201
+ }
202
+ }
203
+ // Look for whitespace before start pattern, >= 50% of width of start pattern
204
+ if (bestMatch >= 0 &&
205
+ row->isRange(std::max(0, patternStart - (i - patternStart) / 2), patternStart, false)) {
206
+ vector<int> resultValue (3, 0);
207
+ resultValue[0] = patternStart;
208
+ resultValue[1] = i;
209
+ resultValue[2] = bestMatch;
210
+ return resultValue;
211
+ }
212
+ patternStart += counters[0] + counters[1];
213
+ for (int y = 2; y < patternLength; y++) {
214
+ counters[y - 2] = counters[y];
215
+ }
216
+ counters[patternLength - 2] = 0;
217
+ counters[patternLength - 1] = 0;
218
+ counterPosition--;
219
+ } else {
220
+ counterPosition++;
221
+ }
222
+ counters[counterPosition] = 1;
223
+ isWhite = !isWhite;
224
+ }
225
+ }
226
+ throw NotFoundException();
227
+ }
228
+
229
+ int Code128Reader::decodeCode(Ref<BitArray> row, vector<int>& counters, int rowOffset) {
230
+ recordPattern(row, rowOffset, counters);
231
+ int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
232
+ int bestMatch = -1;
233
+ for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) {
234
+ int const* const pattern = CODE_PATTERNS[d];
235
+ int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE);
236
+ if (variance < bestVariance) {
237
+ bestVariance = variance;
238
+ bestMatch = d;
239
+ }
240
+ }
241
+ // TODO We're overlooking the fact that the STOP pattern has 7 values, not 6.
242
+ if (bestMatch >= 0) {
243
+ return bestMatch;
244
+ } else {
245
+ throw NotFoundException();
246
+ }
247
+ }
248
+
249
+ Ref<Result> Code128Reader::decodeRow(int rowNumber, Ref<BitArray> row) {
250
+ // boolean convertFNC1 = hints != null && hints.containsKey(DecodeHintType.ASSUME_GS1);
251
+ boolean convertFNC1 = false;
252
+ vector<int> startPatternInfo (findStartPattern(row));
253
+ int startCode = startPatternInfo[2];
254
+ int codeSet;
255
+ switch (startCode) {
256
+ case CODE_START_A:
257
+ codeSet = CODE_CODE_A;
258
+ break;
259
+ case CODE_START_B:
260
+ codeSet = CODE_CODE_B;
261
+ break;
262
+ case CODE_START_C:
263
+ codeSet = CODE_CODE_C;
264
+ break;
265
+ default:
266
+ throw FormatException();
267
+ }
268
+
269
+ bool done = false;
270
+ bool isNextShifted = false;
271
+
272
+ string result;
273
+ vector<char> rawCodes(20, 0);
274
+
275
+ int lastStart = startPatternInfo[0];
276
+ int nextStart = startPatternInfo[1];
277
+ vector<int> counters (6, 0);
278
+
279
+ int lastCode = 0;
280
+ int code = 0;
281
+ int checksumTotal = startCode;
282
+ int multiplier = 0;
283
+ bool lastCharacterWasPrintable = true;
284
+
285
+ std::ostringstream oss;
286
+
287
+ while (!done) {
288
+
289
+ bool unshift = isNextShifted;
290
+ isNextShifted = false;
291
+
292
+ // Save off last code
293
+ lastCode = code;
294
+
295
+ code = decodeCode(row, counters, nextStart);
296
+
297
+ // Remember whether the last code was printable or not (excluding CODE_STOP)
298
+ if (code != CODE_STOP) {
299
+ lastCharacterWasPrintable = true;
300
+ }
301
+
302
+ // Add to checksum computation (if not CODE_STOP of course)
303
+ if (code != CODE_STOP) {
304
+ multiplier++;
305
+ checksumTotal += multiplier * code;
306
+ }
307
+
308
+ // Advance to where the next code will to start
309
+ lastStart = nextStart;
310
+ for (int i = 0, e = counters.size(); i < e; i++) {
311
+ nextStart += counters[i];
312
+ }
313
+
314
+ // Take care of illegal start codes
315
+ switch (code) {
316
+ case CODE_START_A:
317
+ case CODE_START_B:
318
+ case CODE_START_C:
319
+ throw FormatException();
320
+ }
321
+
322
+ switch (codeSet) {
323
+
324
+ case CODE_CODE_A:
325
+ if (code < 64) {
326
+ result.append(1, (char) (' ' + code));
327
+ } else if (code < 96) {
328
+ result.append(1, (char) (code - 64));
329
+ } else {
330
+ // Don't let CODE_STOP, which always appears, affect whether whether we think the
331
+ // last code was printable or not.
332
+ if (code != CODE_STOP) {
333
+ lastCharacterWasPrintable = false;
334
+ }
335
+ switch (code) {
336
+ case CODE_FNC_1:
337
+ if (convertFNC1) {
338
+ if (result.length() == 0){
339
+ // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code
340
+ // is FNC1 then this is GS1-128. We add the symbology identifier.
341
+ result.append("]C1");
342
+ } else {
343
+ // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS)
344
+ result.append(1, (char) 29);
345
+ }
346
+ }
347
+ break;
348
+ case CODE_FNC_2:
349
+ case CODE_FNC_3:
350
+ case CODE_FNC_4_A:
351
+ // do nothing?
352
+ break;
353
+ case CODE_SHIFT:
354
+ isNextShifted = true;
355
+ codeSet = CODE_CODE_B;
356
+ break;
357
+ case CODE_CODE_B:
358
+ codeSet = CODE_CODE_B;
359
+ break;
360
+ case CODE_CODE_C:
361
+ codeSet = CODE_CODE_C;
362
+ break;
363
+ case CODE_STOP:
364
+ done = true;
365
+ break;
366
+ }
367
+ }
368
+ break;
369
+ case CODE_CODE_B:
370
+ if (code < 96) {
371
+ result.append(1, (char) (' ' + code));
372
+ } else {
373
+ if (code != CODE_STOP) {
374
+ lastCharacterWasPrintable = false;
375
+ }
376
+ switch (code) {
377
+ case CODE_FNC_1:
378
+ case CODE_FNC_2:
379
+ case CODE_FNC_3:
380
+ case CODE_FNC_4_B:
381
+ // do nothing?
382
+ break;
383
+ case CODE_SHIFT:
384
+ isNextShifted = true;
385
+ codeSet = CODE_CODE_A;
386
+ break;
387
+ case CODE_CODE_A:
388
+ codeSet = CODE_CODE_A;
389
+ break;
390
+ case CODE_CODE_C:
391
+ codeSet = CODE_CODE_C;
392
+ break;
393
+ case CODE_STOP:
394
+ done = true;
395
+ break;
396
+ }
397
+ }
398
+ break;
399
+ case CODE_CODE_C:
400
+ if (code < 100) {
401
+ if (code < 10) {
402
+ result.append(1, '0');
403
+ }
404
+ oss.clear();
405
+ oss.str("");
406
+ oss << code;
407
+ result.append(oss.str());
408
+ } else {
409
+ if (code != CODE_STOP) {
410
+ lastCharacterWasPrintable = false;
411
+ }
412
+ switch (code) {
413
+ case CODE_FNC_1:
414
+ // do nothing?
415
+ break;
416
+ case CODE_CODE_A:
417
+ codeSet = CODE_CODE_A;
418
+ break;
419
+ case CODE_CODE_B:
420
+ codeSet = CODE_CODE_B;
421
+ break;
422
+ case CODE_STOP:
423
+ done = true;
424
+ break;
425
+ }
426
+ }
427
+ break;
428
+ }
429
+
430
+ // Unshift back to another code set if we were shifted
431
+ if (unshift) {
432
+ codeSet = codeSet == CODE_CODE_A ? CODE_CODE_B : CODE_CODE_A;
433
+ }
434
+
435
+ }
436
+
437
+ int lastPatternSize = nextStart - lastStart;
438
+
439
+ // Check for ample whitespace following pattern, but, to do this we first need to remember that
440
+ // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left
441
+ // to read off. Would be slightly better to properly read. Here we just skip it:
442
+ nextStart = row->getNextUnset(nextStart);
443
+ if (!row->isRange(nextStart,
444
+ std::min(row->getSize(), nextStart + (nextStart - lastStart) / 2),
445
+ false)) {
446
+ throw NotFoundException();
447
+ }
448
+
449
+ // Pull out from sum the value of the penultimate check code
450
+ checksumTotal -= multiplier * lastCode;
451
+ // lastCode is the checksum then:
452
+ if (checksumTotal % 103 != lastCode) {
453
+ throw ChecksumException();
454
+ }
455
+
456
+ // Need to pull out the check digits from string
457
+ int resultLength = result.length();
458
+ if (resultLength == 0) {
459
+ // false positive
460
+ throw NotFoundException();
461
+ }
462
+
463
+ // Only bother if the result had at least one character, and if the checksum digit happened to
464
+ // be a printable character. If it was just interpreted as a control code, nothing to remove.
465
+ if (resultLength > 0 && lastCharacterWasPrintable) {
466
+ if (codeSet == CODE_CODE_C) {
467
+ result.erase(resultLength - 2, resultLength);
468
+ } else {
469
+ result.erase(resultLength - 1, resultLength);
470
+ }
471
+ }
472
+
473
+ float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f;
474
+ float right = lastStart + lastPatternSize / 2.0f;
475
+
476
+ int rawCodesSize = rawCodes.size();
477
+ ArrayRef<char> rawBytes (rawCodesSize);
478
+ for (int i = 0; i < rawCodesSize; i++) {
479
+ rawBytes[i] = rawCodes[i];
480
+ }
481
+
482
+ ArrayRef< Ref<ResultPoint> > resultPoints(2);
483
+ resultPoints[0] =
484
+ Ref<OneDResultPoint>(new OneDResultPoint(left, (float) rowNumber));
485
+ resultPoints[1] =
486
+ Ref<OneDResultPoint>(new OneDResultPoint(right, (float) rowNumber));
487
+
488
+ return Ref<Result>(new Result(Ref<String>(new String(result)), rawBytes, resultPoints,
489
+ BarcodeFormat::CODE_128));
490
+ }
491
+
492
+ Code128Reader::~Code128Reader(){}
493
+
494
+ zxing::BarcodeFormat Code128Reader::getBarcodeFormat(){
495
+ return BarcodeFormat::CODE_128;
496
+ }