zxing_cpp_no_cmake 0.1.1

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 (377) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.gitmodules +0 -0
  4. data/CHANGELOG.rdoc +6 -0
  5. data/Gemfile +3 -0
  6. data/Manifest.txt +375 -0
  7. data/README.rdoc +141 -0
  8. data/Rakefile +28 -0
  9. data/bin/zxd +87 -0
  10. data/bin/zxe +53 -0
  11. data/ext/zxing/extconf.rb +20 -0
  12. data/ext/zxing/zxing-cpp/.gitignore +2 -0
  13. data/ext/zxing/zxing-cpp/AUTHORS +115 -0
  14. data/ext/zxing/zxing-cpp/CMakeLists.txt +89 -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 +45 -0
  18. data/ext/zxing/zxing-cpp/build/CMakeCache.txt +382 -0
  19. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CMakeCCompiler.cmake +76 -0
  20. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CMakeCXXCompiler.cmake +79 -0
  21. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CMakeDetermineCompilerABI_C.bin +0 -0
  22. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CMakeDetermineCompilerABI_CXX.bin +0 -0
  23. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CMakeSystem.cmake +15 -0
  24. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CompilerIdC/CMakeCCompilerId.c +665 -0
  25. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CompilerIdC/a.out +0 -0
  26. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CompilerIdCXX/CMakeCXXCompilerId.cpp +644 -0
  27. data/ext/zxing/zxing-cpp/build/CMakeFiles/3.15.4/CompilerIdCXX/a.out +0 -0
  28. data/ext/zxing/zxing-cpp/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  29. data/ext/zxing/zxing-cpp/build/CMakeFiles/CMakeOutput.log +447 -0
  30. data/ext/zxing/zxing-cpp/build/CMakeFiles/Makefile.cmake +125 -0
  31. data/ext/zxing/zxing-cpp/build/CMakeFiles/Makefile2 +177 -0
  32. data/ext/zxing/zxing-cpp/build/CMakeFiles/TargetDirectories.txt +9 -0
  33. data/ext/zxing/zxing-cpp/build/CMakeFiles/cmake.check_cache +1 -0
  34. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/CXX.includecache +1892 -0
  35. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/DependInfo.cmake +120 -0
  36. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/build.make +1584 -0
  37. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/cmake_clean.cmake +109 -0
  38. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/cmake_clean_target.cmake +3 -0
  39. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/depend.internal +1465 -0
  40. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/depend.make +1465 -0
  41. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/flags.make +10 -0
  42. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/link.txt +2 -0
  43. data/ext/zxing/zxing-cpp/build/CMakeFiles/libzxing.dir/progress.make +102 -0
  44. data/ext/zxing/zxing-cpp/build/CMakeFiles/progress.marks +1 -0
  45. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/CXX.includecache +344 -0
  46. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/DependInfo.cmake +33 -0
  47. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/build.make +266 -0
  48. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/cmake_clean.cmake +21 -0
  49. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/depend.internal +103 -0
  50. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/depend.make +103 -0
  51. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/flags.make +10 -0
  52. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/link.txt +1 -0
  53. data/ext/zxing/zxing-cpp/build/CMakeFiles/testrunner.dir/progress.make +14 -0
  54. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/CXX.includecache +378 -0
  55. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/DependInfo.cmake +25 -0
  56. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/build.make +145 -0
  57. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/cmake_clean.cmake +13 -0
  58. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/depend.internal +53 -0
  59. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/depend.make +53 -0
  60. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/flags.make +10 -0
  61. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/link.txt +1 -0
  62. data/ext/zxing/zxing-cpp/build/CMakeFiles/zxing.dir/progress.make +6 -0
  63. data/ext/zxing/zxing-cpp/build/Makefile +3706 -0
  64. data/ext/zxing/zxing-cpp/build/cmake_install.cmake +73 -0
  65. data/ext/zxing/zxing-cpp/build/libzxing.a +0 -0
  66. data/ext/zxing/zxing-cpp/build/testrunner +0 -0
  67. data/ext/zxing/zxing-cpp/build/zxing +0 -0
  68. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.cpp +113 -0
  69. data/ext/zxing/zxing-cpp/cli/src/ImageReaderSource.h +40 -0
  70. data/ext/zxing/zxing-cpp/cli/src/jpgd.cpp +3174 -0
  71. data/ext/zxing/zxing-cpp/cli/src/jpgd.h +319 -0
  72. data/ext/zxing/zxing-cpp/cli/src/lodepng.cpp +6261 -0
  73. data/ext/zxing/zxing-cpp/cli/src/lodepng.h +1695 -0
  74. data/ext/zxing/zxing-cpp/cli/src/main.cpp +297 -0
  75. data/ext/zxing/zxing-cpp/cmake/FindCPPUNIT.cmake +54 -0
  76. data/ext/zxing/zxing-cpp/cmake/FindIconv.cmake +57 -0
  77. data/ext/zxing/zxing-cpp/core/src/bigint/.gitignore +6 -0
  78. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.cc +405 -0
  79. data/ext/zxing/zxing-cpp/core/src/bigint/BigInteger.hh +215 -0
  80. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.cc +70 -0
  81. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerAlgorithms.hh +25 -0
  82. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerLibrary.hh +8 -0
  83. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.cc +50 -0
  84. data/ext/zxing/zxing-cpp/core/src/bigint/BigIntegerUtils.hh +72 -0
  85. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.cc +697 -0
  86. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsigned.hh +418 -0
  87. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.cc +125 -0
  88. data/ext/zxing/zxing-cpp/core/src/bigint/BigUnsignedInABase.hh +122 -0
  89. data/ext/zxing/zxing-cpp/core/src/bigint/ChangeLog +146 -0
  90. data/ext/zxing/zxing-cpp/core/src/bigint/Makefile +73 -0
  91. data/ext/zxing/zxing-cpp/core/src/bigint/NumberlikeArray.hh +177 -0
  92. data/ext/zxing/zxing-cpp/core/src/bigint/README +71 -0
  93. data/ext/zxing/zxing-cpp/core/src/win32/zxing/iconv.h +14 -0
  94. data/ext/zxing/zxing-cpp/core/src/win32/zxing/stdint.h +247 -0
  95. data/ext/zxing/zxing-cpp/core/src/win32/zxing/win_iconv.c +2035 -0
  96. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.cpp +40 -0
  97. data/ext/zxing/zxing-cpp/core/src/zxing/BarcodeFormat.h +60 -0
  98. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.cpp +45 -0
  99. data/ext/zxing/zxing-cpp/core/src/zxing/Binarizer.h +50 -0
  100. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.cpp +70 -0
  101. data/ext/zxing/zxing-cpp/core/src/zxing/BinaryBitmap.h +56 -0
  102. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.cpp +28 -0
  103. data/ext/zxing/zxing-cpp/core/src/zxing/ChecksumException.h +34 -0
  104. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.cpp +142 -0
  105. data/ext/zxing/zxing-cpp/core/src/zxing/DecodeHints.h +85 -0
  106. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.cpp +43 -0
  107. data/ext/zxing/zxing-cpp/core/src/zxing/Exception.h +51 -0
  108. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.cpp +41 -0
  109. data/ext/zxing/zxing-cpp/core/src/zxing/FormatException.h +37 -0
  110. data/ext/zxing/zxing-cpp/core/src/zxing/IllegalStateException.h +35 -0
  111. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.cpp +68 -0
  112. data/ext/zxing/zxing-cpp/core/src/zxing/InvertedLuminanceSource.h +48 -0
  113. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.cpp +86 -0
  114. data/ext/zxing/zxing-cpp/core/src/zxing/LuminanceSource.h +59 -0
  115. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.cpp +124 -0
  116. data/ext/zxing/zxing-cpp/core/src/zxing/MultiFormatReader.h +48 -0
  117. data/ext/zxing/zxing-cpp/core/src/zxing/NotFoundException.h +35 -0
  118. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.cpp +31 -0
  119. data/ext/zxing/zxing-cpp/core/src/zxing/Reader.h +40 -0
  120. data/ext/zxing/zxing-cpp/core/src/zxing/ReaderException.h +37 -0
  121. data/ext/zxing/zxing-cpp/core/src/zxing/Result.cpp +61 -0
  122. data/ext/zxing/zxing-cpp/core/src/zxing/Result.h +55 -0
  123. data/ext/zxing/zxing-cpp/core/src/zxing/ResultIO.cpp +34 -0
  124. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.cpp +108 -0
  125. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPoint.h +55 -0
  126. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.cpp +26 -0
  127. data/ext/zxing/zxing-cpp/core/src/zxing/ResultPointCallback.h +39 -0
  128. data/ext/zxing/zxing-cpp/core/src/zxing/ZXing.h +133 -0
  129. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.cpp +54 -0
  130. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecDetectorResult.h +48 -0
  131. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.cpp +68 -0
  132. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/AztecReader.h +49 -0
  133. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.cpp +489 -0
  134. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/decoder/Decoder.h +69 -0
  135. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.cpp +548 -0
  136. data/ext/zxing/zxing-cpp/core/src/zxing/aztec/detector/Detector.h +92 -0
  137. data/ext/zxing/zxing-cpp/core/src/zxing/common/Array.h +170 -0
  138. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.cpp +155 -0
  139. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArray.h +81 -0
  140. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitArrayIO.cpp +31 -0
  141. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.cpp +143 -0
  142. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitMatrix.h +91 -0
  143. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.cpp +76 -0
  144. data/ext/zxing/zxing-cpp/core/src/zxing/common/BitSource.h +74 -0
  145. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.cpp +105 -0
  146. data/ext/zxing/zxing-cpp/core/src/zxing/common/CharacterSetECI.h +53 -0
  147. data/ext/zxing/zxing-cpp/core/src/zxing/common/Counted.h +140 -0
  148. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.cpp +46 -0
  149. data/ext/zxing/zxing-cpp/core/src/zxing/common/DecoderResult.h +51 -0
  150. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.cpp +39 -0
  151. data/ext/zxing/zxing-cpp/core/src/zxing/common/DetectorResult.h +43 -0
  152. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.cpp +212 -0
  153. data/ext/zxing/zxing-cpp/core/src/zxing/common/GlobalHistogramBinarizer.h +48 -0
  154. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.cpp +80 -0
  155. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleLuminanceSource.h +53 -0
  156. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +81 -0
  157. data/ext/zxing/zxing-cpp/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +46 -0
  158. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.cpp +122 -0
  159. data/ext/zxing/zxing-cpp/core/src/zxing/common/GridSampler.h +45 -0
  160. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.cpp +226 -0
  161. data/ext/zxing/zxing-cpp/core/src/zxing/common/HybridBinarizer.h +67 -0
  162. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.cpp +27 -0
  163. data/ext/zxing/zxing-cpp/core/src/zxing/common/IllegalArgumentException.h +36 -0
  164. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.cpp +107 -0
  165. data/ext/zxing/zxing-cpp/core/src/zxing/common/PerspectiveTransform.h +49 -0
  166. data/ext/zxing/zxing-cpp/core/src/zxing/common/Point.h +47 -0
  167. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.cpp +61 -0
  168. data/ext/zxing/zxing-cpp/core/src/zxing/common/Str.h +51 -0
  169. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.cpp +198 -0
  170. data/ext/zxing/zxing-cpp/core/src/zxing/common/StringUtils.h +52 -0
  171. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/JavaMath.h +43 -0
  172. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MathUtils.h +57 -0
  173. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.cpp +175 -0
  174. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/MonochromeRectangleDetector.h +62 -0
  175. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.cpp +330 -0
  176. data/ext/zxing/zxing-cpp/core/src/zxing/common/detector/WhiteRectangleDetector.h +59 -0
  177. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.cpp +150 -0
  178. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGF.h +73 -0
  179. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.cpp +218 -0
  180. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/GenericGFPoly.h +56 -0
  181. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +174 -0
  182. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +49 -0
  183. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +30 -0
  184. data/ext/zxing/zxing-cpp/core/src/zxing/common/reedsolomon/ReedSolomonException.h +33 -0
  185. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.cpp +54 -0
  186. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/DataMatrixReader.h +45 -0
  187. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.cpp +199 -0
  188. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/Version.h +87 -0
  189. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +361 -0
  190. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +59 -0
  191. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.cpp +113 -0
  192. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DataBlock.h +49 -0
  193. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +415 -0
  194. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +104 -0
  195. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.cpp +93 -0
  196. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/decoder/Decoder.h +49 -0
  197. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.cpp +46 -0
  198. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/CornerPoint.h +43 -0
  199. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.cpp +447 -0
  200. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/Detector.h +94 -0
  201. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.cpp +23 -0
  202. data/ext/zxing/zxing-cpp/core/src/zxing/datamatrix/detector/DetectorException.h +23 -0
  203. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.cpp +75 -0
  204. data/ext/zxing/zxing-cpp/core/src/zxing/multi/ByQuadrantReader.h +42 -0
  205. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.cpp +137 -0
  206. data/ext/zxing/zxing-cpp/core/src/zxing/multi/GenericMultipleBarcodeReader.h +51 -0
  207. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.cpp +29 -0
  208. data/ext/zxing/zxing-cpp/core/src/zxing/multi/MultipleBarcodeReader.h +41 -0
  209. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.cpp +58 -0
  210. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/QRCodeMultiReader.h +36 -0
  211. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.cpp +47 -0
  212. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiDetector.h +37 -0
  213. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.cpp +236 -0
  214. data/ext/zxing/zxing-cpp/core/src/zxing/multi/qrcode/detector/MultiFinderPatternFinder.h +47 -0
  215. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.cpp +340 -0
  216. data/ext/zxing/zxing-cpp/core/src/zxing/oned/CodaBarReader.h +57 -0
  217. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.cpp +497 -0
  218. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code128Reader.h +48 -0
  219. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.cpp +329 -0
  220. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code39Reader.h +63 -0
  221. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.cpp +303 -0
  222. data/ext/zxing/zxing-cpp/core/src/zxing/oned/Code93Reader.h +58 -0
  223. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.cpp +85 -0
  224. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN13Reader.h +49 -0
  225. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.cpp +65 -0
  226. data/ext/zxing/zxing-cpp/core/src/zxing/oned/EAN8Reader.h +47 -0
  227. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.cpp +337 -0
  228. data/ext/zxing/zxing-cpp/core/src/zxing/oned/ITFReader.h +54 -0
  229. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp +96 -0
  230. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatOneDReader.h +38 -0
  231. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +110 -0
  232. data/ext/zxing/zxing-cpp/core/src/zxing/oned/MultiFormatUPCEANReader.h +41 -0
  233. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.cpp +228 -0
  234. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDReader.h +81 -0
  235. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.cpp +28 -0
  236. data/ext/zxing/zxing-cpp/core/src/zxing/oned/OneDResultPoint.h +35 -0
  237. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.cpp +70 -0
  238. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCAReader.h +50 -0
  239. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.cpp +309 -0
  240. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEANReader.h +88 -0
  241. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.cpp +146 -0
  242. data/ext/zxing/zxing-cpp/core/src/zxing/oned/UPCEReader.h +47 -0
  243. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.cpp +170 -0
  244. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/PDF417Reader.h +49 -0
  245. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.cpp +997 -0
  246. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/BitMatrixParser.h +84 -0
  247. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.cpp +563 -0
  248. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/DecodedBitStreamParser.h +84 -0
  249. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.cpp +118 -0
  250. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/Decoder.h +62 -0
  251. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.cpp +214 -0
  252. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ErrorCorrection.h +71 -0
  253. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.cpp +120 -0
  254. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusGF.h +72 -0
  255. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.cpp +284 -0
  256. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/decoder/ec/ModulusPoly.h +68 -0
  257. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.cpp +665 -0
  258. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/Detector.h +106 -0
  259. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.cpp +715 -0
  260. data/ext/zxing/zxing-cpp/core/src/zxing/pdf417/detector/LinesSampler.h +122 -0
  261. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +65 -0
  262. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/ErrorCorrectionLevel.h +52 -0
  263. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.cpp +117 -0
  264. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/FormatInformation.h +54 -0
  265. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.cpp +52 -0
  266. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/QRCodeReader.h +48 -0
  267. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.cpp +560 -0
  268. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/Version.h +85 -0
  269. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +183 -0
  270. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/BitMatrixParser.h +56 -0
  271. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.cpp +118 -0
  272. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataBlock.h +50 -0
  273. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.cpp +159 -0
  274. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DataMask.h +50 -0
  275. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +428 -0
  276. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +72 -0
  277. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.cpp +107 -0
  278. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Decoder.h +46 -0
  279. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.cpp +90 -0
  280. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/decoder/Mode.h +57 -0
  281. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +47 -0
  282. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPattern.h +45 -0
  283. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +208 -0
  284. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +68 -0
  285. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.cpp +315 -0
  286. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/Detector.h +69 -0
  287. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.cpp +69 -0
  288. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPattern.h +48 -0
  289. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +559 -0
  290. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternFinder.h +76 -0
  291. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +41 -0
  292. data/ext/zxing/zxing-cpp/core/src/zxing/qrcode/detector/FinderPatternInfo.h +47 -0
  293. data/ext/zxing/zxing-cpp/core/tests/src/TestRunner.cpp +30 -0
  294. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.cpp +216 -0
  295. data/ext/zxing/zxing-cpp/core/tests/src/common/BitArrayTest.h +61 -0
  296. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.cpp +106 -0
  297. data/ext/zxing/zxing-cpp/core/tests/src/common/BitMatrixTest.h +55 -0
  298. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.cpp +49 -0
  299. data/ext/zxing/zxing-cpp/core/tests/src/common/BitSourceTest.h +42 -0
  300. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.cpp +58 -0
  301. data/ext/zxing/zxing-cpp/core/tests/src/common/CountedTest.h +46 -0
  302. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.cpp +69 -0
  303. data/ext/zxing/zxing-cpp/core/tests/src/common/PerspectiveTransformTest.h +47 -0
  304. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +129 -0
  305. data/ext/zxing/zxing-cpp/core/tests/src/common/reedsolomon/ReedSolomonTest.h +62 -0
  306. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +47 -0
  307. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +45 -0
  308. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.cpp +88 -0
  309. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/FormatInformationTest.h +47 -0
  310. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.cpp +88 -0
  311. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/VersionTest.h +49 -0
  312. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.cpp +132 -0
  313. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/DataMaskTest.h +91 -0
  314. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.cpp +52 -0
  315. data/ext/zxing/zxing-cpp/core/tests/src/qrcode/decoder/ModeTest.h +47 -0
  316. data/ext/zxing/zxing.cc +224 -0
  317. data/lib/zxing.rb +50 -0
  318. data/lib/zxing/.gitignore +2 -0
  319. data/lib/zxing/aztec.rb +5 -0
  320. data/lib/zxing/aztec/aztec_reader.rb +14 -0
  321. data/lib/zxing/bad_image_exception.rb +4 -0
  322. data/lib/zxing/binarizer.rb +8 -0
  323. data/lib/zxing/binary_bitmap.rb +15 -0
  324. data/lib/zxing/checksum_exception.rb +4 -0
  325. data/lib/zxing/common.rb +7 -0
  326. data/lib/zxing/common/bit_matrix.rb +9 -0
  327. data/lib/zxing/common/hybrid_binarizer.rb +17 -0
  328. data/lib/zxing/common/illegal_argument_exception.rb +4 -0
  329. data/lib/zxing/datamatrix.rb +5 -0
  330. data/lib/zxing/datamatrix/data_matrix_reader.rb +14 -0
  331. data/lib/zxing/decodable.rb +11 -0
  332. data/lib/zxing/exception.rb +4 -0
  333. data/lib/zxing/ffi.rb +20 -0
  334. data/lib/zxing/ffi/aztec.rb +6 -0
  335. data/lib/zxing/ffi/aztec/aztec_reader.rb +9 -0
  336. data/lib/zxing/ffi/binarizer.rb +25 -0
  337. data/lib/zxing/ffi/binary_bitmap.rb +15 -0
  338. data/lib/zxing/ffi/common.rb +8 -0
  339. data/lib/zxing/ffi/common/bit_matrix.rb +12 -0
  340. data/lib/zxing/ffi/common/greyscale_luminance_source.rb +30 -0
  341. data/lib/zxing/ffi/common/hybrid_binarizer.rb +10 -0
  342. data/lib/zxing/ffi/datamatrix.rb +6 -0
  343. data/lib/zxing/ffi/datamatrix/data_matrix_reader.rb +9 -0
  344. data/lib/zxing/ffi/library.rb +102 -0
  345. data/lib/zxing/ffi/luminance_source.rb +18 -0
  346. data/lib/zxing/ffi/multi_format_reader.rb +9 -0
  347. data/lib/zxing/ffi/oned.rb +6 -0
  348. data/lib/zxing/ffi/oned/code_39_reader.rb +10 -0
  349. data/lib/zxing/ffi/qrcode.rb +8 -0
  350. data/lib/zxing/ffi/qrcode/decoder.rb +10 -0
  351. data/lib/zxing/ffi/qrcode/detector.rb +10 -0
  352. data/lib/zxing/ffi/reader.rb +58 -0
  353. data/lib/zxing/ffi/result.rb +23 -0
  354. data/lib/zxing/format_exception.rb +4 -0
  355. data/lib/zxing/illegal_argument_exception.rb +4 -0
  356. data/lib/zxing/image.rb +15 -0
  357. data/lib/zxing/luminance_source.rb +18 -0
  358. data/lib/zxing/multi_format_reader.rb +11 -0
  359. data/lib/zxing/not_found_exception.rb +4 -0
  360. data/lib/zxing/oned.rb +5 -0
  361. data/lib/zxing/oned/code_39_reader.rb +15 -0
  362. data/lib/zxing/qrcode.rb +8 -0
  363. data/lib/zxing/qrcode/decoder.rb +14 -0
  364. data/lib/zxing/qrcode/detector.rb +14 -0
  365. data/lib/zxing/qrcode/encoder.rb +8 -0
  366. data/lib/zxing/qrcode/encoder/byte_matrix.rb +18 -0
  367. data/lib/zxing/qrcode/encoder/encoder.rb +9 -0
  368. data/lib/zxing/qrcode/encoder/qrcode.rb +18 -0
  369. data/lib/zxing/reader.rb +8 -0
  370. data/lib/zxing/reader_exception.rb +4 -0
  371. data/lib/zxing/reed_solomon_exception.rb +2 -0
  372. data/lib/zxing/result.rb +18 -0
  373. data/lib/zxing/rmagick.rb +5 -0
  374. data/lib/zxing/rmagick/image.rb +109 -0
  375. data/lib/zxing/version.rb +33 -0
  376. data/zxing_cpp.gemspec +36 -0
  377. metadata +515 -0
