rmagick-windows 2.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +14 -0
  3. data/.gitignore +23 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +340 -0
  7. data/.simplecov +27 -0
  8. data/.travis.yml +60 -0
  9. data/CHANGELOG.md +915 -0
  10. data/CODE_OF_CONDUCT.md +13 -0
  11. data/CONTRIBUTING.md +50 -0
  12. data/Doxyfile +1514 -0
  13. data/Gemfile +10 -0
  14. data/LICENSE +20 -0
  15. data/README.textile +257 -0
  16. data/Rakefile +188 -0
  17. data/before_install_linux.sh +32 -0
  18. data/before_install_osx.sh +2 -0
  19. data/deprecated/RMagick.rb +6 -0
  20. data/doc/.cvsignore +1 -0
  21. data/doc/comtasks.html +287 -0
  22. data/doc/constants.html +1581 -0
  23. data/doc/css/doc.css +299 -0
  24. data/doc/css/popup.css +34 -0
  25. data/doc/css/ref.css +67 -0
  26. data/doc/draw.html +3272 -0
  27. data/doc/ex/InitialCoords.rb +22 -0
  28. data/doc/ex/NewCoordSys.rb +30 -0
  29. data/doc/ex/OrigCoordSys.rb +16 -0
  30. data/doc/ex/PreserveAspectRatio.rb +204 -0
  31. data/doc/ex/RotateScale.rb +36 -0
  32. data/doc/ex/Skew.rb +38 -0
  33. data/doc/ex/Use01.rb +15 -0
  34. data/doc/ex/Use02.rb +20 -0
  35. data/doc/ex/Use03.rb +16 -0
  36. data/doc/ex/ViewBox.rb +31 -0
  37. data/doc/ex/adaptive_threshold.rb +9 -0
  38. data/doc/ex/add_noise.rb +16 -0
  39. data/doc/ex/affine.rb +48 -0
  40. data/doc/ex/affine_transform.rb +20 -0
  41. data/doc/ex/arc.rb +49 -0
  42. data/doc/ex/arcpath.rb +32 -0
  43. data/doc/ex/arcs01.rb +28 -0
  44. data/doc/ex/arcs02.rb +59 -0
  45. data/doc/ex/average.rb +15 -0
  46. data/doc/ex/axes.rb +64 -0
  47. data/doc/ex/baseline_shift01.rb +17 -0
  48. data/doc/ex/bilevel_channel.rb +8 -0
  49. data/doc/ex/blur_image.rb +12 -0
  50. data/doc/ex/border.rb +10 -0
  51. data/doc/ex/bounding_box.rb +42 -0
  52. data/doc/ex/cbezier1.rb +41 -0
  53. data/doc/ex/cbezier2.rb +41 -0
  54. data/doc/ex/cbezier3.rb +41 -0
  55. data/doc/ex/cbezier4.rb +42 -0
  56. data/doc/ex/cbezier5.rb +42 -0
  57. data/doc/ex/cbezier6.rb +53 -0
  58. data/doc/ex/channel.rb +25 -0
  59. data/doc/ex/charcoal.rb +12 -0
  60. data/doc/ex/chop.rb +29 -0
  61. data/doc/ex/circle.rb +33 -0
  62. data/doc/ex/circle01.rb +16 -0
  63. data/doc/ex/clip_path.rb +60 -0
  64. data/doc/ex/coalesce.rb +57 -0
  65. data/doc/ex/color_fill_to_border.rb +29 -0
  66. data/doc/ex/color_floodfill.rb +28 -0
  67. data/doc/ex/color_histogram.rb +47 -0
  68. data/doc/ex/color_reset.rb +11 -0
  69. data/doc/ex/colorize.rb +16 -0
  70. data/doc/ex/colors.rb +64 -0
  71. data/doc/ex/compose_mask.rb +22 -0
  72. data/doc/ex/composite.rb +133 -0
  73. data/doc/ex/composite_layers.rb +53 -0
  74. data/doc/ex/composite_tiled.rb +21 -0
  75. data/doc/ex/contrast.rb +36 -0
  76. data/doc/ex/crop.rb +31 -0
  77. data/doc/ex/crop_with_gravity.rb +42 -0
  78. data/doc/ex/cubic01.rb +43 -0
  79. data/doc/ex/cubic02.rb +91 -0
  80. data/doc/ex/cycle_colormap.rb +21 -0
  81. data/doc/ex/dissolve.rb +12 -0
  82. data/doc/ex/drawcomp.rb +42 -0
  83. data/doc/ex/drop_shadow.rb +60 -0
  84. data/doc/ex/edge.rb +11 -0
  85. data/doc/ex/ellipse.rb +45 -0
  86. data/doc/ex/ellipse01.rb +21 -0
  87. data/doc/ex/emboss.rb +11 -0
  88. data/doc/ex/enhance.rb +28 -0
  89. data/doc/ex/equalize.rb +11 -0
  90. data/doc/ex/evenodd.rb +42 -0
  91. data/doc/ex/fill_pattern.rb +23 -0
  92. data/doc/ex/flatten_images.rb +36 -0
  93. data/doc/ex/flip.rb +11 -0
  94. data/doc/ex/flop.rb +11 -0
  95. data/doc/ex/font_styles.rb +32 -0
  96. data/doc/ex/fonts.rb +20 -0
  97. data/doc/ex/frame.rb +12 -0
  98. data/doc/ex/gaussian_blur.rb +11 -0
  99. data/doc/ex/get_multiline_type_metrics.rb +41 -0
  100. data/doc/ex/get_pixels.rb +47 -0
  101. data/doc/ex/get_type_metrics.rb +141 -0
  102. data/doc/ex/gradientfill.rb +27 -0
  103. data/doc/ex/grav.rb +45 -0
  104. data/doc/ex/gravity.rb +80 -0
  105. data/doc/ex/group.rb +26 -0
  106. data/doc/ex/hatchfill.rb +27 -0
  107. data/doc/ex/image.rb +44 -0
  108. data/doc/ex/images/Apple.miff +0 -0
  109. data/doc/ex/images/Ballerina.jpg +0 -0
  110. data/doc/ex/images/Ballerina3.jpg +0 -0
  111. data/doc/ex/images/Button_0.gif +0 -0
  112. data/doc/ex/images/Button_1.gif +0 -0
  113. data/doc/ex/images/Button_2.gif +0 -0
  114. data/doc/ex/images/Button_3.gif +0 -0
  115. data/doc/ex/images/Button_4.gif +0 -0
  116. data/doc/ex/images/Button_5.gif +0 -0
  117. data/doc/ex/images/Button_6.gif +0 -0
  118. data/doc/ex/images/Button_7.gif +0 -0
  119. data/doc/ex/images/Button_8.gif +0 -0
  120. data/doc/ex/images/Button_9.gif +0 -0
  121. data/doc/ex/images/Button_A.gif +0 -0
  122. data/doc/ex/images/Button_B.gif +0 -0
  123. data/doc/ex/images/Button_C.gif +0 -0
  124. data/doc/ex/images/Button_D.gif +0 -0
  125. data/doc/ex/images/Button_E.gif +0 -0
  126. data/doc/ex/images/Button_F.gif +0 -0
  127. data/doc/ex/images/Button_G.gif +0 -0
  128. data/doc/ex/images/Button_H.gif +0 -0
  129. data/doc/ex/images/Button_I.gif +0 -0
  130. data/doc/ex/images/Button_J.gif +0 -0
  131. data/doc/ex/images/Button_K.gif +0 -0
  132. data/doc/ex/images/Button_L.gif +0 -0
  133. data/doc/ex/images/Button_M.gif +0 -0
  134. data/doc/ex/images/Button_N.gif +0 -0
  135. data/doc/ex/images/Button_O.gif +0 -0
  136. data/doc/ex/images/Button_P.gif +0 -0
  137. data/doc/ex/images/Button_Q.gif +0 -0
  138. data/doc/ex/images/Button_R.gif +0 -0
  139. data/doc/ex/images/Button_S.gif +0 -0
  140. data/doc/ex/images/Button_T.gif +0 -0
  141. data/doc/ex/images/Button_U.gif +0 -0
  142. data/doc/ex/images/Button_V.gif +0 -0
  143. data/doc/ex/images/Button_W.gif +0 -0
  144. data/doc/ex/images/Button_X.gif +0 -0
  145. data/doc/ex/images/Button_Y.gif +0 -0
  146. data/doc/ex/images/Button_Z.gif +0 -0
  147. data/doc/ex/images/Cheetah.jpg +0 -0
  148. data/doc/ex/images/Coffee.wmf +0 -0
  149. data/doc/ex/images/Flower_Hat.jpg +0 -0
  150. data/doc/ex/images/Gold_Statue.jpg +0 -0
  151. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  152. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  153. data/doc/ex/images/Leaf.miff +0 -0
  154. data/doc/ex/images/No.wmf +0 -0
  155. data/doc/ex/images/Polynesia.jpg +0 -0
  156. data/doc/ex/images/Red_Rocks.jpg +0 -0
  157. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  158. data/doc/ex/images/Shorts.jpg +0 -0
  159. data/doc/ex/images/Snake.wmf +0 -0
  160. data/doc/ex/images/Violin.jpg +0 -0
  161. data/doc/ex/images/Yellow_Rose.miff +0 -0
  162. data/doc/ex/images/big-duck.gif +0 -0
  163. data/doc/ex/images/duck.gif +0 -0
  164. data/doc/ex/images/duck0.gif +0 -0
  165. data/doc/ex/images/duck1.gif +0 -0
  166. data/doc/ex/images/duck10.gif +0 -0
  167. data/doc/ex/images/duck11.gif +0 -0
  168. data/doc/ex/images/duck12.gif +0 -0
  169. data/doc/ex/images/duck13.gif +0 -0
  170. data/doc/ex/images/duck14.gif +0 -0
  171. data/doc/ex/images/duck15.gif +0 -0
  172. data/doc/ex/images/duck2.gif +0 -0
  173. data/doc/ex/images/duck3.gif +0 -0
  174. data/doc/ex/images/duck4.gif +0 -0
  175. data/doc/ex/images/duck5.gif +0 -0
  176. data/doc/ex/images/duck6.gif +0 -0
  177. data/doc/ex/images/duck7.gif +0 -0
  178. data/doc/ex/images/duck8.gif +0 -0
  179. data/doc/ex/images/duck9.gif +0 -0
  180. data/doc/ex/images/graydient230x6.gif +0 -0
  181. data/doc/ex/images/image_with_profile.jpg +0 -0
  182. data/doc/ex/images/logo400x83.gif +0 -0
  183. data/doc/ex/images/model.miff +0 -0
  184. data/doc/ex/images/notimplemented.gif +0 -0
  185. data/doc/ex/images/smile.miff +0 -0
  186. data/doc/ex/images/spin.gif +0 -0
  187. data/doc/ex/implode.rb +34 -0
  188. data/doc/ex/level.rb +11 -0
  189. data/doc/ex/level_colors.rb +11 -0
  190. data/doc/ex/line.rb +41 -0
  191. data/doc/ex/line01.rb +21 -0
  192. data/doc/ex/mask.rb +35 -0
  193. data/doc/ex/matte_fill_to_border.rb +39 -0
  194. data/doc/ex/matte_floodfill.rb +32 -0
  195. data/doc/ex/matte_replace.rb +39 -0
  196. data/doc/ex/median_filter.rb +28 -0
  197. data/doc/ex/modulate.rb +11 -0
  198. data/doc/ex/mono.rb +23 -0
  199. data/doc/ex/morph.rb +25 -0
  200. data/doc/ex/mosaic.rb +35 -0
  201. data/doc/ex/motion_blur.rb +11 -0
  202. data/doc/ex/negate.rb +11 -0
  203. data/doc/ex/negate_channel.rb +9 -0
  204. data/doc/ex/nested_rvg.rb +21 -0
  205. data/doc/ex/nonzero.rb +42 -0
  206. data/doc/ex/normalize.rb +11 -0
  207. data/doc/ex/oil_paint.rb +11 -0
  208. data/doc/ex/opacity.rb +37 -0
  209. data/doc/ex/ordered_dither.rb +11 -0
  210. data/doc/ex/path.rb +63 -0
  211. data/doc/ex/pattern1.rb +25 -0
  212. data/doc/ex/pattern2.rb +26 -0
  213. data/doc/ex/polaroid.rb +27 -0
  214. data/doc/ex/polygon.rb +23 -0
  215. data/doc/ex/polygon01.rb +21 -0
  216. data/doc/ex/polyline.rb +22 -0
  217. data/doc/ex/polyline01.rb +21 -0
  218. data/doc/ex/posterize.rb +8 -0
  219. data/doc/ex/preview.rb +8 -0
  220. data/doc/ex/qbezierpath.rb +52 -0
  221. data/doc/ex/quad01.rb +34 -0
  222. data/doc/ex/quantize-m.rb +25 -0
  223. data/doc/ex/radial_blur.rb +9 -0
  224. data/doc/ex/raise.rb +8 -0
  225. data/doc/ex/random_threshold_channel.rb +13 -0
  226. data/doc/ex/rect01.rb +14 -0
  227. data/doc/ex/rect02.rb +20 -0
  228. data/doc/ex/rectangle.rb +34 -0
  229. data/doc/ex/reduce_noise.rb +28 -0
  230. data/doc/ex/remap.rb +11 -0
  231. data/doc/ex/remap_images.rb +19 -0
  232. data/doc/ex/resize_to_fill.rb +8 -0
  233. data/doc/ex/resize_to_fit.rb +8 -0
  234. data/doc/ex/roll.rb +9 -0
  235. data/doc/ex/rotate.rb +44 -0
  236. data/doc/ex/rotate_f.rb +14 -0
  237. data/doc/ex/roundrect.rb +33 -0
  238. data/doc/ex/rubyname.rb +30 -0
  239. data/doc/ex/rvg_clippath.rb +12 -0
  240. data/doc/ex/rvg_linecap.rb +42 -0
  241. data/doc/ex/rvg_linejoin.rb +40 -0
  242. data/doc/ex/rvg_opacity.rb +18 -0
  243. data/doc/ex/rvg_pattern.rb +26 -0
  244. data/doc/ex/rvg_stroke_dasharray.rb +11 -0
  245. data/doc/ex/segment.rb +11 -0
  246. data/doc/ex/sepiatone.rb +7 -0
  247. data/doc/ex/shade.rb +11 -0
  248. data/doc/ex/shadow.rb +30 -0
  249. data/doc/ex/shave.rb +15 -0
  250. data/doc/ex/shear.rb +10 -0
  251. data/doc/ex/sketch.rb +17 -0
  252. data/doc/ex/skewx.rb +51 -0
  253. data/doc/ex/skewy.rb +47 -0
  254. data/doc/ex/smile.rb +125 -0
  255. data/doc/ex/solarize.rb +11 -0
  256. data/doc/ex/sparse_color.rb +54 -0
  257. data/doc/ex/splice.rb +8 -0
  258. data/doc/ex/spread.rb +11 -0
  259. data/doc/ex/stegano.rb +55 -0
  260. data/doc/ex/stroke_dasharray.rb +42 -0
  261. data/doc/ex/stroke_fill.rb +10 -0
  262. data/doc/ex/stroke_linecap.rb +44 -0
  263. data/doc/ex/stroke_linejoin.rb +48 -0
  264. data/doc/ex/stroke_width.rb +49 -0
  265. data/doc/ex/swirl.rb +17 -0
  266. data/doc/ex/text.rb +37 -0
  267. data/doc/ex/text01.rb +16 -0
  268. data/doc/ex/text_align.rb +36 -0
  269. data/doc/ex/text_antialias.rb +37 -0
  270. data/doc/ex/text_styles.rb +19 -0
  271. data/doc/ex/text_undercolor.rb +28 -0
  272. data/doc/ex/texture_fill_to_border.rb +34 -0
  273. data/doc/ex/texture_floodfill.rb +32 -0
  274. data/doc/ex/texturefill.rb +24 -0
  275. data/doc/ex/threshold.rb +13 -0
  276. data/doc/ex/to_blob.rb +13 -0
  277. data/doc/ex/translate.rb +39 -0
  278. data/doc/ex/transparent.rb +38 -0
  279. data/doc/ex/transpose.rb +9 -0
  280. data/doc/ex/transverse.rb +9 -0
  281. data/doc/ex/tref01.rb +24 -0
  282. data/doc/ex/triangle01.rb +15 -0
  283. data/doc/ex/trim.rb +23 -0
  284. data/doc/ex/tspan01.rb +17 -0
  285. data/doc/ex/tspan02.rb +17 -0
  286. data/doc/ex/tspan03.rb +19 -0
  287. data/doc/ex/unsharp_mask.rb +28 -0
  288. data/doc/ex/viewex.rb +33 -0
  289. data/doc/ex/vignette.rb +12 -0
  290. data/doc/ex/watermark.rb +27 -0
  291. data/doc/ex/wave.rb +9 -0
  292. data/doc/ex/wet_floor.rb +58 -0
  293. data/doc/ex/writing_mode01.rb +26 -0
  294. data/doc/ex/writing_mode02.rb +26 -0
  295. data/doc/ilist.html +2056 -0
  296. data/doc/image1.html +4680 -0
  297. data/doc/image2.html +3665 -0
  298. data/doc/image3.html +4522 -0
  299. data/doc/imageattrs.html +1638 -0
  300. data/doc/imusage.html +514 -0
  301. data/doc/index.html +416 -0
  302. data/doc/info.html +1499 -0
  303. data/doc/magick.html +565 -0
  304. data/doc/optequiv.html +2435 -0
  305. data/doc/rvg.html +975 -0
  306. data/doc/rvgclip.html +248 -0
  307. data/doc/rvggroup.html +305 -0
  308. data/doc/rvgimage.html +289 -0
  309. data/doc/rvgpattern.html +475 -0
  310. data/doc/rvgshape.html +406 -0
  311. data/doc/rvgstyle.html +270 -0
  312. data/doc/rvgtext.html +465 -0
  313. data/doc/rvgtspan.html +238 -0
  314. data/doc/rvgtut.html +530 -0
  315. data/doc/rvguse.html +145 -0
  316. data/doc/rvgxform.html +294 -0
  317. data/doc/scripts/doc.js +22 -0
  318. data/doc/scripts/stripeTables.js +23 -0
  319. data/doc/struct.html +1339 -0
  320. data/doc/usage.html +1621 -0
  321. data/examples/constitute.rb +7 -0
  322. data/examples/crop_with_gravity.rb +42 -0
  323. data/examples/demo.rb +324 -0
  324. data/examples/describe.rb +43 -0
  325. data/examples/find_similar_region.rb +34 -0
  326. data/examples/histogram.rb +321 -0
  327. data/examples/identify.rb +185 -0
  328. data/examples/image_opacity.rb +29 -0
  329. data/examples/import_export.rb +31 -0
  330. data/examples/pattern_fill.rb +38 -0
  331. data/examples/rotating_text.rb +44 -0
  332. data/examples/spinner.rb +49 -0
  333. data/examples/thumbnail.rb +64 -0
  334. data/examples/vignette.rb +78 -0
  335. data/ext/RMagick/extconf.rb +548 -0
  336. data/ext/RMagick/rmagick.c +401 -0
  337. data/ext/RMagick/rmagick.h +1287 -0
  338. data/ext/RMagick/rmdraw.c +2022 -0
  339. data/ext/RMagick/rmenum.c +1235 -0
  340. data/ext/RMagick/rmfill.c +720 -0
  341. data/ext/RMagick/rmilist.c +1270 -0
  342. data/ext/RMagick/rmimage.c +15427 -0
  343. data/ext/RMagick/rminfo.c +2590 -0
  344. data/ext/RMagick/rmmain.c +1741 -0
  345. data/ext/RMagick/rmmontage.c +519 -0
  346. data/ext/RMagick/rmpixel.c +1114 -0
  347. data/ext/RMagick/rmstruct.c +1124 -0
  348. data/ext/RMagick/rmutil.c +1754 -0
  349. data/lib/rmagick.rb +1 -0
  350. data/lib/rmagick/version.rb +6 -0
  351. data/lib/rmagick_internal.rb +1947 -0
  352. data/lib/rvg/clippath.rb +45 -0
  353. data/lib/rvg/container.rb +122 -0
  354. data/lib/rvg/deep_equal.rb +52 -0
  355. data/lib/rvg/describable.rb +47 -0
  356. data/lib/rvg/embellishable.rb +391 -0
  357. data/lib/rvg/misc.rb +723 -0
  358. data/lib/rvg/paint.rb +50 -0
  359. data/lib/rvg/pathdata.rb +126 -0
  360. data/lib/rvg/rvg.rb +283 -0
  361. data/lib/rvg/stretchable.rb +165 -0
  362. data/lib/rvg/stylable.rb +116 -0
  363. data/lib/rvg/text.rb +172 -0
  364. data/lib/rvg/transformable.rb +126 -0
  365. data/lib/rvg/units.rb +63 -0
  366. data/rmagick.gemspec +46 -0
  367. data/spec/rmagick/ImageList1_spec.rb +24 -0
  368. data/spec/rmagick/draw_spec.rb +156 -0
  369. data/spec/rmagick/image/blue_shift_spec.rb +16 -0
  370. data/spec/rmagick/image/composite_spec.rb +140 -0
  371. data/spec/rmagick/image/constitute_spec.rb +15 -0
  372. data/spec/rmagick/image/dispatch_spec.rb +18 -0
  373. data/spec/rmagick/image/from_blob_spec.rb +14 -0
  374. data/spec/rmagick/image/ping_spec.rb +14 -0
  375. data/spec/rmagick/image/properties_spec.rb +29 -0
  376. data/spec/spec_helper.rb +4 -0
  377. data/test/Image1.rb +565 -0
  378. data/test/Image2.rb +1304 -0
  379. data/test/Image3.rb +1030 -0
  380. data/test/ImageList1.rb +806 -0
  381. data/test/ImageList2.rb +385 -0
  382. data/test/Image_attributes.rb +697 -0
  383. data/test/Import_Export.rb +121 -0
  384. data/test/Info.rb +345 -0
  385. data/test/Magick.rb +321 -0
  386. data/test/Pixel.rb +116 -0
  387. data/test/Preview.rb +57 -0
  388. data/test/cmyk.icm +0 -0
  389. data/test/srgb.icm +0 -0
  390. data/test/test_all_basic.rb +38 -0
  391. data/test/tmpnam_test.rb +50 -0
  392. data/wercker.yml +10 -0
  393. metadata +509 -0
