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,48 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __CODE_128_READER_H__
3
+ #define __CODE_128_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 Code128Reader : public OneDReader {
28
+ private:
29
+ static const int MAX_AVG_VARIANCE;
30
+ static const int MAX_INDIVIDUAL_VARIANCE;
31
+
32
+ static std::vector<int> findStartPattern(Ref<BitArray> row);
33
+ static int decodeCode(Ref<BitArray> row,
34
+ std::vector<int>& counters,
35
+ int rowOffset);
36
+
37
+ public:
38
+ Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
39
+ Code128Reader();
40
+ ~Code128Reader();
41
+
42
+ BarcodeFormat getBarcodeFormat();
43
+ };
44
+
45
+ }
46
+ }
47
+
48
+ #endif
@@ -0,0 +1,328 @@
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 "Code39Reader.h"
19
+ #include <zxing/oned/OneDResultPoint.h>
20
+ #include <zxing/common/Array.h>
21
+ #include <zxing/ReaderException.h>
22
+ #include <zxing/NotFoundException.h>
23
+ #include <zxing/ChecksumException.h>
24
+ #include <math.h>
25
+ #include <limits.h>
26
+
27
+ using std::vector;
28
+ using zxing::Ref;
29
+ using zxing::Result;
30
+ using zxing::String;
31
+ using zxing::NotFoundException;
32
+ using zxing::ChecksumException;
33
+ using zxing::oned::Code39Reader;
34
+
35
+ // VC++
36
+ using zxing::BitArray;
37
+
38
+ namespace {
39
+ const char* ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";
40
+
41
+ /**
42
+ * These represent the encodings of characters, as patterns of wide and narrow
43
+ * bars.
44
+ * The 9 least-significant bits of each int correspond to the pattern of wide
45
+ * and narrow, with 1s representing "wide" and 0s representing narrow.
46
+ */
47
+ const int CHARACTER_ENCODINGS_LEN = 44;
48
+ int CHARACTER_ENCODINGS[CHARACTER_ENCODINGS_LEN] = {
49
+ 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9
50
+ 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J
51
+ 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T
52
+ 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, // U-*
53
+ 0x0A8, 0x0A2, 0x08A, 0x02A // $-%
54
+ };
55
+
56
+ int ASTERISK_ENCODING = 0x094;
57
+ const char* ALPHABET_STRING =
58
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%";
59
+
60
+ std::string alphabet_string (ALPHABET_STRING);
61
+ }
62
+
63
+ void Code39Reader::init(bool usingCheckDigit_, bool extendedMode_) {
64
+ usingCheckDigit = usingCheckDigit_;
65
+ extendedMode = extendedMode_;
66
+ decodeRowResult.reserve(20);
67
+ counters.resize(9);
68
+ }
69
+
70
+ /**
71
+ * Creates a reader that assumes all encoded data is data, and does not treat
72
+ * the final character as a check digit. It will not decoded "extended
73
+ * Code 39" sequences.
74
+ */
75
+ Code39Reader::Code39Reader() {
76
+ init();
77
+ }
78
+
79
+ /**
80
+ * Creates a reader that can be configured to check the last character as a
81
+ * check digit. It will not decoded "extended Code 39" sequences.
82
+ *
83
+ * @param usingCheckDigit if true, treat the last data character as a check
84
+ * digit, not data, and verify that the checksum passes.
85
+ */
86
+ Code39Reader::Code39Reader(bool usingCheckDigit_) {
87
+ init(usingCheckDigit_);
88
+ }
89
+
90
+ Code39Reader::Code39Reader(bool usingCheckDigit_, bool extendedMode_) {
91
+ init(usingCheckDigit_, extendedMode_);
92
+ }
93
+
94
+ Ref<Result> Code39Reader::decodeRow(int rowNumber, Ref<BitArray> row) {
95
+ std::vector<int>& theCounters (counters);
96
+ { // Arrays.fill(counters, 0);
97
+ int size = theCounters.size();
98
+ theCounters.resize(0);
99
+ theCounters.resize(size); }
100
+ std::string& result (decodeRowResult);
101
+ result.clear();
102
+
103
+ vector<int> start (findAsteriskPattern(row, theCounters));
104
+ // Read off white space
105
+ int nextStart = row->getNextSet(start[1]);
106
+ int end = row->getSize();
107
+
108
+ char decodedChar;
109
+ int lastStart;
110
+ do {
111
+ recordPattern(row, nextStart, theCounters);
112
+ int pattern = toNarrowWidePattern(theCounters);
113
+ if (pattern < 0) {
114
+ throw NotFoundException();;
115
+ }
116
+ decodedChar = patternToChar(pattern);
117
+ result.append(1, decodedChar);
118
+ lastStart = nextStart;
119
+ for (int i = 0, end=theCounters.size(); i < end; i++) {
120
+ nextStart += theCounters[i];
121
+ }
122
+ // Read off white space
123
+ nextStart = row->getNextSet(nextStart);
124
+ } while (decodedChar != '*');
125
+ result.resize(decodeRowResult.length()-1);// remove asterisk
126
+
127
+ // Look for whitespace after pattern:
128
+ int lastPatternSize = 0;
129
+ for (int i = 0, e = theCounters.size(); i < e; i++) {
130
+ lastPatternSize += theCounters[i];
131
+ }
132
+ int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
133
+ // If 50% of last pattern size, following last pattern, is not whitespace,
134
+ // fail (but if it's whitespace to the very end of the image, that's OK)
135
+ if (nextStart != end && (whiteSpaceAfterEnd >> 1) < lastPatternSize) {
136
+ throw NotFoundException();
137
+ }
138
+
139
+ if (usingCheckDigit) {
140
+ int max = result.length() - 1;
141
+ int total = 0;
142
+ for (int i = 0; i < max; i++) {
143
+ total += alphabet_string.find_first_of(decodeRowResult[i], 0);
144
+ }
145
+ if (result[max] != ALPHABET[total % 43]) {
146
+ throw ChecksumException();
147
+ }
148
+ result.resize(max);
149
+ }
150
+
151
+ if (result.length() == 0) {
152
+ // Almost false positive
153
+ throw NotFoundException();
154
+ }
155
+
156
+ Ref<String> resultString;
157
+ if (extendedMode) {
158
+ resultString = decodeExtended(result);
159
+ } else {
160
+ resultString = Ref<String>(new String(result));
161
+ }
162
+
163
+ float left = (float) (start[1] + start[0]) / 2.0f;
164
+ float right = lastStart + lastPatternSize / 2.0f;
165
+
166
+ ArrayRef< Ref<ResultPoint> > resultPoints (2);
167
+ resultPoints[0] =
168
+ Ref<OneDResultPoint>(new OneDResultPoint(left, (float) rowNumber));
169
+ resultPoints[1] =
170
+ Ref<OneDResultPoint>(new OneDResultPoint(right, (float) rowNumber));
171
+
172
+ return Ref<Result>(
173
+ new Result(resultString, ArrayRef<char>(), resultPoints, BarcodeFormat::CODE_39)
174
+ );
175
+ }
176
+
177
+ vector<int> Code39Reader::findAsteriskPattern(Ref<BitArray> row, vector<int>& counters){
178
+ int width = row->getSize();
179
+ int rowOffset = row->getNextSet(0);
180
+
181
+ int counterPosition = 0;
182
+ int patternStart = rowOffset;
183
+ bool isWhite = false;
184
+ int patternLength = counters.size();
185
+
186
+ for (int i = rowOffset; i < width; i++) {
187
+ if (row->get(i) ^ isWhite) {
188
+ counters[counterPosition]++;
189
+ } else {
190
+ if (counterPosition == patternLength - 1) {
191
+ // Look for whitespace before start pattern, >= 50% of width of
192
+ // start pattern.
193
+ if (toNarrowWidePattern(counters) == ASTERISK_ENCODING &&
194
+ row->isRange(std::max(0, patternStart - ((i - patternStart) >> 1)), patternStart, false)) {
195
+ vector<int> resultValue (2, 0);
196
+ resultValue[0] = patternStart;
197
+ resultValue[1] = i;
198
+ return resultValue;
199
+ }
200
+ patternStart += counters[0] + counters[1];
201
+ for (int y = 2; y < patternLength; y++) {
202
+ counters[y - 2] = counters[y];
203
+ }
204
+ counters[patternLength - 2] = 0;
205
+ counters[patternLength - 1] = 0;
206
+ counterPosition--;
207
+ } else {
208
+ counterPosition++;
209
+ }
210
+ counters[counterPosition] = 1;
211
+ isWhite = !isWhite;
212
+ }
213
+ }
214
+ throw NotFoundException();
215
+ }
216
+
217
+ // For efficiency, returns -1 on failure. Not throwing here saved as many as
218
+ // 700 exceptions per image when using some of our blackbox images.
219
+ int Code39Reader::toNarrowWidePattern(vector<int>& counters){
220
+ int numCounters = counters.size();
221
+ int maxNarrowCounter = 0;
222
+ int wideCounters;
223
+ do {
224
+ int minCounter = INT_MAX;
225
+ for (int i = 0; i < numCounters; i++) {
226
+ int counter = counters[i];
227
+ if (counter < minCounter && counter > maxNarrowCounter) {
228
+ minCounter = counter;
229
+ }
230
+ }
231
+ maxNarrowCounter = minCounter;
232
+ wideCounters = 0;
233
+ int totalWideCountersWidth = 0;
234
+ int pattern = 0;
235
+ for (int i = 0; i < numCounters; i++) {
236
+ int counter = counters[i];
237
+ if (counters[i] > maxNarrowCounter) {
238
+ pattern |= 1 << (numCounters - 1 - i);
239
+ wideCounters++;
240
+ totalWideCountersWidth += counter;
241
+ }
242
+ }
243
+ if (wideCounters == 3) {
244
+ // Found 3 wide counters, but are they close enough in width?
245
+ // We can perform a cheap, conservative check to see if any individual
246
+ // counter is more than 1.5 times the average:
247
+ for (int i = 0; i < numCounters && wideCounters > 0; i++) {
248
+ int counter = counters[i];
249
+ if (counters[i] > maxNarrowCounter) {
250
+ wideCounters--;
251
+ // totalWideCountersWidth = 3 * average, so this checks if
252
+ // counter >= 3/2 * average.
253
+ if ((counter << 1) >= totalWideCountersWidth) {
254
+ return -1;
255
+ }
256
+ }
257
+ }
258
+ return pattern;
259
+ }
260
+ } while (wideCounters > 3);
261
+ return -1;
262
+ }
263
+
264
+ char Code39Reader::patternToChar(int pattern){
265
+ for (int i = 0; i < CHARACTER_ENCODINGS_LEN; i++) {
266
+ if (CHARACTER_ENCODINGS[i] == pattern) {
267
+ return ALPHABET[i];
268
+ }
269
+ }
270
+ throw ReaderException("");
271
+ }
272
+
273
+ Ref<String> Code39Reader::decodeExtended(std::string encoded){
274
+ int length = encoded.length();
275
+ std::string tmpDecoded;
276
+ for (int i = 0; i < length; i++) {
277
+ char c = encoded[i];
278
+ if (c == '+' || c == '$' || c == '%' || c == '/') {
279
+ char next = encoded[i + 1];
280
+ char decodedChar = '\0';
281
+ switch (c) {
282
+ case '+':
283
+ // +A to +Z map to a to z
284
+ if (next >= 'A' && next <= 'Z') {
285
+ decodedChar = (char) (next + 32);
286
+ } else {
287
+ throw ReaderException("");
288
+ }
289
+ break;
290
+ case '$':
291
+ // $A to $Z map to control codes SH to SB
292
+ if (next >= 'A' && next <= 'Z') {
293
+ decodedChar = (char) (next - 64);
294
+ } else {
295
+ throw ReaderException("");
296
+ }
297
+ break;
298
+ case '%':
299
+ // %A to %E map to control codes ESC to US
300
+ if (next >= 'A' && next <= 'E') {
301
+ decodedChar = (char) (next - 38);
302
+ } else if (next >= 'F' && next <= 'W') {
303
+ decodedChar = (char) (next - 11);
304
+ } else {
305
+ throw ReaderException("");
306
+ }
307
+ break;
308
+ case '/':
309
+ // /A to /O map to ! to , and /Z maps to :
310
+ if (next >= 'A' && next <= 'O') {
311
+ decodedChar = (char) (next - 32);
312
+ } else if (next == 'Z') {
313
+ decodedChar = ':';
314
+ } else {
315
+ throw ReaderException("");
316
+ }
317
+ break;
318
+ }
319
+ tmpDecoded.append(1, decodedChar);
320
+ // bump up i again since we read two characters
321
+ i++;
322
+ } else {
323
+ tmpDecoded.append(1, c);
324
+ }
325
+ }
326
+ Ref<String> decoded(new String(tmpDecoded));
327
+ return decoded;
328
+ }
@@ -0,0 +1,63 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ #ifndef __CODE_39_READER_H__
3
+ #define __CODE_39_READER_H__
4
+ /*
5
+ * Code39Reader.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 39 barcodes. This does not support "Full ASCII Code 39" yet.</p>
32
+ * Ported form Java (author Sean Owen)
33
+ * @author Lukasz Warchol
34
+ */
35
+ class Code39Reader : public OneDReader {
36
+ private:
37
+ bool usingCheckDigit;
38
+ bool extendedMode;
39
+ std::string decodeRowResult;
40
+ std::vector<int> counters;
41
+
42
+ void init(bool usingCheckDigit = false, bool extendedMode = false);
43
+
44
+ static std::vector<int> findAsteriskPattern(Ref<BitArray> row,
45
+ std::vector<int>& counters);
46
+ static int toNarrowWidePattern(std::vector<int>& counters);
47
+ static char patternToChar(int pattern);
48
+ static Ref<String> decodeExtended(std::string encoded);
49
+
50
+ void append(char* s, char c);
51
+
52
+ public:
53
+ Code39Reader();
54
+ Code39Reader(bool usingCheckDigit_);
55
+ Code39Reader(bool usingCheckDigit_, bool extendedMode_);
56
+
57
+ Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
58
+ };
59
+
60
+ }
61
+ }
62
+
63
+ #endif
@@ -0,0 +1,293 @@
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 "Code93Reader.h"
19
+ #include <zxing/oned/OneDResultPoint.h>
20
+ #include <zxing/common/Array.h>
21
+ #include <zxing/ReaderException.h>
22
+ #include <zxing/FormatException.h>
23
+ #include <zxing/NotFoundException.h>
24
+ #include <zxing/ChecksumException.h>
25
+ #include <math.h>
26
+ #include <limits.h>
27
+
28
+ using std::vector;
29
+ using std::string;
30
+ using zxing::Ref;
31
+ using zxing::Result;
32
+ using zxing::String;
33
+ using zxing::NotFoundException;
34
+ using zxing::ChecksumException;
35
+ using zxing::oned::Code93Reader;
36
+
37
+ // VC++
38
+ using zxing::BitArray;
39
+
40
+ namespace {
41
+ char const ALPHABET[] =
42
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*";
43
+ string ALPHABET_STRING (ALPHABET);
44
+
45
+ /**
46
+ * These represent the encodings of characters, as patterns of wide and narrow bars.
47
+ * The 9 least-significant bits of each int correspond to the pattern of wide and narrow.
48
+ */
49
+ int const CHARACTER_ENCODINGS[] = {
50
+ 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9
51
+ 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J
52
+ 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T
53
+ 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z
54
+ 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - %
55
+ 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-*
56
+ };
57
+ int const CHARACTER_ENCODINGS_LENGTH =
58
+ (int)sizeof(CHARACTER_ENCODINGS)/sizeof(CHARACTER_ENCODINGS[0]);
59
+ const int ASTERISK_ENCODING = CHARACTER_ENCODINGS[47];
60
+ }
61
+
62
+ Code93Reader::Code93Reader() {
63
+ decodeRowResult.reserve(20);
64
+ counters.resize(6);
65
+ }
66
+
67
+ Ref<Result> Code93Reader::decodeRow(int rowNumber, Ref<BitArray> row) {
68
+ Range start (findAsteriskPattern(row));
69
+ // Read off white space
70
+ int nextStart = row->getNextSet(start[1]);
71
+ int end = row->getSize();
72
+
73
+ vector<int>& theCounters (counters);
74
+ { // Arrays.fill(counters, 0);
75
+ int size = theCounters.size();
76
+ theCounters.resize(0);
77
+ theCounters.resize(size); }
78
+ string& result (decodeRowResult);
79
+ result.clear();
80
+
81
+ char decodedChar;
82
+ int lastStart;
83
+ do {
84
+ recordPattern(row, nextStart, theCounters);
85
+ int pattern = toPattern(theCounters);
86
+ if (pattern < 0) {
87
+ throw NotFoundException();
88
+ }
89
+ decodedChar = patternToChar(pattern);
90
+ result.append(1, decodedChar);
91
+ lastStart = nextStart;
92
+ for(int i=0, e=theCounters.size(); i < e; ++i) {
93
+ nextStart += theCounters[i];
94
+ }
95
+ // Read off white space
96
+ nextStart = row->getNextSet(nextStart);
97
+ } while (decodedChar != '*');
98
+ result.resize(result.length() - 1); // remove asterisk
99
+
100
+ // Look for whitespace after pattern:
101
+ int lastPatternSize = 0;
102
+ for (int i = 0, e = theCounters.size(); i < e; i++) {
103
+ lastPatternSize += theCounters[i];
104
+ }
105
+
106
+ // Should be at least one more black module
107
+ if (nextStart == end || !row->get(nextStart)) {
108
+ throw NotFoundException();
109
+ }
110
+
111
+ if (result.length() < 2) {
112
+ // false positive -- need at least 2 checksum digits
113
+ throw NotFoundException();
114
+ }
115
+
116
+ checkChecksums(result);
117
+ // Remove checksum digits
118
+ result.resize(result.length() - 2);
119
+
120
+ Ref<String> resultString = decodeExtended(result);
121
+
122
+ float left = (float) (start[1] + start[0]) / 2.0f;
123
+ float right = lastStart + lastPatternSize / 2.0f;
124
+
125
+ ArrayRef< Ref<ResultPoint> > resultPoints (2);
126
+ resultPoints[0] =
127
+ Ref<OneDResultPoint>(new OneDResultPoint(left, (float) rowNumber));
128
+ resultPoints[1] =
129
+ Ref<OneDResultPoint>(new OneDResultPoint(right, (float) rowNumber));
130
+
131
+ return Ref<Result>(new Result(
132
+ resultString,
133
+ ArrayRef<char>(),
134
+ resultPoints,
135
+ BarcodeFormat::CODE_93));
136
+ }
137
+
138
+ Code93Reader::Range Code93Reader::findAsteriskPattern(Ref<BitArray> row) {
139
+ int width = row->getSize();
140
+ int rowOffset = row->getNextSet(0);
141
+
142
+ { // Arrays.fill(counters, 0);
143
+ int size = counters.size();
144
+ counters.resize(0);
145
+ counters.resize(size); }
146
+ vector<int>& theCounters (counters);
147
+
148
+ int patternStart = rowOffset;
149
+ bool isWhite = false;
150
+ int patternLength = theCounters.size();
151
+
152
+ int counterPosition = 0;
153
+ for (int i = rowOffset; i < width; i++) {
154
+ if (row->get(i) ^ isWhite) {
155
+ theCounters[counterPosition]++;
156
+ } else {
157
+ if (counterPosition == patternLength - 1) {
158
+ if (toPattern(theCounters) == ASTERISK_ENCODING) {
159
+ return Range(patternStart, i);
160
+ }
161
+ patternStart += theCounters[0] + theCounters[1];
162
+ for (int y = 2; y < patternLength; y++) {
163
+ theCounters[y - 2] = theCounters[y];
164
+ }
165
+ theCounters[patternLength - 2] = 0;
166
+ theCounters[patternLength - 1] = 0;
167
+ counterPosition--;
168
+ } else {
169
+ counterPosition++;
170
+ }
171
+ theCounters[counterPosition] = 1;
172
+ isWhite = !isWhite;
173
+ }
174
+ }
175
+ throw NotFoundException();
176
+ }
177
+
178
+ int Code93Reader::toPattern(vector<int>& counters) {
179
+ int max = counters.size();
180
+ int sum = 0;
181
+ for(int i=0, e=counters.size(); i<e; ++i) {
182
+ sum += counters[i];
183
+ }
184
+ int pattern = 0;
185
+ for (int i = 0; i < max; i++) {
186
+ int scaledShifted = (counters[i] << INTEGER_MATH_SHIFT) * 9 / sum;
187
+ int scaledUnshifted = scaledShifted >> INTEGER_MATH_SHIFT;
188
+ if ((scaledShifted & 0xFF) > 0x7F) {
189
+ scaledUnshifted++;
190
+ }
191
+ if (scaledUnshifted < 1 || scaledUnshifted > 4) {
192
+ return -1;
193
+ }
194
+ if ((i & 0x01) == 0) {
195
+ for (int j = 0; j < scaledUnshifted; j++) {
196
+ pattern = (pattern << 1) | 0x01;
197
+ }
198
+ } else {
199
+ pattern <<= scaledUnshifted;
200
+ }
201
+ }
202
+ return pattern;
203
+ }
204
+
205
+ char Code93Reader::patternToChar(int pattern) {
206
+ for (int i = 0; i < CHARACTER_ENCODINGS_LENGTH; i++) {
207
+ if (CHARACTER_ENCODINGS[i] == pattern) {
208
+ return ALPHABET[i];
209
+ }
210
+ }
211
+ throw NotFoundException();
212
+ }
213
+
214
+ Ref<String> Code93Reader::decodeExtended(string const& encoded) {
215
+ int length = encoded.length();
216
+ string decoded;
217
+ for (int i = 0; i < length; i++) {
218
+ char c = encoded[i];
219
+ if (c >= 'a' && c <= 'd') {
220
+ if (i >= length - 1) {
221
+ throw FormatException::getFormatInstance();
222
+ }
223
+ char next = encoded[i + 1];
224
+ char decodedChar = '\0';
225
+ switch (c) {
226
+ case 'd':
227
+ // +A to +Z map to a to z
228
+ if (next >= 'A' && next <= 'Z') {
229
+ decodedChar = (char) (next + 32);
230
+ } else {
231
+ throw FormatException::getFormatInstance();
232
+ }
233
+ break;
234
+ case 'a':
235
+ // $A to $Z map to control codes SH to SB
236
+ if (next >= 'A' && next <= 'Z') {
237
+ decodedChar = (char) (next - 64);
238
+ } else {
239
+ throw FormatException::getFormatInstance();
240
+ }
241
+ break;
242
+ case 'b':
243
+ // %A to %E map to control codes ESC to US
244
+ if (next >= 'A' && next <= 'E') {
245
+ decodedChar = (char) (next - 38);
246
+ } else if (next >= 'F' && next <= 'W') {
247
+ decodedChar = (char) (next - 11);
248
+ } else {
249
+ throw FormatException::getFormatInstance();
250
+ }
251
+ break;
252
+ case 'c':
253
+ // /A to /O map to ! to , and /Z maps to :
254
+ if (next >= 'A' && next <= 'O') {
255
+ decodedChar = (char) (next - 32);
256
+ } else if (next == 'Z') {
257
+ decodedChar = ':';
258
+ } else {
259
+ throw FormatException::getFormatInstance();
260
+ }
261
+ break;
262
+ }
263
+ decoded.append(1, decodedChar);
264
+ // bump up i again since we read two characters
265
+ i++;
266
+ } else {
267
+ decoded.append(1, c);
268
+ }
269
+ }
270
+ return Ref<String>(new String(decoded));
271
+ }
272
+
273
+ void Code93Reader::checkChecksums(string const& result) {
274
+ int length = result.length();
275
+ checkOneChecksum(result, length - 2, 20);
276
+ checkOneChecksum(result, length - 1, 15);
277
+ }
278
+
279
+ void Code93Reader::checkOneChecksum(string const& result,
280
+ int checkPosition,
281
+ int weightMax) {
282
+ int weight = 1;
283
+ int total = 0;
284
+ for (int i = checkPosition - 1; i >= 0; i--) {
285
+ total += weight * ALPHABET_STRING.find_first_of(result[i]);
286
+ if (++weight > weightMax) {
287
+ weight = 1;
288
+ }
289
+ }
290
+ if (result[checkPosition] != ALPHABET[total % 47]) {
291
+ throw ChecksumException();
292
+ }
293
+ }