@@ -0,0 +1,106 @@
1
+ #ifndef __DETECTOR_H__
2
+ #define __DETECTOR_H__
3
+
4
+ /*
5
+ * Detector.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/common/Point.h>
24
+ #include <zxing/common/DetectorResult.h>
25
+ #include <zxing/NotFoundException.h>
26
+ #include <zxing/BinaryBitmap.h>
27
+ #include <zxing/DecodeHints.h>
28
+
29
+ namespace zxing {
30
+ namespace pdf417 {
31
+ namespace detector {
32
+
33
+ class Detector {
34
+ private:
35
+ static const int INTEGER_MATH_SHIFT = 8;
36
+ static const int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT;
37
+ static const int MAX_AVG_VARIANCE;
38
+ static const int MAX_INDIVIDUAL_VARIANCE;
39
+
40
+ static const int START_PATTERN[];
41
+ static const int START_PATTERN_LENGTH;
42
+ static const int START_PATTERN_REVERSE[];
43
+ static const int START_PATTERN_REVERSE_LENGTH;
44
+ static const int STOP_PATTERN[];
45
+ static const int STOP_PATTERN_LENGTH;
46
+ static const int STOP_PATTERN_REVERSE[];
47
+ static const int STOP_PATTERN_REVERSE_LENGTH;
48
+
49
+ Ref<BinaryBitmap> image_;
50
+
51
+ static ArrayRef< Ref<ResultPoint> > findVertices(Ref<BitMatrix> matrix, int rowStep);
52
+ static ArrayRef< Ref<ResultPoint> > findVertices180(Ref<BitMatrix> matrix, int rowStep);
53
+
54
+ static ArrayRef<int> findGuardPattern(Ref<BitMatrix> matrix,
55
+ int column,
56
+ int row,
57
+ int width,
58
+ bool whiteFirst,
59
+ const int pattern[],
60
+ int patternSize,
61
+ ArrayRef<int>& counters);
62
+ static int patternMatchVariance(ArrayRef<int>& counters, const int pattern[],
63
+ int maxIndividualVariance);
64
+
65
+ static void correctVertices(Ref<BitMatrix> matrix,
66
+ ArrayRef< Ref<ResultPoint> >& vertices,
67
+ bool upsideDown);
68
+ static void findWideBarTopBottom(Ref<BitMatrix> matrix,
69
+ ArrayRef< Ref<ResultPoint> >& vertices,
70
+ int offsetVertice,
71
+ int startWideBar,
72
+ int lenWideBar,
73
+ int lenPattern,
74
+ int nIncrement);
75
+ static void findCrossingPoint(ArrayRef< Ref<ResultPoint> >& vertices,
76
+ int idxResult,
77
+ int idxLineA1,int idxLineA2,
78
+ int idxLineB1,int idxLineB2,
79
+ Ref<BitMatrix>& matrix);
80
+ static Point intersection(Line a, Line b);
81
+ static float computeModuleWidth(ArrayRef< Ref<ResultPoint> >& vertices);
82
+ static int computeDimension(Ref<ResultPoint> const& topLeft,
83
+ Ref<ResultPoint> const& topRight,
84
+ Ref<ResultPoint> const& bottomLeft,
85
+ Ref<ResultPoint> const& bottomRight,
86
+ float moduleWidth);
87
+ int computeYDimension(Ref<ResultPoint> const& topLeft,
88
+ Ref<ResultPoint> const& topRight,
89
+ Ref<ResultPoint> const& bottomLeft,
90
+ Ref<ResultPoint> const& bottomRight,
91
+ float moduleWidth);
92
+
93
+ Ref<BitMatrix> sampleLines(ArrayRef< Ref<ResultPoint> > const& vertices, int dimensionY, int dimension);
94
+
95
+ public:
96
+ Detector(Ref<BinaryBitmap> image);
97
+ Ref<BinaryBitmap> getImage();
98
+ Ref<DetectorResult> detect();
99
+ Ref<DetectorResult> detect(DecodeHints const& hints);
100
+ };
101
+
102
+ }
103
+ }
104
+ }
105
+
106
+ #endif // __DETECTOR_H__
@@ -0,0 +1,715 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2010, 2012 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 <map>
19
+ #include <zxing/pdf417/detector/LinesSampler.h>
20
+ #include <zxing/pdf417/decoder/BitMatrixParser.h>
21
+ #include <zxing/NotFoundException.h>
22
+ #include <zxing/common/Point.h>
23
+ #include <algorithm> // vs12, std::min und std:max
24
+ #include <cmath>
25
+
26
+ using std::map;
27
+ using std::vector;
28
+ using std::min;
29
+ using zxing::pdf417::detector::LinesSampler;
30
+ using zxing::pdf417::decoder::BitMatrixParser;
31
+ using zxing::Ref;
32
+ using zxing::BitMatrix;
33
+ using zxing::NotFoundException;
34
+ using zxing::Point;
35
+
36
+ // VC++
37
+ using zxing::Line;
38
+
39
+ const int LinesSampler::MODULES_IN_SYMBOL;
40
+ const int LinesSampler::BARS_IN_SYMBOL;
41
+ const int LinesSampler::POSSIBLE_SYMBOLS;
42
+ const int LinesSampler::BARCODE_START_OFFSET;
43
+
44
+ namespace {
45
+
46
+ class VoteResult {
47
+ private:
48
+ bool indecisive;
49
+ int vote;
50
+ public:
51
+ VoteResult() : indecisive(false), vote(0) {}
52
+ bool isIndecisive() {
53
+ return indecisive;
54
+ }
55
+ void setIndecisive(bool indecisive) {
56
+ this->indecisive = indecisive;
57
+ }
58
+ int getVote() {
59
+ return vote;
60
+ }
61
+ void setVote(int vote) {
62
+ this->vote = vote;
63
+ }
64
+ };
65
+
66
+ VoteResult getValueWithMaxVotes(map<int, int>& votes) {
67
+ VoteResult result;
68
+ int maxVotes = 0;
69
+ for (map<int, int>::iterator i = votes.begin(); i != votes.end(); i++) {
70
+ if (i->second > maxVotes) {
71
+ maxVotes = i->second;
72
+ result.setVote(i->first);
73
+ result.setIndecisive(false);
74
+ } else if (i->second == maxVotes) {
75
+ result.setIndecisive(true);
76
+ }
77
+ }
78
+ return result;
79
+ }
80
+
81
+ }
82
+
83
+ vector<float> LinesSampler::init_ratios_table() {
84
+ // Pre-computes and outputs the symbol ratio table.
85
+ vector<vector<float> > table (BitMatrixParser::SYMBOL_TABLE_LENGTH);
86
+ for(int i=0; i < (int)table.size(); ++i) {
87
+ table[i].resize(LinesSampler::BARS_IN_SYMBOL);
88
+ }
89
+ vector<float> RATIOS_TABLE (BitMatrixParser::SYMBOL_TABLE_LENGTH * LinesSampler::BARS_IN_SYMBOL);
90
+ int x = 0;
91
+ for (int i = 0; i < BitMatrixParser::SYMBOL_TABLE_LENGTH; i++) {
92
+ int currentSymbol = BitMatrixParser::SYMBOL_TABLE[i];
93
+ int currentBit = currentSymbol & 0x1;
94
+ for (int j = 0; j < BARS_IN_SYMBOL; j++) {
95
+ float size = 0.0f;
96
+ while ((currentSymbol & 0x1) == currentBit) {
97
+ size += 1.0f;
98
+ currentSymbol >>= 1;
99
+ }
100
+ currentBit = currentSymbol & 0x1;
101
+ table[i][BARS_IN_SYMBOL - j - 1] = size / MODULES_IN_SYMBOL;
102
+ }
103
+ for (int j = 0; j < BARS_IN_SYMBOL; j++) {
104
+ RATIOS_TABLE[x] = table[i][j];
105
+ x++;
106
+ }
107
+ }
108
+ return RATIOS_TABLE;
109
+ }
110
+
111
+ const vector<float> LinesSampler::RATIOS_TABLE = init_ratios_table();
112
+
113
+ LinesSampler::LinesSampler(Ref<BitMatrix> linesMatrix, int dimension)
114
+ : linesMatrix_(linesMatrix), dimension_(dimension) {}
115
+
116
+ /**
117
+ * Samples a grid from a lines matrix.
118
+ *
119
+ * @return the potentially decodable bit matrix.
120
+ */
121
+ Ref<BitMatrix> LinesSampler::sample() {
122
+ const int symbolsPerLine = dimension_ / MODULES_IN_SYMBOL;
123
+
124
+ // XXX
125
+ vector<float> symbolWidths;
126
+ computeSymbolWidths(symbolWidths, symbolsPerLine, linesMatrix_);
127
+
128
+ // XXX
129
+ vector<vector<int> > codewords(linesMatrix_->getHeight());
130
+ vector<vector<int> > clusterNumbers(linesMatrix_->getHeight());
131
+ linesMatrixToCodewords(clusterNumbers, symbolsPerLine, symbolWidths, linesMatrix_, codewords);
132
+
133
+ // XXX
134
+ vector<vector<map<int, int> > > votes =
135
+ distributeVotes(symbolsPerLine, codewords, clusterNumbers);
136
+
137
+ // XXX
138
+ vector<vector<int> > detectedCodeWords(votes.size());
139
+ for (int i = 0; i < (int)votes.size(); i++) {
140
+ detectedCodeWords[i].resize(votes[i].size(), 0);
141
+ for (int j = 0; j < (int)votes[i].size(); j++) {
142
+ if (!votes[i][j].empty()) {
143
+ detectedCodeWords[i][j] = getValueWithMaxVotes(votes[i][j]).getVote();
144
+ }
145
+ }
146
+ }
147
+
148
+ // XXX
149
+ vector<int> insertLinesAt = findMissingLines(symbolsPerLine, detectedCodeWords);
150
+
151
+ // XXX
152
+ int rowCount = decodeRowCount(symbolsPerLine, detectedCodeWords, insertLinesAt);
153
+ detectedCodeWords.resize(rowCount);
154
+
155
+ // XXX
156
+ Ref<BitMatrix> grid(new BitMatrix(dimension_, detectedCodeWords.size()));
157
+ codewordsToBitMatrix(detectedCodeWords, grid);
158
+
159
+ return grid;
160
+ }
161
+
162
+ /**
163
+ * @brief LinesSampler::codewordsToBitMatrix
164
+ * @param codewords
165
+ * @param matrix
166
+ */
167
+ void LinesSampler::codewordsToBitMatrix(vector<vector<int> > &codewords, Ref<BitMatrix> &matrix) {
168
+ for (int i = 0; i < (int)codewords.size(); i++) {
169
+ for (int j = 0; j < (int)codewords[i].size(); j++) {
170
+ int moduleOffset = j * MODULES_IN_SYMBOL;
171
+ for (int k = 0; k < MODULES_IN_SYMBOL; k++) {
172
+ if ((codewords[i][j] & (1 << (MODULES_IN_SYMBOL - k - 1))) > 0) {
173
+ matrix->set(moduleOffset + k, i);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ }
179
+
180
+ /**
181
+ * @brief LinesSampler::calculateClusterNumber
182
+ * @param codeword
183
+ * @return
184
+ */
185
+ int LinesSampler::calculateClusterNumber(int codeword) {
186
+ if (codeword == 0) {
187
+ return -1;
188
+ }
189
+ int barNumber = 0;
190
+ bool blackBar = true;
191
+ int clusterNumber = 0;
192
+ for (int i = 0; i < MODULES_IN_SYMBOL; i++) {
193
+ if ((codeword & (1 << i)) > 0) {
194
+ if (!blackBar) {
195
+ blackBar = true;
196
+ barNumber++;
197
+ }
198
+ if (barNumber % 2 == 0) {
199
+ clusterNumber++;
200
+ } else {
201
+ clusterNumber--;
202
+ }
203
+ } else {
204
+ if (blackBar) {
205
+ blackBar = false;
206
+ }
207
+ }
208
+ }
209
+ return (clusterNumber + 9) % 9;
210
+ }
211
+
212
+ //#define OUTPUT_SYMBOL_WIDTH 1
213
+ //#define OUTPUT_BAR_WIDTH 1
214
+ //#define OUTPUT_CW_STARTS 1
215
+ //#define OUTPUT_CLUSTER_NUMBERS 1
216
+ //#define OUTPUT_EC_LEVEL 1
217
+
218
+ void LinesSampler::computeSymbolWidths(vector<float> &symbolWidths, const int symbolsPerLine, Ref<BitMatrix> linesMatrix)
219
+ {
220
+ int symbolStart = 0;
221
+ bool lastWasSymbolStart = true;
222
+ const float symbolWidth = symbolsPerLine > 0 ? (float)linesMatrix->getWidth() / (float)symbolsPerLine : (float)linesMatrix->getWidth();
223
+
224
+ // Use the following property of PDF417 barcodes to detect symbols:
225
+ // Every symbol starts with a black module and every symbol is 17 modules wide,
226
+ // therefore there have to be columns in the line matrix that are completely composed of black pixels.
227
+ vector<int> blackCount(linesMatrix->getWidth(), 0);
228
+ for (int x = BARCODE_START_OFFSET; x < linesMatrix->getWidth(); x++) {
229
+ for (int y = 0; y < linesMatrix->getHeight(); y++) {
230
+ if (linesMatrix->get(x, y)) {
231
+ blackCount[x]++;
232
+ }
233
+ }
234
+ if (blackCount[x] == linesMatrix->getHeight()) {
235
+ if (!lastWasSymbolStart) {
236
+ float currentWidth = (float)(x - symbolStart);
237
+ // Make sure we really found a symbol by asserting a minimal size of 75% of the expected symbol width.
238
+ // This might break highly distorted barcodes, but fixes an issue with barcodes where there is a
239
+ // full black column from top to bottom within a symbol.
240
+ if (currentWidth > 0.75 * symbolWidth) {
241
+ // The actual symbol width might be slightly bigger than the expected symbol width,
242
+ // but if we are more than half an expected symbol width bigger, we assume that
243
+ // we missed one or more symbols and assume that they were the expected symbol width.
244
+ while (currentWidth > 1.5 * symbolWidth) {
245
+ symbolWidths.push_back(symbolWidth);
246
+ currentWidth -= symbolWidth;
247
+ }
248
+ symbolWidths.push_back(currentWidth);
249
+ lastWasSymbolStart = true;
250
+ symbolStart = x;
251
+ }
252
+ }
253
+ } else {
254
+ if (lastWasSymbolStart) {
255
+ lastWasSymbolStart = false;
256
+ }
257
+ }
258
+ }
259
+
260
+ // The last symbol ends at the right edge of the matrix, where there usually is no black bar.
261
+ float currentWidth = (float)(linesMatrix->getWidth() - symbolStart);
262
+ while (currentWidth > 1.5 * symbolWidth) {
263
+ symbolWidths.push_back(symbolWidth);
264
+ currentWidth -= symbolWidth;
265
+ }
266
+ symbolWidths.push_back(currentWidth);
267
+
268
+
269
+ #if PDF417_DIAG && OUTPUT_SYMBOL_WIDTH
270
+ {
271
+ cout << "symbols per line: " << symbolsPerLine << endl;
272
+ cout << "symbol width (" << symbolWidths.size() << "): ";
273
+ for (int i = 0; i < symbolWidths.size(); i++) {
274
+ cout << symbolWidths[i] << ", ";
275
+ }
276
+ cout << endl;
277
+ }
278
+ #endif
279
+ }
280
+
281
+ void LinesSampler::linesMatrixToCodewords(vector<vector<int> >& clusterNumbers,
282
+ const int symbolsPerLine,
283
+ const vector<float>& symbolWidths,
284
+ Ref<BitMatrix> linesMatrix,
285
+ vector<vector<int> >& codewords)
286
+ {
287
+ for (int y = 0; y < linesMatrix->getHeight(); y++) {
288
+ // Not sure if this is the right way to handle this but avoids an error:
289
+ if (symbolsPerLine > (int)symbolWidths.size()) {
290
+ throw NotFoundException("Inconsistent number of symbols in this line.");
291
+ }
292
+
293
+ // TODO: use symbolWidths.size() instead of symbolsPerLine to at least decode some codewords
294
+
295
+ codewords[y].resize(symbolsPerLine, 0);
296
+ clusterNumbers[y].resize(symbolsPerLine, -1);
297
+ int line = y;
298
+ vector<int> barWidths(1, 0);
299
+ int barCount = 0;
300
+ // Runlength encode the bars in the scanned linesMatrix.
301
+ // We assume that the first bar is black, as determined by the PDF417 standard.
302
+ bool isSetBar = true;
303
+ // Filter small white bars at the beginning of the barcode.
304
+ // Small white bars may occur due to small deviations in scan line sampling.
305
+ barWidths[0] += BARCODE_START_OFFSET;
306
+ for (int x = BARCODE_START_OFFSET; x < linesMatrix->getWidth(); x++) {
307
+ if (linesMatrix->get(x, line)) {
308
+ if (!isSetBar) {
309
+ isSetBar = true;
310
+ barCount++;
311
+ barWidths.resize(barWidths.size() + 1);
312
+ }
313
+ } else {
314
+ if (isSetBar) {
315
+ isSetBar = false;
316
+ barCount++;
317
+ barWidths.resize(barWidths.size() + 1);
318
+ }
319
+
320
+ }
321
+ barWidths[barCount]++;
322
+ }
323
+ // Don't forget the last bar.
324
+ barCount++;
325
+ barWidths.resize(barWidths.size() + 1);
326
+
327
+ #if PDF417_DIAG && OUTPUT_BAR_WIDTH
328
+ {
329
+ for (int i = 0; i < barWidths.size(); i++) {
330
+ cout << barWidths[i] << ", ";
331
+ }
332
+ cout << endl;
333
+ }
334
+ #endif
335
+
336
+ //////////////////////////////////////////////////
337
+
338
+ // Find the symbols in the line by counting bar lengths until we reach symbolWidth.
339
+ // We make sure, that the last bar of a symbol is always white, as determined by the PDF417 standard.
340
+ // This helps to reduce the amount of errors done during the symbol recognition.
341
+ // The symbolWidth usually is not constant over the width of the barcode.
342
+ int cwWidth = 0;
343
+ int cwCount = 0;
344
+ vector<int> cwStarts(symbolsPerLine, 0);
345
+ cwStarts[0] = 0;
346
+ cwCount++;
347
+ for (int i = 0; i < barCount && cwCount < symbolsPerLine; i++) {
348
+ cwWidth += barWidths[i];
349
+ if ((float)cwWidth > symbolWidths[cwCount - 1]) {
350
+ if ((i % 2) == 1) { // check if bar is white
351
+ i++;
352
+ }
353
+ cwWidth = barWidths[i];
354
+ cwStarts[cwCount] = i;
355
+ cwCount++;
356
+ }
357
+ }
358
+
359
+ #if PDF417_DIAG && OUTPUT_CW_STARTS
360
+ {
361
+ for (int i = 0; i < cwStarts.size(); i++) {
362
+ cout << cwStarts[i] << ", ";
363
+ }
364
+ cout << endl;
365
+ }
366
+ #endif
367
+
368
+ ///////////////////////////////////////////
369
+
370
+ vector<vector<float> > cwRatios(symbolsPerLine);
371
+ // Distribute bar widths to modules of a codeword.
372
+ for (int i = 0; i < symbolsPerLine; i++) {
373
+ cwRatios[i].resize(BARS_IN_SYMBOL, 0.0f);
374
+ const int cwStart = cwStarts[i];
375
+ const int cwEnd = (i == symbolsPerLine - 1) ? barCount : cwStarts[i + 1];
376
+ const int cwLength = cwEnd - cwStart;
377
+
378
+ if (cwLength < 7 || cwLength > 9) {
379
+ // We try to recover smybols with 7 or 9 bars and spaces with heuristics, but everything else is beyond repair.
380
+ continue;
381
+ }
382
+
383
+ float cwWidth = 0;
384
+
385
+ // For symbols with 9 bar length simply ignore the last bar.
386
+ for (int j = 0; j < min(BARS_IN_SYMBOL, cwLength); ++j) {
387
+ cwWidth += (float)barWidths[cwStart + j];
388
+ }
389
+
390
+ // If there were only 7 bars and spaces detected use the following heuristic:
391
+ // Assume the length of the symbol is symbolWidth and the last (unrecognized) bar uses all remaining space.
392
+ if (cwLength == 7) {
393
+ for (int j = 0; j < cwLength; ++j) {
394
+ cwRatios[i][j] = (float)barWidths[cwStart + j] / symbolWidths[i];
395
+ }
396
+ cwRatios[i][7] = (symbolWidths[i] - cwWidth) / symbolWidths[i];
397
+ } else {
398
+ for (int j = 0; j < (int)cwRatios[i].size(); ++j) {
399
+ cwRatios[i][j] = (float)barWidths[cwStart + j] / cwWidth;
400
+ }
401
+ }
402
+
403
+ float bestMatchError = std::numeric_limits<float>::max();
404
+ int bestMatch = 0;
405
+
406
+ // Search for the most possible codeword by comparing the ratios of bar size to symbol width.
407
+ // The sum of the squared differences is used as similarity metric.
408
+ // (Picture it as the square euclidian distance in the space of eight tuples where a tuple represents the bar ratios.)
409
+ for (int j = 0; j < POSSIBLE_SYMBOLS; j++) {
410
+ float error = 0.0f;
411
+ for (int k = 0; k < BARS_IN_SYMBOL; k++) {
412
+ float diff = RATIOS_TABLE[j * BARS_IN_SYMBOL + k] - cwRatios[i][k];
413
+ error += diff * diff;
414
+ if (error >= bestMatchError) {
415
+ break;
416
+ }
417
+ }
418
+ if (error < bestMatchError) {
419
+ bestMatchError = error;
420
+ bestMatch = BitMatrixParser::SYMBOL_TABLE[j];
421
+ }
422
+ }
423
+ codewords[y][i] = bestMatch;
424
+ clusterNumbers[y][i] = calculateClusterNumber(bestMatch);
425
+ }
426
+ }
427
+
428
+
429
+ #if PDF417_DIAG && OUTPUT_CLUSTER_NUMBERS
430
+ {
431
+ for (int i = 0; i < clusterNumbers.size(); i++) {
432
+ for (int j = 0; j < clusterNumbers[i].size(); j++) {
433
+ cout << clusterNumbers[i][j] << ", ";
434
+ }
435
+ cout << endl;
436
+ }
437
+ }
438
+ #endif
439
+
440
+
441
+ #if PDF417_DIAG
442
+ {
443
+ Ref<BitMatrix> bits(new BitMatrix(symbolsPerLine * MODULES_IN_SYMBOL, codewords.size()));
444
+ codewordsToBitMatrix(codewords, bits);
445
+ static int __cnt__ = 0;
446
+ stringstream ss;
447
+ ss << "pdf417-detectedRaw" << __cnt__++ << ".png";
448
+ bits->writePng(ss.str().c_str(), 8, 16);
449
+ }
450
+ #endif
451
+ }
452
+
453
+ vector<vector<map<int, int> > >
454
+ LinesSampler::distributeVotes(const int symbolsPerLine,
455
+ const vector<vector<int> >& codewords,
456
+ const vector<vector<int> >& clusterNumbers)
457
+ {
458
+ // Matrix of votes for codewords which are possible at this position.
459
+ vector<vector<map<int, int> > > votes(1);
460
+ votes[0].resize(symbolsPerLine);
461
+
462
+ int currentRow = 0;
463
+ map<int, int> clusterNumberVotes;
464
+ int lastLineClusterNumber = -1;
465
+
466
+ for (int y = 0; y < (int)codewords.size(); y++) {
467
+ // Vote for the most probable cluster number for this row.
468
+ clusterNumberVotes.clear();
469
+ for (int i = 0; i < (int)codewords[y].size(); i++) {
470
+ if (clusterNumbers[y][i] != -1) {
471
+ clusterNumberVotes[clusterNumbers[y][i]] = clusterNumberVotes[clusterNumbers[y][i]] + 1;
472
+ }
473
+ }
474
+
475
+ // Ignore lines where no codeword could be read.
476
+ if (!clusterNumberVotes.empty()) {
477
+ VoteResult voteResult = getValueWithMaxVotes(clusterNumberVotes);
478
+ bool lineClusterNumberIsIndecisive = voteResult.isIndecisive();
479
+ int lineClusterNumber = voteResult.getVote();
480
+
481
+ // If there are to few votes on the lines cluster number, we keep the old one.
482
+ // This avoids switching lines because of damaged inter line readings, but
483
+ // may cause problems for barcodes with four or less rows.
484
+ if (lineClusterNumberIsIndecisive) {
485
+ lineClusterNumber = lastLineClusterNumber;
486
+ }
487
+
488
+ if ((lineClusterNumber != ((lastLineClusterNumber + 3) % 9)) && (lastLineClusterNumber != -1)) {
489
+ lineClusterNumber = lastLineClusterNumber;
490
+ }
491
+
492
+ // Ignore broken lines at the beginning of the barcode.
493
+ if ((lineClusterNumber == 0 && lastLineClusterNumber == -1) || (lastLineClusterNumber != -1)) {
494
+ if ((lineClusterNumber == ((lastLineClusterNumber + 3) % 9)) && (lastLineClusterNumber != -1)) {
495
+ currentRow++;
496
+ if ((int)votes.size() < currentRow + 1) {
497
+ votes.resize(currentRow + 1);
498
+ votes[currentRow].resize(symbolsPerLine);
499
+ }
500
+ }
501
+
502
+ if ((lineClusterNumber == ((lastLineClusterNumber + 6) % 9)) && (lastLineClusterNumber != -1)) {
503
+ currentRow += 2;
504
+ if ((int)votes.size() < currentRow + 1) {
505
+ votes.resize(currentRow + 1);
506
+ votes[currentRow].resize(symbolsPerLine);
507
+ }
508
+ }
509
+
510
+ for (int i = 0; i < (int)codewords[y].size(); i++) {
511
+ if (clusterNumbers[y][i] != -1) {
512
+ if (clusterNumbers[y][i] == lineClusterNumber) {
513
+ votes[currentRow][i][codewords[y][i]] = votes[currentRow][i][codewords[y][i]] + 1;
514
+ } else if (clusterNumbers[y][i] == ((lineClusterNumber + 3) % 9)) {
515
+ if ((int)votes.size() < currentRow + 2) {
516
+ votes.resize(currentRow + 2);
517
+ votes[currentRow + 1].resize(symbolsPerLine);
518
+ }
519
+ votes[currentRow + 1][i][codewords[y][i]] = votes[currentRow + 1][i][codewords[y][i]] + 1;
520
+ } else if ((clusterNumbers[y][i] == ((lineClusterNumber + 6) % 9)) && (currentRow > 0)) {
521
+ votes[currentRow - 1][i][codewords[y][i]] = votes[currentRow - 1][i][codewords[y][i]] + 1;
522
+ }
523
+ }
524
+ }
525
+ lastLineClusterNumber = lineClusterNumber;
526
+ }
527
+ }
528
+ }
529
+
530
+ return votes;
531
+ }
532
+
533
+
534
+ vector<int>
535
+ LinesSampler::findMissingLines(const int symbolsPerLine, vector<vector<int> > &detectedCodeWords) {
536
+ vector<int> insertLinesAt;
537
+ if (detectedCodeWords.size() > 1) {
538
+ for (int i = 0; i < (int)detectedCodeWords.size() - 1; i++) {
539
+ int clusterNumberRow = -1;
540
+ for (int j = 0; j < (int)detectedCodeWords[i].size() && clusterNumberRow == -1; j++) {
541
+ int clusterNumber = calculateClusterNumber(detectedCodeWords[i][j]);
542
+ if (clusterNumber != -1) {
543
+ clusterNumberRow = clusterNumber;
544
+ }
545
+ }
546
+ if (i == 0) {
547
+ // The first line must have the cluster number 0. Insert empty lines to match this.
548
+ if (clusterNumberRow > 0) {
549
+ insertLinesAt.push_back(0);
550
+ if (clusterNumberRow > 3) {
551
+ insertLinesAt.push_back(0);
552
+ }
553
+ }
554
+ }
555
+ int clusterNumberNextRow = -1;
556
+ for (int j = 0; j < (int)detectedCodeWords[i + 1].size() && clusterNumberNextRow == -1; j++) {
557
+ int clusterNumber = calculateClusterNumber(detectedCodeWords[i + 1][j]);
558
+ if (clusterNumber != -1) {
559
+ clusterNumberNextRow = clusterNumber;
560
+ }
561
+ }
562
+ if ((clusterNumberRow + 3) % 9 != clusterNumberNextRow
563
+ && clusterNumberRow != -1
564
+ && clusterNumberNextRow != -1) {
565
+ // The cluster numbers are not consecutive. Insert an empty line between them.
566
+ insertLinesAt.push_back(i + 1);
567
+ if (clusterNumberRow == clusterNumberNextRow) {
568
+ // There may be two lines missing. This is detected when two consecutive lines have the same cluster number.
569
+ insertLinesAt.push_back(i + 1);
570
+ }
571
+ }
572
+ }
573
+ }
574
+
575
+ for (int i = 0; i < (int)insertLinesAt.size(); i++) {
576
+ detectedCodeWords.insert(detectedCodeWords.begin() + insertLinesAt[i] + i, vector<int>(symbolsPerLine, 0));
577
+ }
578
+
579
+ return insertLinesAt;
580
+ }
581
+
582
+ int LinesSampler::decodeRowCount(const int symbolsPerLine, vector<vector<int> > &detectedCodeWords, vector<int> &insertLinesAt)
583
+ {
584
+ // Use the information in the first and last column to determin the number of rows and find more missing rows.
585
+ // For missing rows insert blank space, so the error correction can try to fill them in.
586
+
587
+ map<int, int> rowCountVotes;
588
+ map<int, int> ecLevelVotes;
589
+ map<int, int> rowNumberVotes;
590
+ int lastRowNumber = -1;
591
+ insertLinesAt.clear();
592
+
593
+ for (int i = 0; i + 2 < (int)detectedCodeWords.size(); i += 3) {
594
+ rowNumberVotes.clear();
595
+ int firstCodewordDecodedLeft = -1;
596
+ int secondCodewordDecodedLeft = -1;
597
+ int thirdCodewordDecodedLeft = -1;
598
+ int firstCodewordDecodedRight = -1;
599
+ int secondCodewordDecodedRight = -1;
600
+ int thirdCodewordDecodedRight = -1;
601
+
602
+ if (detectedCodeWords[i][0] != 0) {
603
+ firstCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i][0]);
604
+ }
605
+ if (detectedCodeWords[i + 1][0] != 0) {
606
+ secondCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i + 1][0]);
607
+ }
608
+ if (detectedCodeWords[i + 2][0] != 0) {
609
+ thirdCodewordDecodedLeft = BitMatrixParser::getCodeword(detectedCodeWords[i + 2][0]);
610
+ }
611
+
612
+ if (detectedCodeWords[i][detectedCodeWords[i].size() - 1] != 0) {
613
+ firstCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i][detectedCodeWords[i].size() - 1]);
614
+ }
615
+ if (detectedCodeWords[i + 1][detectedCodeWords[i + 1].size() - 1] != 0) {
616
+ secondCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i + 1][detectedCodeWords[i + 1].size() - 1]);
617
+ }
618
+ if (detectedCodeWords[i + 2][detectedCodeWords[i + 2].size() - 1] != 0) {
619
+ thirdCodewordDecodedRight = BitMatrixParser::getCodeword(detectedCodeWords[i + 2][detectedCodeWords[i + 2].size() - 1]);
620
+ }
621
+
622
+ if (firstCodewordDecodedLeft != -1 && secondCodewordDecodedLeft != -1) {
623
+ int leftRowCount = ((firstCodewordDecodedLeft % 30) * 3) + ((secondCodewordDecodedLeft % 30) % 3);
624
+ int leftECLevel = (secondCodewordDecodedLeft % 30) / 3;
625
+
626
+ rowCountVotes[leftRowCount] = rowCountVotes[leftRowCount] + 1;
627
+ ecLevelVotes[leftECLevel] = ecLevelVotes[leftECLevel] + 1;
628
+ }
629
+
630
+ if (secondCodewordDecodedRight != -1 && thirdCodewordDecodedRight != -1) {
631
+ int rightRowCount = ((secondCodewordDecodedRight % 30) * 3) + ((thirdCodewordDecodedRight % 30) % 3);
632
+ int rightECLevel = (thirdCodewordDecodedRight % 30) / 3;
633
+
634
+ rowCountVotes[rightRowCount] = rowCountVotes[rightRowCount] + 1;
635
+ ecLevelVotes[rightECLevel] = ecLevelVotes[rightECLevel] + 1;
636
+ }
637
+
638
+ if (firstCodewordDecodedLeft != -1) {
639
+ int rowNumber = firstCodewordDecodedLeft / 30;
640
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
641
+ }
642
+ if (secondCodewordDecodedLeft != -1) {
643
+ int rowNumber = secondCodewordDecodedLeft / 30;
644
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
645
+ }
646
+ if (thirdCodewordDecodedLeft != -1) {
647
+ int rowNumber = thirdCodewordDecodedLeft / 30;
648
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
649
+ }
650
+ if (firstCodewordDecodedRight != -1) {
651
+ int rowNumber = firstCodewordDecodedRight / 30;
652
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
653
+ }
654
+ if (secondCodewordDecodedRight != -1) {
655
+ int rowNumber = secondCodewordDecodedRight / 30;
656
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
657
+ }
658
+ if (thirdCodewordDecodedRight != -1) {
659
+ int rowNumber = thirdCodewordDecodedRight / 30;
660
+ rowNumberVotes[rowNumber] = rowNumberVotes[rowNumber] + 1;
661
+ }
662
+ int rowNumber = getValueWithMaxVotes(rowNumberVotes).getVote();
663
+ if (lastRowNumber + 1 < rowNumber) {
664
+ for (int j = lastRowNumber + 1; j < rowNumber; j++) {
665
+ insertLinesAt.push_back(i);
666
+ insertLinesAt.push_back(i);
667
+ insertLinesAt.push_back(i);
668
+ }
669
+ }
670
+ lastRowNumber = rowNumber;
671
+ }
672
+
673
+ for (int i = 0; i < (int)insertLinesAt.size(); i++) {
674
+ detectedCodeWords.insert(detectedCodeWords.begin() + insertLinesAt[i] + i, vector<int>(symbolsPerLine, 0));
675
+ }
676
+
677
+ int rowCount = getValueWithMaxVotes(rowCountVotes).getVote();
678
+ // int ecLevel = getValueWithMaxVotes(ecLevelVotes);
679
+
680
+ #if PDF417_DIAG && OUTPUT_EC_LEVEL
681
+ {
682
+ cout << "EC Level: " << ecLevel << " (" << ((1 << (ecLevel + 1)) - 2) << " EC Codewords)" << endl;
683
+ }
684
+ #endif
685
+ rowCount += 1;
686
+ return rowCount;
687
+ }
688
+
689
+ /**
690
+ * Ends up being a bit faster than Math.round(). This merely rounds its
691
+ * argument to the nearest int, where x.5 rounds up.
692
+ */
693
+ int LinesSampler::round(float d)
694
+ {
695
+ return (int)(d + 0.5f);
696
+ }
697
+
698
+ Point LinesSampler::intersection(Line a, Line b) {
699
+ float dxa = a.start.x - a.end.x;
700
+ float dxb = b.start.x - b.end.x;
701
+ float dya = a.start.y - a.end.y;
702
+ float dyb = b.start.y - b.end.y;
703
+
704
+ float p = a.start.x * a.end.y - a.start.y * a.end.x;
705
+ float q = b.start.x * b.end.y - b.start.y * b.end.x;
706
+ float denom = dxa * dyb - dya * dxb;
707
+ if(std::abs(denom) < 1e-12) // Lines don't intersect (replaces "denom == 0")
708
+ return Point(std::numeric_limits<float>::infinity(),
709
+ std::numeric_limits<float>::infinity());
710
+
711
+ float x = (p * dxb - dxa * q) / denom;
712
+ float y = (p * dyb - dya * q) / denom;
713
+
714
+ return Point(x, y);
715
+ }