rmagick-windows 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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