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,18 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ class ZXing::FFI::LuminanceSource
5
+ include ZXing::LuminanceSource
6
+ def initialize ptr
7
+ super ZXing::FFI::Library::LuminanceSourcePointer.new ptr
8
+ end
9
+ def width
10
+ ZXing::FFI::Library.LuminanceSource_width native
11
+ end
12
+ def height
13
+ ZXing::FFI::Library.LuminanceSource_height native
14
+ end
15
+ def matrix
16
+ ZXing::FFI::Library.LuminanceSource_matrix native
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ class ZXing::FFI::MultiFormatReader < ZXing::FFI::Reader
5
+ include ZXing::MultiFormatReader
6
+ def initialize
7
+ super ZXing::FFI::Library.MultiFormatReader_new
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ module ZXing::FFI::OneD
5
+ autoload :Code39Reader, 'zxing/ffi/oned/code_39_reader'
6
+ end
@@ -0,0 +1,10 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+ module ZXing::FFI::OneD; end
4
+
5
+ class ZXing::FFI::OneD::Code39Reader < ZXing::FFI::Reader
6
+ include ZXing::OneD::Code39Reader
7
+ def initialize usingCheckDigit, extendedMode
8
+ super ZXing::FFI::Library.Code39Reader_new usingCheckDigit, extendedMode
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ module ZXing::FFI::QRCode
5
+ autoload :Detector, 'zxing/ffi/qrcode/detector'
6
+ autoload :Decoder, 'zxing/ffi/qrcode/decoder'
7
+ autoload :QRCodeReader, 'zxing/ffi/qrcode/qrcode_reader'
8
+ end
@@ -0,0 +1,10 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+ module ZXing::FFI:QRCode; end
4
+
5
+ class ZXing::FFI::QRCode::Decoder < ZXing::FFI::Binarizer
6
+ include ZXing::QRCode::Decoder
7
+ def initialize luminance_source
8
+ super ZXing::FFI::Library.Decoder_new(luminance_source.native), luminance_source
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+ module ZXing::FFI:QRCode; end
4
+
5
+ class ZXing::FFI::QRCode::Detector < ZXing::FFI::Binarizer
6
+ include ZXing::QRCode::Detector
7
+ def initialize luminance_source
8
+ super ZXing::FFI::Library.Detector_new(luminance_source.native), luminance_source
9
+ end
10
+ end
@@ -0,0 +1,58 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ class ZXing::FFI::Reader
5
+ include ZXing::Reader
6
+ def initialize ptr
7
+ super ZXing::FFI::Library::ReaderPointer.new ptr
8
+ end
9
+
10
+ def decode bitmap, hints = nil
11
+ hints ||= {}
12
+ th = hints[:try_harder]
13
+ hints.delete :try_harder
14
+ native_hints = nil
15
+ if hints.empty?
16
+ native_hints = ZXing::FFI::Library::DecodeHintsPointer.new(ZXing::FFI::Library.DecodeHints_default)
17
+ else
18
+ native_hints = ZXing::FFI::Library::DecodeHintsPointer.new(ZXing::FFI::Library.DecodeHints_new(0))
19
+ hints.each do |k, v|
20
+ case k
21
+ when :possible_formats
22
+ v.each do |format|
23
+ case format
24
+ when :DATA_MATRIX
25
+ ZXing::FFI::Library.
26
+ DecodeHints_setDataMatrix native_hints, true
27
+ else
28
+ raise "implement hint for #{format}"
29
+ end
30
+ end
31
+ else
32
+ raise "implement #{k} #{v}"
33
+ end
34
+ end
35
+ end
36
+ if th
37
+ ZXing::FFI::Library.DecodeHints_setTryHarder native_hints, th
38
+ end
39
+ # p @native, bitmap.native, native_hints
40
+ ptr = ZXing::FFI::Library.Reader_decode @native, bitmap.native, native_hints
41
+ # p ptr
42
+ if (ptr.address & 1) != 0
43
+ ptr = FFI::Pointer.new(ptr.address & ~1)
44
+ ptrs = ptr.read_array_of_pointer 2
45
+
46
+ className = ptrs[0].read_string.sub(%r{^zxing},"ZXing")
47
+ what = ptrs[1].read_string
48
+
49
+ ZXing::FFI::Library.free ptrs[1]
50
+ ZXing::FFI::Library.free ptr
51
+
52
+ cls = className.split("::").inject(Object) { |parent, child| parent.const_get(child) }
53
+
54
+ raise cls.new what
55
+ end
56
+ ZXing::Result.new ZXing::FFI::Library::ResultPointer.new ptr
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ module ZXing; end
2
+ module ZXing::FFI; end
3
+
4
+ class ZXing::FFI::Result
5
+ include ZXing::Result
6
+
7
+ def format
8
+ enum = ZXing::FFI::Library.Result_getBarcodeFormat @native
9
+ ZXing::FFI::Library.BarcodeFormat_enum_to_string enum
10
+ end
11
+
12
+ def text
13
+ s = ZXing::FFI::Library.String_string ZXing::FFI::Library::StringPointer.new(ZXing::FFI::Library.Result_getText(@native))
14
+ if RUBY_VERSION =~ /^1.9/
15
+ s.force_encoding("UTF-8")
16
+ end
17
+ s
18
+ end
19
+
20
+ def metadata
21
+ end
22
+
23
+ end
@@ -0,0 +1,4 @@
1
+ module ZXing; end
2
+
3
+ class ZXing::FormatException < Exception
4
+ end
@@ -0,0 +1,4 @@
1
+ module ZXing; end
2
+
3
+ class ZXing::IllegalArgumentException < ZXing::Exception
4
+ end
@@ -0,0 +1,15 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::Image
4
+
5
+ def self.read *args
6
+ ZXing::RMagick::Image::read(*args)
7
+ end
8
+
9
+ attr_reader :native
10
+
11
+ def initialize native
12
+ @native = native
13
+ end
14
+
15
+ end
@@ -0,0 +1,18 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::LuminanceSource
4
+
5
+ def self.new image
6
+ if self == ZXing::LuminanceSource
7
+ image.class.const_get("LuminanceSource").new image
8
+ else
9
+ super
10
+ end
11
+ end
12
+
13
+ attr_reader :native
14
+
15
+ def initialize native
16
+ @native = native
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::MultiFormatReader
4
+ def self.new *args
5
+ if self == ZXing::MultiFormatReader
6
+ ZXing::FFI::MultiFormatReader.new
7
+ else
8
+ super
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module ZXing; end
2
+
3
+ class ZXing::NotFoundException < ZXing::Exception
4
+ end
data/lib/zxing/oned.rb ADDED
@@ -0,0 +1,5 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::OneD
4
+ autoload :Code39Reader, 'zxing/oned/code_39_reader'
5
+ end
@@ -0,0 +1,15 @@
1
+ module ZXing; end
2
+ module ZXing::OneD; end
3
+
4
+ module ZXing::OneD::Code39Reader
5
+ extend ZXing::Reader
6
+
7
+ def self.new *args
8
+ if self == ZXing::OneD::Code39Reader
9
+ ZXing::FFI::OneD::Code39Reader.new(*args)
10
+ else
11
+ super
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,8 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::QRCode
4
+ autoload :QRCodeReader, 'zxing/qrcode/qrcode_reader'
5
+ autoload :Detector, 'zxing/qrcode/detector'
6
+ autoload :Decoder, 'zxing/qrcode/decoder'
7
+ autoload :Encoder, 'zxing/qrcode/encoder'
8
+ end
@@ -0,0 +1,14 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+
4
+ module ZXing::QRCode::Decoder
5
+ include ZXing::Binarizer
6
+
7
+ def self.new *args
8
+ if self == ZXing::QRCode::Decoder
9
+ ZXing::FFI::QRCode::Decoder.new(*args)
10
+ else
11
+ super
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+
4
+ module ZXing::QRCode::Detector
5
+ include ZXing::Binarizer
6
+
7
+ def self.new *args
8
+ if self == ZXing::QRCode::Detector
9
+ ZXing::FFI::QRCode::Detector.new(*args)
10
+ else
11
+ super
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+
4
+ module ZXing::QRCode::Encoder
5
+ autoload :Encoder, 'zxing/qrcode/encoder/encoder'
6
+ autoload :QRCode, 'zxing/qrcode/encoder/qrcode'
7
+ autoload :ByteMatrix, 'zxing/qrcode/encoder/byte_matrix'
8
+ end
@@ -0,0 +1,18 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+ module ZXing::QRCode::Encoder; end
4
+
5
+ module ZXing::QRCode::Encoder::ByteMatrix
6
+ def self.new *args
7
+ if self == ZXing::QRCode::Encoder::ByteMatrix
8
+ ZXing::FFI::QRCode::Encoder::ByteMatrix.new(*args)
9
+ else
10
+ super
11
+ end
12
+ end
13
+
14
+ attr_reader :native
15
+ def initialize native
16
+ @native = native
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+ module ZXing::QRCode::Encoder; end
4
+
5
+ module ZXing::QRCode::Encoder::Encoder
6
+ def self.encode *args
7
+ ZXing::FFI::QRCode::Encoder::Encoder.encode *args
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ module ZXing; end
2
+ module ZXing::QRCode; end
3
+ module ZXing::QRCode::Encoder; end
4
+
5
+ module ZXing::QRCode::Encoder::QRCode
6
+ def self.new *args
7
+ if self == ZXing::QRCode::Encoder::QRCode
8
+ ZXing::FFI::QRCode::Encoder::QRCode.new(*args)
9
+ else
10
+ super
11
+ end
12
+ end
13
+
14
+ attr_reader :native
15
+ def initialize native
16
+ @native = native
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::Reader
4
+ attr_reader :native
5
+ def initialize native
6
+ @native = native
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ module ZXing; end
2
+
3
+ class ZXing::ReaderException < ZXing::Exception
4
+ end
@@ -0,0 +1,2 @@
1
+ module ZXing; end
2
+ class ZXing::ReedSolomonException < ZXing::Exception; end
@@ -0,0 +1,18 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::Result
4
+ def self.new *args
5
+ if self == ZXing::Result
6
+ ZXing::FFI::Result.new(*args)
7
+ else
8
+ super
9
+ end
10
+ end
11
+
12
+ attr_reader :native
13
+
14
+ def initialize native
15
+ @native = native
16
+ end
17
+
18
+ end
@@ -0,0 +1,5 @@
1
+ module ZXing; end
2
+
3
+ module ZXing::RMagick
4
+ autoload :Image, 'zxing/rmagick/image'
5
+ end
@@ -0,0 +1,104 @@
1
+ require 'RMagick'
2
+
3
+ module ZXing; end
4
+ module ZXing::RMagick; end
5
+
6
+ class ZXing::RMagick::Image
7
+ include ZXing::Image
8
+ LuminanceSource = ZXing::FFI::Common::GreyscaleLuminanceSource
9
+
10
+ def self.read argument
11
+ img = nil
12
+
13
+ if argument.is_a? String
14
+ if argument.encoding.name == Encoding.aliases['BINARY']
15
+ begin
16
+ img = Magick::Image.from_blob(argument)[0]
17
+ rescue Exception => e
18
+ # Because 'BINARY' is just an alias for ASCII-8BIT, if treating the
19
+ # argument as image blob failed, we should continue on and try treat
20
+ # the argument like a regular string.
21
+ end
22
+ end
23
+ end
24
+
25
+ if img.nil?
26
+ require 'uri'
27
+ require 'pathname'
28
+
29
+ uri = URI.parse(argument.respond_to?(:path) ? argument.path : argument.to_s)
30
+
31
+ if uri.scheme.nil?
32
+ uri.scheme = "file"
33
+ uri.path = Pathname.new(uri.path).realpath.to_s
34
+ end
35
+
36
+ begin
37
+ img = case uri.scheme
38
+ when "file"; Magick::Image.read(uri.path)[0]
39
+ else; Magick::Image.from_blob(fetch(uri).body)[0]
40
+ end
41
+ rescue Exception => e
42
+ raise ZXing::BadImageException.new e.message
43
+ end
44
+ end
45
+
46
+ # p Magick::Magick_version
47
+ # p img.colorspace
48
+ img.colorspace = Magick::RGBColorspace
49
+ # p img.colorspace
50
+
51
+ if false
52
+ (8..8).each do |j|
53
+ (8..8).each do |i|
54
+ p i,j
55
+ pixel = img.pixel_color(i,j)
56
+ r = pixel.red&0xff
57
+ g = pixel.green&0xff
58
+ b = pixel.blue&0xff
59
+ p ['%x'%r, '%x'%g, '%x'%b]
60
+ p [r, g, b]
61
+ p ((306 * (r) + 601 * (g) + 117 * (b) + (1 << 9)) >> 10)
62
+ p img.export_pixels_to_str(i, j, 1, 1, "I").ord
63
+ p "x"
64
+ end
65
+ end
66
+ end
67
+
68
+ self.new img
69
+ end
70
+
71
+ def rotate angle
72
+ self.class.new @native.rotate(angle)
73
+ end
74
+
75
+ def width
76
+ @native.columns
77
+ end
78
+
79
+ def height
80
+ @native.rows
81
+ end
82
+
83
+ def gray
84
+ @native.export_pixels_to_str(0, 0, @native.columns, @native.rows, "I")
85
+ end
86
+
87
+ private
88
+
89
+ def self.fetch(uri, limit = 10)
90
+ # You should choose better exception.
91
+ raise ArgumentError, 'HTTP redirect too deep' if limit == 0
92
+
93
+ require 'net/http'
94
+
95
+ response = Net::HTTP.get_response(uri)
96
+ case response
97
+ when Net::HTTPSuccess; response
98
+ when Net::HTTPRedirection
99
+ fetch(URI.parse(response['location']), limit-1)
100
+ else
101
+ response.error!
102
+ end
103
+ end
104
+ end