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,71 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+
3
+ #ifndef __ERROR_CORRECTION_PDF_H__
4
+ #define __ERROR_CORRECTION_PDF_H__
5
+ /*
6
+ * Copyright 2012 ZXing authors
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ *
20
+ * 2012-09-17 HFN translation from Java into C++
21
+ */
22
+
23
+ #include <zxing/common/Counted.h>
24
+ #include <zxing/common/Array.h>
25
+ #include <zxing/common/DecoderResult.h>
26
+ #include <zxing/common/BitMatrix.h>
27
+ #include <zxing/pdf417/decoder/ec/ModulusGF.h>
28
+ #include <zxing/pdf417/decoder/ec/ModulusPoly.h>
29
+ #include <zxing/common/reedsolomon/ReedSolomonException.h>
30
+
31
+ namespace zxing {
32
+ namespace pdf417 {
33
+ namespace decoder {
34
+ namespace ec {
35
+
36
+
37
+ /**
38
+ * <p>PDF417 error correction implementation.</p>
39
+ *
40
+ * <p>This <a href="http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction#Example">example</a>
41
+ * is quite useful in understanding the algorithm.</p>
42
+ *
43
+ * @author Sean Owen
44
+ * @see com.google.zxing.common.reedsolomon.ReedSolomonDecoder
45
+ */
46
+ class ErrorCorrection: public Counted {
47
+
48
+ private:
49
+ ModulusGF &field_;
50
+
51
+ public:
52
+ ErrorCorrection();
53
+ void decode(ArrayRef<int> received,
54
+ int numECCodewords,
55
+ ArrayRef<int> erasures);
56
+
57
+ private:
58
+ std::vector<Ref<ModulusPoly> > runEuclideanAlgorithm(Ref<ModulusPoly> a, Ref<ModulusPoly> b, int R);
59
+
60
+ ArrayRef<int> findErrorLocations(Ref<ModulusPoly> errorLocator);
61
+ ArrayRef<int> findErrorMagnitudes(Ref<ModulusPoly> errorEvaluator,
62
+ Ref<ModulusPoly> errorLocator,
63
+ ArrayRef<int> errorLocations);
64
+ };
65
+
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ #endif /* __ERROR_CORRECTION_PDF_H__ */
@@ -0,0 +1,120 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2012 ZXing authors
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
+ * 2012-09-19 HFN translation from Java into C++
18
+ */
19
+
20
+ #include <zxing/pdf417/decoder/ec/ModulusGF.h>
21
+ #include <zxing/pdf417/decoder/ec/ModulusPoly.h>
22
+
23
+ using zxing::Ref;
24
+ using zxing::pdf417::decoder::ec::ModulusGF;
25
+ using zxing::pdf417::decoder::ec::ModulusPoly;
26
+
27
+ /**
28
+ * The central Modulus Galois Field for PDF417 with prime number 929
29
+ * and generator 3.
30
+ */
31
+ ModulusGF ModulusGF::PDF417_GF(929,3);
32
+
33
+
34
+ /**
35
+ * <p>A field based on powers of a generator integer, modulo some modulus.</p>
36
+ *
37
+ * @author Sean Owen
38
+ * @see com.google.zxing.common.reedsolomon.GenericGF
39
+ */
40
+
41
+ ModulusGF::ModulusGF(int modulus, int generator)
42
+ : modulus_(modulus) {
43
+ expTable_ = new Array<int>(modulus_);
44
+ logTable_ = new Array<int>(modulus_);
45
+ int x = 1,i;
46
+ for (i = 0; i < modulus_; i++) {
47
+ expTable_[i] = x;
48
+ x = (x * generator) % modulus_;
49
+ }
50
+ for (i = 0; i < modulus_-1; i++) {
51
+ logTable_[expTable_[i]] = i;
52
+ }
53
+ // logTable[0] == 0 but this should never be used
54
+ ArrayRef<int>aZero(new Array<int>(1)),aOne(new Array<int>(1));
55
+ aZero[0]=0;aOne[0]=1;
56
+ zero_ = new ModulusPoly(*this, aZero);
57
+ one_ = new ModulusPoly(*this, aOne);
58
+ }
59
+
60
+ Ref<ModulusPoly> ModulusGF::getZero() {
61
+ return zero_;
62
+ }
63
+
64
+ Ref<ModulusPoly> ModulusGF::getOne() {
65
+ return one_;
66
+ }
67
+
68
+ Ref<ModulusPoly> ModulusGF::buildMonomial(int degree, int coefficient)
69
+ {
70
+ if (degree < 0) {
71
+ throw IllegalArgumentException("monomial: degree < 0!");
72
+ }
73
+ if (coefficient == 0) {
74
+ return zero_;
75
+ }
76
+ int nCoefficients = degree + 1;
77
+ ArrayRef<int> coefficients (new Array<int>(nCoefficients));
78
+ coefficients[0] = coefficient;
79
+ Ref<ModulusPoly> result(new ModulusPoly(*this,coefficients));
80
+ return result;
81
+ }
82
+
83
+
84
+
85
+ int ModulusGF::add(int a, int b) {
86
+ return (a + b) % modulus_;
87
+ }
88
+
89
+ int ModulusGF::subtract(int a, int b) {
90
+ return (modulus_ + a - b) % modulus_;
91
+ }
92
+
93
+ int ModulusGF::exp(int a) {
94
+ return expTable_[a];
95
+ }
96
+
97
+ int ModulusGF::log(int a) {
98
+ if (a == 0) {
99
+ throw IllegalArgumentException("log of zero!");
100
+ }
101
+ return logTable_[a];
102
+ }
103
+
104
+ int ModulusGF::inverse(int a) {
105
+ if (a == 0) {
106
+ throw IllegalArgumentException("inverse of zero!");;
107
+ }
108
+ return expTable_[modulus_ - logTable_[a] - 1];
109
+ }
110
+
111
+ int ModulusGF::multiply(int a, int b) {
112
+ if (a == 0 || b == 0) {
113
+ return 0;
114
+ }
115
+ return expTable_[(logTable_[a] + logTable_[b]) % (modulus_ - 1)];
116
+ }
117
+
118
+ int ModulusGF::getSize() {
119
+ return modulus_;
120
+ }
@@ -0,0 +1,72 @@
1
+ #ifndef __MODULUS_GF_PDF_H__
2
+ #define __MODULUS_GF_PDF_H__
3
+ /*
4
+ * Copyright 2012 ZXing authors
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ *
18
+ * 2012-09-17 HFN translation from Java into C++
19
+ */
20
+
21
+ #include <zxing/common/Counted.h>
22
+ #include <zxing/common/Array.h>
23
+ #include <zxing/common/DecoderResult.h>
24
+ #include <zxing/common/BitMatrix.h>
25
+
26
+ namespace zxing {
27
+ namespace pdf417 {
28
+ namespace decoder {
29
+ namespace ec {
30
+
31
+ class ModulusPoly;
32
+
33
+ /**
34
+ * <p>A field based on powers of a generator integer, modulo some modulus.</p>
35
+ *
36
+ * @author Sean Owen
37
+ * @see com.google.zxing.common.reedsolomon.GenericGF
38
+ */
39
+ class ModulusGF {
40
+
41
+ public:
42
+ static ModulusGF PDF417_GF;
43
+
44
+ private:
45
+ ArrayRef<int> expTable_;
46
+ ArrayRef<int> logTable_;
47
+ Ref<ModulusPoly> zero_;
48
+ Ref<ModulusPoly> one_;
49
+ int modulus_;
50
+
51
+ public:
52
+ ModulusGF(int modulus, int generator);
53
+ Ref<ModulusPoly> getZero();
54
+ Ref<ModulusPoly> getOne();
55
+ Ref<ModulusPoly> buildMonomial(int degree, int coefficient);
56
+
57
+ int add(int a, int b);
58
+ int subtract(int a, int b);
59
+ int exp(int a);
60
+ int log(int a);
61
+ int inverse(int a);
62
+ int multiply(int a, int b);
63
+ int getSize();
64
+
65
+ };
66
+
67
+ }
68
+ }
69
+ }
70
+ }
71
+
72
+ #endif /* __MODULUS_GF_PDF_H__ */
@@ -0,0 +1,284 @@
1
+ // -*- mode:c++; tab-width:2; indent-tabs-mode:nil; c-basic-offset:2 -*-
2
+ /*
3
+ * Copyright 2012 ZXing authors
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
+ * 2012-09-19 HFN translation from Java into C++
18
+ */
19
+
20
+ #include <zxing/pdf417/decoder/ec/ModulusPoly.h>
21
+ #include <zxing/pdf417/decoder/ec/ModulusGF.h>
22
+
23
+ using zxing::Ref;
24
+ using zxing::ArrayRef;
25
+ using zxing::pdf417::decoder::ec::ModulusGF;
26
+ using zxing::pdf417::decoder::ec::ModulusPoly;
27
+
28
+ /**
29
+ * @author Sean Owen
30
+ * @see com.google.zxing.common.reedsolomon.GenericGFPoly
31
+ */
32
+
33
+ ModulusPoly::ModulusPoly(ModulusGF& field, ArrayRef<int> coefficients)
34
+ : field_(field)
35
+ {
36
+ if (coefficients->size() == 0) {
37
+ throw IllegalArgumentException("no coefficients!");
38
+ }
39
+ int coefficientsLength = coefficients->size();
40
+ if (coefficientsLength > 1 && coefficients[0] == 0) {
41
+ // Leading term must be non-zero for anything except the constant polynomial "0"
42
+ int firstNonZero = 1;
43
+ while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) {
44
+ firstNonZero++;
45
+ }
46
+ if (firstNonZero == coefficientsLength) {
47
+ coefficientsLength = field_.getZero()->getCoefficients()->size();
48
+ coefficients_.reset(new Array<int> (coefficientsLength));
49
+ *coefficients_ = *(field_.getZero()->getCoefficients());
50
+ } else {
51
+ ArrayRef<int> c(coefficients);
52
+ coefficientsLength -= firstNonZero;
53
+ coefficients_.reset(new Array<int> (coefficientsLength));
54
+ for (int i = 0; i < coefficientsLength; i++) {
55
+ coefficients_[i] = c[i + firstNonZero];
56
+ }
57
+ /*
58
+ coefficientsLength -= firstNonZero;
59
+ coefficients_.reset(new Array<int>(coefficientsLength - firstNonZero));
60
+ for (int i = 0; i < coefficientsLength; i++) {
61
+ coefficients_[i] = coefficients[i + firstNonZero];
62
+ }
63
+ */
64
+ }
65
+ } else {
66
+ coefficients_ = coefficients;
67
+ }
68
+ }
69
+
70
+ ArrayRef<int> ModulusPoly::getCoefficients() {
71
+ return coefficients_;
72
+ }
73
+
74
+ /**
75
+ * @return degree of this polynomial
76
+ */
77
+ int ModulusPoly::getDegree() {
78
+ return coefficients_->size() - 1;
79
+ }
80
+
81
+ /**
82
+ * @return true iff this polynomial is the monomial "0"
83
+ */
84
+ bool ModulusPoly::isZero() {
85
+ return coefficients_[0] == 0;
86
+ }
87
+
88
+ /**
89
+ * @return coefficient of x^degree term in this polynomial
90
+ */
91
+ int ModulusPoly::getCoefficient(int degree) {
92
+ return coefficients_[coefficients_->size() - 1 - degree];
93
+ }
94
+
95
+ /**
96
+ * @return evaluation of this polynomial at a given point
97
+ */
98
+ int ModulusPoly::evaluateAt(int a) {
99
+ int i;
100
+ if (a == 0) {
101
+ // Just return the x^0 coefficient
102
+ return getCoefficient(0);
103
+ }
104
+ int size = coefficients_->size();
105
+ if (a == 1) {
106
+ // Just the sum of the coefficients
107
+ int result = 0;
108
+ for (i = 0; i < size; i++) {
109
+ result = field_.add(result, coefficients_[i]);
110
+ }
111
+ return result;
112
+ }
113
+ int result = coefficients_[0];
114
+ for (i = 1; i < size; i++) {
115
+ result = field_.add(field_.multiply(a, result), coefficients_[i]);
116
+ }
117
+ return result;
118
+ }
119
+
120
+ Ref<ModulusPoly> ModulusPoly::add(Ref<ModulusPoly> other) {
121
+ if (&field_ != &other->field_) {
122
+ throw IllegalArgumentException("ModulusPolys do not have same ModulusGF field");
123
+ }
124
+ if (isZero()) {
125
+ return other;
126
+ }
127
+ if (other->isZero()) {
128
+ return Ref<ModulusPoly>(this);
129
+ }
130
+
131
+ ArrayRef<int> smallerCoefficients = coefficients_;
132
+ ArrayRef<int> largerCoefficients = other->coefficients_;
133
+ if (smallerCoefficients->size() > largerCoefficients->size()) {
134
+ ArrayRef<int> temp(smallerCoefficients);
135
+ smallerCoefficients = largerCoefficients;
136
+ largerCoefficients = temp;
137
+ }
138
+ ArrayRef<int> sumDiff (new Array<int>(largerCoefficients->size()));
139
+ int lengthDiff = largerCoefficients->size() - smallerCoefficients->size();
140
+ // Copy high-order terms only found in higher-degree polynomial's coefficients
141
+ for (int i = 0; i < lengthDiff; i++) {
142
+ sumDiff[i] = largerCoefficients[i];
143
+ }
144
+
145
+ for (int i = lengthDiff; i < largerCoefficients->size(); i++) {
146
+ sumDiff[i] = field_.add(smallerCoefficients[i - lengthDiff], largerCoefficients[i]);
147
+ }
148
+
149
+ return Ref<ModulusPoly>(new ModulusPoly(field_, sumDiff));
150
+ }
151
+
152
+ Ref<ModulusPoly> ModulusPoly::subtract(Ref<ModulusPoly> other) {
153
+ if (&field_ != &other->field_) {
154
+ throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field");
155
+ }
156
+ if (other->isZero()) {
157
+ return Ref<ModulusPoly>(this);
158
+ }
159
+ return add(other->negative());
160
+ }
161
+
162
+ Ref<ModulusPoly> ModulusPoly::multiply(Ref<ModulusPoly> other) {
163
+ if (&field_ != &other->field_) {
164
+ throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field");
165
+ }
166
+ if (isZero() || other->isZero()) {
167
+ return field_.getZero();
168
+ }
169
+ int i,j;
170
+ ArrayRef<int> aCoefficients = coefficients_;
171
+ int aLength = aCoefficients->size();
172
+ ArrayRef<int> bCoefficients = other->coefficients_;
173
+ int bLength = bCoefficients->size();
174
+ ArrayRef<int> product (new Array<int>(aLength + bLength - 1));
175
+ for (i = 0; i < aLength; i++) {
176
+ int aCoeff = aCoefficients[i];
177
+ for (j = 0; j < bLength; j++) {
178
+ product[i + j] = field_.add(product[i + j], field_.multiply(aCoeff, bCoefficients[j]));
179
+ }
180
+ }
181
+ return Ref<ModulusPoly>(new ModulusPoly(field_, product));
182
+ }
183
+
184
+ Ref<ModulusPoly> ModulusPoly::negative() {
185
+ int size = coefficients_->size();
186
+ ArrayRef<int> negativeCoefficients (new Array<int>(size));
187
+ for (int i = 0; i < size; i++) {
188
+ negativeCoefficients[i] = field_.subtract(0, coefficients_[i]);
189
+ }
190
+ return Ref<ModulusPoly>(new ModulusPoly(field_, negativeCoefficients));
191
+ }
192
+
193
+ Ref<ModulusPoly> ModulusPoly::multiply(int scalar) {
194
+ if (scalar == 0) {
195
+ return field_.getZero();
196
+ }
197
+ if (scalar == 1) {
198
+ return Ref<ModulusPoly>(this);
199
+ }
200
+ int size = coefficients_->size();
201
+ ArrayRef<int> product( new Array<int>(size));
202
+ for (int i = 0; i < size; i++) {
203
+ product[i] = field_.multiply(coefficients_[i], scalar);
204
+ }
205
+ return Ref<ModulusPoly>(new ModulusPoly(field_, product));
206
+ }
207
+
208
+ Ref<ModulusPoly> ModulusPoly::multiplyByMonomial(int degree, int coefficient) {
209
+ if (degree < 0) {
210
+ throw new IllegalArgumentException("negative degree!");
211
+ }
212
+ if (coefficient == 0) {
213
+ return field_.getZero();
214
+ }
215
+ int size = coefficients_->size();
216
+ ArrayRef<int> product (new Array<int>(size + degree));
217
+ for (int i = 0; i < size; i++) {
218
+ product[i] = field_.multiply(coefficients_[i], coefficient);
219
+ }
220
+ return Ref<ModulusPoly>(new ModulusPoly(field_, product));
221
+ }
222
+
223
+ std::vector<Ref<ModulusPoly> > ModulusPoly::divide(Ref<ModulusPoly> other) {
224
+ if (&field_ != &other->field_) {
225
+ throw new IllegalArgumentException("ModulusPolys do not have same ModulusGF field");
226
+ }
227
+ if (other->isZero()) {
228
+ throw new IllegalArgumentException("Divide by 0");
229
+ }
230
+
231
+ Ref<ModulusPoly> quotient (field_.getZero());
232
+ Ref<ModulusPoly> remainder (this);
233
+
234
+ int denominatorLeadingTerm = other->getCoefficient(other->getDegree());
235
+ int inverseDenominatorLeadingTerm = field_.inverse(denominatorLeadingTerm);
236
+
237
+ while (remainder->getDegree() >= other->getDegree() && !remainder->isZero()) {
238
+ int degreeDifference = remainder->getDegree() - other->getDegree();
239
+ int scale = field_.multiply(remainder->getCoefficient(remainder->getDegree()), inverseDenominatorLeadingTerm);
240
+ Ref<ModulusPoly> term (other->multiplyByMonomial(degreeDifference, scale));
241
+ Ref<ModulusPoly> iterationQuotient (field_.buildMonomial(degreeDifference, scale));
242
+ quotient = quotient->add(iterationQuotient);
243
+ remainder = remainder->subtract(term);
244
+ }
245
+
246
+ std::vector<Ref<ModulusPoly> > result(2);
247
+ result[0] = quotient;
248
+ result[1] = remainder;
249
+ return result;
250
+ }
251
+
252
+ #if 0
253
+ @Override
254
+ public String toString() {
255
+ StringBuilder result = new StringBuilder(8 * getDegree());
256
+ for (int degree = getDegree(); degree >= 0; degree--) {
257
+ int coefficient = getCoefficient(degree);
258
+ if (coefficient != 0) {
259
+ if (coefficient < 0) {
260
+ result.append(" - ");
261
+ coefficient = -coefficient;
262
+ } else {
263
+ if (result.length() > 0) {
264
+ result.append(" + ");
265
+ }
266
+ }
267
+ if (degree == 0 || coefficient != 1) {
268
+ result.append(coefficient);
269
+ }
270
+ if (degree != 0) {
271
+ if (degree == 1) {
272
+ result.append('x');
273
+ } else {
274
+ result.append("x^");
275
+ result.append(degree);
276
+ }
277
+ }
278
+ }
279
+ }
280
+ return result.toString();
281
+ }
282
+ #endif
283
+
284
+ ModulusPoly::~ModulusPoly() {}