@@ -0,0 +1,126 @@
1
+ #--
2
+ # $Id: transformable.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ module Magick
6
+ class RVG
7
+ # Transforms is an Array with a deep_copy method.
8
+ # During unit-testing it also has a deep_equal method.
9
+ class Transforms < Array #:nodoc:
10
+ def deep_copy(h = nil)
11
+ copy = self.class.new
12
+ each { |transform| copy << [transform[0], transform[1].dup] }
13
+ copy
14
+ end
15
+ end # class Transform
16
+
17
+ # Transformations are operations on the coordinate system.
18
+ # All the transformations defined within a container (an RVG object
19
+ # or a group) are applied before drawing any shapes or text.
20
+ # All transformations are applied in the order they were
21
+ # defined. <em>Note:</em> This means that
22
+ # g.translate(10,20).scale(2)
23
+ # is not the same as
24
+ # g.scale(2).translate(10,20)
25
+ module Transformable
26
+ private
27
+
28
+ # Apply transforms in the same order they were specified!
29
+ def add_transform_primitives(gc)
30
+ @transforms.each { |transform| gc.__send__(transform[0], *transform[1]) }
31
+ end
32
+
33
+ def initialize(*args, &block)
34
+ super()
35
+ @transforms = Transforms.new
36
+ end
37
+
38
+ public
39
+
40
+ # Applies the transformation matrix [sx, rx, ry, sy, tx, ty]
41
+ def matrix(sx, rx, ry, sy, tx, ty)
42
+ begin
43
+ @transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]]
44
+ rescue ArgumentError
45
+ raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})"
46
+ end
47
+ yield(self) if block_given?
48
+ self
49
+ end
50
+
51
+ # Add <tt>tx</tt> to all x-coordinates and <tt>ty</tt>
52
+ # to all y-coordinates. If <tt>ty</tt> is omitted it defaults
53
+ # to <tt>tx</tt>.
54
+ def translate(tx, ty = nil)
55
+ ty ||= tx
56
+ begin
57
+ @transforms << [:translate, [Float(tx), Float(ty)]]
58
+ rescue ArgumentError
59
+ raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})"
60
+ end
61
+ yield(self) if block_given?
62
+ self
63
+ end
64
+
65
+ # Multiply the x-coordinates by <tt>sx</tt> and the y-coordinates
66
+ # by <tt>sy</tt>. If <tt>sy</tt> is omitted it defaults to <tt>sx</tt>.
67
+ def scale(sx, sy = nil)
68
+ sy ||= sx
69
+ begin
70
+ @transforms << [:scale, [Float(sx), Float(sy)]]
71
+ rescue ArgumentError
72
+ raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})"
73
+ end
74
+ yield(self) if block_given?
75
+ self
76
+ end
77
+
78
+ # This method can take either of two argument lists:
79
+ # [rotate(angle)] rotate by <tt>angle</tt> degrees
80
+ # [rotate(angle, cx, cy)] rotate by <tt>angle</tt> degrees about
81
+ # the point [<tt>cx</tt>, <tt>cy</tt>].
82
+ def rotate(angle, *args)
83
+ begin
84
+ case args.length
85
+ when 0
86
+ @transforms << [:rotate, [Float(angle)]]
87
+ when 2
88
+ cx = Float(args[0])
89
+ cy = Float(args[1])
90
+ @transforms << [:translate, [cx, cy]]
91
+ @transforms << [:rotate, [angle]]
92
+ @transforms << [:translate, [-cx, -cy]]
93
+ else
94
+ fail ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
95
+ end
96
+ rescue ArgumentError
97
+ raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].collect {|a| a.class}.join(', ')})"
98
+ end
99
+ yield(self) if block_given?
100
+ self
101
+ end
102
+
103
+ # Skew the X-axis by <tt>angle</tt> degrees.
104
+ def skewX(angle)
105
+ begin
106
+ @transforms << [:skewx, [Float(angle)]]
107
+ rescue ArgumentError
108
+ raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
109
+ end
110
+ yield(self) if block_given?
111
+ self
112
+ end
113
+
114
+ # Skew the Y-axis by <tt>angle</tt> degrees.
115
+ def skewY(angle)
116
+ begin
117
+ @transforms << [:skewy, [Float(angle)]]
118
+ rescue ArgumentError
119
+ raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
120
+ end
121
+ yield(self) if block_given?
122
+ self
123
+ end
124
+ end # module Transformable
125
+ end # class RVG
126
+ end # module Magick
data/lib/rvg/units.rb ADDED
@@ -0,0 +1,63 @@
1
+ # $Id: units.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
2
+ # Copyright (C) 2009 Timothy P. Hunter
3
+ module Magick
4
+ class RVG
5
+ # Define RVG.dpi and RVG.dpi=. Add conversions to Fixnum and Float classes
6
+ class << self
7
+ attr_reader :dpi
8
+ def dpi=(n)
9
+ unless defined?(@dpi)
10
+ [Float, Fixnum].each do |c|
11
+ c.class_eval <<-END_DEFS
12
+ # the default measurement - 1px is 1 pixel
13
+ def px
14
+ self
15
+ end
16
+ # inches
17
+ def in
18
+ self * ::Magick::RVG.dpi
19
+ end
20
+ # millimeters
21
+ def mm
22
+ self * ::Magick::RVG.dpi / 25.4
23
+ end
24
+ # centimeters
25
+ def cm
26
+ self * ::Magick::RVG.dpi / 2.54
27
+ end
28
+ # points
29
+ def pt
30
+ self * ::Magick::RVG.dpi / 72.0
31
+ end
32
+ # picas
33
+ def pc
34
+ self * ::Magick::RVG.dpi / 6.0
35
+ end
36
+ # percentage of the argument
37
+ def pct(of)
38
+ self * Float(of) / 100.0
39
+ end
40
+ # the default is deg
41
+ def deg
42
+ self
43
+ end
44
+ # radians -> degrees
45
+ def rad
46
+ self * 180.0 / Math::PI
47
+ end
48
+ # grads -> degrees
49
+ def grad
50
+ self * 9.0 / 10.0
51
+ end
52
+ END_DEFS
53
+ end
54
+ end
55
+
56
+ @dpi = Float(n)
57
+ return @dpi
58
+ rescue ArgumentError
59
+ raise TypeError, "Can't convert `#{n}' to Float"
60
+ end
61
+ end # class << self
62
+ end # class RVG
63
+ end # module Magick
data/rmagick.gemspec ADDED
@@ -0,0 +1,46 @@
1
+ require 'date'
2
+ require 'English'
3
+ require './lib/rmagick/version'
4
+
5
+ def v(version)
6
+ Gem::Version.new(version)
7
+ end
8
+
9
+ # RUBY = v(RUBY_VERSION.dup)
10
+
11
+ Gem::Specification.new do |s|
12
+ s.name = 'rmagick-windows'
13
+ s.version = Magick::VERSION
14
+ s.date = Date.today.to_s
15
+ s.summary = 'Ruby binding to ImageMagick'
16
+ s.description = 'RMagick is an interface between Ruby and ImageMagick. Fix for windows.'
17
+ s.authors = ['Tim Hunter', 'Omer Bar-or', 'Benjamin Thomas', 'Moncef Maiza', 'Cedric Zuger']
18
+ s.email = 'github@benjaminfleischer.com'
19
+ s.homepage = 'https://github.com/czuger/rmagick'
20
+ s.license = 'MIT'
21
+
22
+ tracked_files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
23
+ file_exclusion_regex = %r{(\Alib/rvg/to_c.rb)}
24
+ files = tracked_files.reject{|file| file[file_exclusion_regex] }
25
+ test_files = files.grep(%r{^(test|spec|features)/})
26
+ executables = files.grep(%r{^bin/}).map{ |f| File.basename(f) }
27
+
28
+ s.files = files
29
+ s.test_files = test_files
30
+ s.executables = executables
31
+ s.require_paths << 'ext' << 'deprecated'
32
+
33
+ s.rubyforge_project = 'rmagick'
34
+ s.extensions = %w{ext/RMagick/extconf.rb}
35
+ s.has_rdoc = false
36
+ s.required_ruby_version = ">= #{Magick::MIN_RUBY_VERSION}"
37
+ s.requirements << "ImageMagick #{Magick::MIN_IM_VERSION} or later"
38
+
39
+ s.add_development_dependency 'rake-compiler'
40
+ s.add_development_dependency 'rspec', '~> 3'
41
+ s.add_development_dependency 'rubocop', '~> 0.33.0'
42
+
43
+ # if RUBY >= v('2.2.0')
44
+ # s.add_development_dependency 'test-unit', '~> 2'
45
+ # end
46
+ end
@@ -0,0 +1,24 @@
1
+ RSpec.describe Magick::ImageList do
2
+ describe 'images_from_imagelist' do
3
+ it 'works with identical instances' do
4
+ expect do
5
+ img = Magick::Image.new(1, 1)
6
+ list = Magick::ImageList.new
7
+ list << img << img
8
+ res = list.append(false)
9
+ expect(res.columns).to eq(2)
10
+ expect(res.rows).to eq(1)
11
+ end.not_to raise_error
12
+
13
+ expect do
14
+ img = Magick::Image.new(1, 1)
15
+ img2 = Magick::Image.new(3, 3)
16
+ list = Magick::ImageList.new
17
+ list.concat([img, img2, img, img2, img])
18
+ res = list.append(false)
19
+ expect(res.columns).to eq(9)
20
+ expect(res.rows).to eq(3)
21
+ end.not_to raise_error
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,156 @@
1
+ class Magick::Draw
2
+ def self._dummy_img_
3
+ @@_dummy_img_
4
+ end
5
+ end
6
+
7
+ RSpec.describe Magick::Draw do
8
+ let(:draw) { Magick::Draw.new }
9
+
10
+ describe '._dummy_img_' do
11
+ it 'works' do
12
+ # initially this variable is not defined.
13
+ expect { Magick::Draw._dummy_img_ }.to raise_error(NameError)
14
+
15
+ # cause it to become defined. save the object id.
16
+ draw.get_type_metrics('ABCDEF')
17
+ dummy = nil
18
+ expect { dummy = Magick::Draw._dummy_img_ }.not_to raise_error
19
+
20
+ expect(dummy).to be_instance_of(Magick::Image)
21
+
22
+ # ensure that it is always the same object
23
+ draw.get_type_metrics('ABCDEF')
24
+ dummy2 = nil
25
+ expect { dummy2 = Magick::Draw._dummy_img_ }.not_to raise_error
26
+ expect(dummy).to eq dummy2
27
+ end
28
+ end
29
+
30
+ describe '#kerning=' do
31
+ it 'assigns without raising an error' do
32
+ expect { draw.kerning = 1 }.not_to raise_error
33
+ end
34
+ end
35
+
36
+ describe '#kerning' do
37
+ it 'accepts a valid parameter without raising an error' do
38
+ expect { draw.kerning(1) }.not_to raise_error
39
+ end
40
+
41
+ it 'raises an error when given an invalid parameter' do
42
+ expect { draw.kerning('a') }.to raise_error(ArgumentError)
43
+ expect { draw.kerning([]) }.to raise_error(TypeError)
44
+ end
45
+ end
46
+
47
+ describe '#interline_spacing=' do
48
+ it 'assigns without raising an error' do
49
+ expect { draw.interline_spacing = 1 }.not_to raise_error
50
+ end
51
+ end
52
+
53
+ describe '#interline_spacing' do
54
+ it 'accepts a valid parameter without raising an error' do
55
+ expect { draw.interline_spacing(1) }.not_to raise_error
56
+ end
57
+
58
+ it 'raises an error when given an invalid parameter' do
59
+ expect { draw.interline_spacing('a') }.to raise_error(ArgumentError)
60
+ expect { draw.interline_spacing([]) }.to raise_error(TypeError)
61
+ end
62
+ end
63
+
64
+ describe '#interword_spacing=' do
65
+ it 'assigns without raising an error' do
66
+ expect { draw.interword_spacing = 1 }.not_to raise_error
67
+ end
68
+ end
69
+
70
+ describe '#interword_spacing' do
71
+ it 'accepts a valid parameter without raising an error' do
72
+ expect { draw.interword_spacing(1) }.not_to raise_error
73
+ end
74
+
75
+ it 'raises an error when given an invalid parameter' do
76
+ expect { draw.interword_spacing('a') }.to raise_error(ArgumentError)
77
+ expect { draw.interword_spacing([]) }.to raise_error(TypeError)
78
+ end
79
+ end
80
+
81
+ describe '#marshal_dump', '#marshal_load' do
82
+ it 'marshals without an error' do
83
+ skip 'this spec fails on some versions of ImageMagick'
84
+ rose = Magick::Image.read('rose:').first
85
+ granite = Magick::Image.read('granite:').first
86
+ s = granite.to_blob { self.format = 'miff' }
87
+ granite = Magick::Image.from_blob(s).first
88
+ blue_stroke = Magick::Image.new(20,20) { self.background_color = 'blue' }
89
+ s = blue_stroke.to_blob { self.format = 'miff' }
90
+ blue_stroke = Magick::Image.from_blob(s).first
91
+
92
+ draw.affine = Magick::AffineMatrix.new(1, 2, 3, 4, 5, 6)
93
+ draw.decorate = Magick::LineThroughDecoration
94
+ draw.encoding = 'AdobeCustom'
95
+ draw.gravity = Magick::CenterGravity
96
+ draw.fill = Magick::Pixel.from_color('red')
97
+ draw.stroke = Magick::Pixel.from_color('blue')
98
+ draw.stroke_width = 5
99
+ draw.fill_pattern = granite
100
+ draw.stroke_pattern = blue_stroke
101
+ draw.text_antialias = true
102
+ draw.font = 'Arial-Bold'
103
+ draw.font_family = 'arial'
104
+ draw.font_style = Magick::ItalicStyle
105
+ draw.font_stretch = Magick::CondensedStretch
106
+ draw.font_weight = Magick::BoldWeight
107
+ draw.pointsize = 12
108
+ draw.density = '72x72'
109
+ draw.align = Magick::CenterAlign
110
+ draw.undercolor = Magick::Pixel.from_color('green')
111
+ draw.kerning = 10.5
112
+ draw.interword_spacing = 3.75
113
+
114
+ draw.circle(20, 25, 20, 28)
115
+ dumped = nil
116
+ expect { dumped = Marshal.dump(draw) }.not_to raise_error
117
+ expect { Marshal.load(dumped) }.not_to raise_error
118
+ end
119
+ end
120
+
121
+ describe '#fill_pattern' do
122
+ it 'accepts an Image argument' do
123
+ img = Magick::Image.new(20,20)
124
+ expect { draw.fill_pattern = img }.not_to raise_error
125
+ end
126
+
127
+ it 'accepts an ImageList argument' do
128
+ img = Magick::Image.new(20,20)
129
+ ilist = Magick::ImageList.new
130
+ ilist << img
131
+ expect { draw.fill_pattern = ilist }.not_to raise_error
132
+ end
133
+
134
+ it 'does not accept arbitrary arguments' do
135
+ expect { draw.fill_pattern = 1 }.to raise_error(NoMethodError)
136
+ end
137
+ end
138
+
139
+ describe '#stroke_pattern' do
140
+ it 'accepts an Image argument' do
141
+ img = Magick::Image.new(20,20)
142
+ expect { draw.stroke_pattern = img }.not_to raise_error
143
+ end
144
+
145
+ it 'accepts an ImageList argument' do
146
+ img = Magick::Image.new(20,20)
147
+ ilist = Magick::ImageList.new
148
+ ilist << img
149
+ expect { draw.stroke_pattern = ilist }.not_to raise_error
150
+ end
151
+
152
+ it 'does not accept arbitrary arguments' do
153
+ expect { draw.stroke_pattern = 1 }.to raise_error(NoMethodError)
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,16 @@
1
+ RSpec.describe Magick::Image, '#blue_shift' do
2
+
3
+ let(:img) { Magick::Image.read(IMAGES_DIR+'/Button_0.gif').first }
4
+
5
+ it 'returns a new Image' do
6
+ res = img.blue_shift
7
+ expect(res).to be_instance_of(Magick::Image)
8
+ expect(res).not_to eq img
9
+ end
10
+
11
+ it 'accepts one argument' do
12
+ expect { img.blue_shift(2) }.not_to raise_error
13
+ expect { img.blue_shift(2, 3) }.to raise_error(ArgumentError)
14
+ end
15
+
16
+ end
@@ -0,0 +1,140 @@
1
+ RSpec.describe Magick::Image, '#composite' do
2
+
3
+ let(:img1) { Magick::Image.read(IMAGES_DIR+'/Button_0.gif').first }
4
+ let(:img2) { Magick::Image.read(IMAGES_DIR+'/Button_1.gif').first }
5
+ let(:composite_ops) do
6
+ [
7
+ Magick::UndefinedCompositeOp,
8
+ Magick::NoCompositeOp,
9
+ Magick::AddCompositeOp,
10
+ Magick::AtopCompositeOp,
11
+ Magick::BumpmapCompositeOp,
12
+ Magick::ClearCompositeOp,
13
+ Magick::ColorizeCompositeOp,
14
+ Magick::CopyBlueCompositeOp,
15
+ Magick::CopyCompositeOp,
16
+ Magick::CopyGreenCompositeOp,
17
+ Magick::CopyOpacityCompositeOp,
18
+ Magick::CopyRedCompositeOp,
19
+ Magick::CopyCyanCompositeOp,
20
+ Magick::CopyMagentaCompositeOp,
21
+ Magick::CopyYellowCompositeOp,
22
+ Magick::CopyBlackCompositeOp,
23
+ Magick::DarkenCompositeOp,
24
+ Magick::DifferenceCompositeOp,
25
+ Magick::DisplaceCompositeOp,
26
+ Magick::DissolveCompositeOp,
27
+ Magick::DstAtopCompositeOp,
28
+ Magick::DstCompositeOp,
29
+ Magick::DstInCompositeOp,
30
+ Magick::DstOutCompositeOp,
31
+ Magick::DstOverCompositeOp,
32
+ Magick::HueCompositeOp,
33
+ Magick::InCompositeOp,
34
+ Magick::LightenCompositeOp,
35
+ Magick::LuminizeCompositeOp,
36
+ Magick::MinusCompositeOp,
37
+ Magick::ModulateCompositeOp,
38
+ Magick::MultiplyCompositeOp,
39
+ Magick::OutCompositeOp,
40
+ Magick::OverCompositeOp,
41
+ Magick::OverlayCompositeOp,
42
+ Magick::PlusCompositeOp,
43
+ Magick::ReplaceCompositeOp,
44
+ Magick::SaturateCompositeOp,
45
+ Magick::ScreenCompositeOp,
46
+ Magick::SrcAtopCompositeOp,
47
+ Magick::SrcCompositeOp,
48
+ Magick::SrcInCompositeOp,
49
+ Magick::SrcOutCompositeOp,
50
+ Magick::SrcOverCompositeOp,
51
+ Magick::SubtractCompositeOp,
52
+ Magick::ThresholdCompositeOp,
53
+ Magick::XorCompositeOp,
54
+ Magick::BlendCompositeOp,
55
+ Magick::ColorBurnCompositeOp,
56
+ Magick::ColorDodgeCompositeOp,
57
+ Magick::ExclusionCompositeOp,
58
+ Magick::HardLightCompositeOp,
59
+ Magick::SoftLightCompositeOp
60
+ ]
61
+ end
62
+ let(:gravity) do
63
+ [
64
+ Magick::NorthEastGravity,
65
+ Magick::EastGravity,
66
+ Magick::SouthWestGravity,
67
+ Magick::SouthGravity,
68
+ Magick::SouthEastGravity
69
+ ]
70
+ end
71
+
72
+ it 'raises an error given invalid arguments' do
73
+ expect { img1.composite }.to raise_error(ArgumentError)
74
+ expect { img1.composite(img2) }.to raise_error(ArgumentError)
75
+ expect do
76
+ img1.composite(img2, Magick::NorthWestGravity)
77
+ end.to raise_error(ArgumentError)
78
+ expect { img1.composite(2) }.to raise_error(ArgumentError)
79
+ expect { img1.composite(img2, 2) }.to raise_error(ArgumentError)
80
+ end
81
+
82
+ context 'when given 3 arguments' do
83
+ it 'works when 2nd argument is a gravity' do
84
+ composite_ops.each do |op|
85
+ gravity.each do |grav|
86
+ expect { img1.composite(img2, grav, op) }.not_to raise_error
87
+ end
88
+ end
89
+ end
90
+
91
+ it 'raises an error when 2nd argument is not a gravity' do
92
+ expect do
93
+ img1.composite(img2, 2, Magick::OverCompositeOp)
94
+ end.to raise_error(TypeError)
95
+ end
96
+ end
97
+
98
+ context 'when given 4 arguments' do
99
+ it 'works when 4th argument is a composite operator' do
100
+ # there are way too many CompositeOperators to test them all, so just try
101
+ # few representative ops
102
+ composite_ops.each do |op|
103
+ expect { img1.composite(img2, 0, 0, op) }.not_to raise_error
104
+ end
105
+ end
106
+
107
+ it 'returns a new Magick::Image object' do
108
+ res = img1.composite(img2, 0, 0, Magick::OverCompositeOp)
109
+ expect(res).to be_instance_of(Magick::Image)
110
+ end
111
+
112
+ it 'raises an error when 4th argument is not a composite operator' do
113
+ expect { img1.composite(img2, 0, 0, 2) }.to raise_error(TypeError)
114
+ end
115
+ end
116
+
117
+ context 'when given 5 arguments' do
118
+ it 'works when 2nd argument is gravity and 5th is a composite operator' do
119
+ composite_ops.each do |op|
120
+ gravity.each do |grav|
121
+ expect { img1.composite(img2, grav, 0, 0, op) }.not_to raise_error
122
+ end
123
+ end
124
+ end
125
+
126
+ it 'raises an error when 2nd argument is not a gravity' do
127
+ expect do
128
+ img1.composite(img2, 0, 0, 2, Magick::OverCompositeOp)
129
+ end.to raise_error(TypeError)
130
+ end
131
+ end
132
+
133
+ it 'raises an error when the image has been destroyed' do
134
+ img2.destroy!
135
+ expect do
136
+ img1.composite(img2, Magick::CenterGravity, Magick::OverCompositeOp)
137
+ end.to raise_error(Magick::DestroyedImageError)
138
+ end
139
+
140
+ end