rmagick 2.13.2 → 4.2.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rmagick might be problematic. Click here for more details.

Files changed (380) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +63 -0
  3. data/.editorconfig +17 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/workflows/ci.yml +107 -0
  6. data/.gitignore +25 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +37 -0
  9. data/.rubocop_todo.yml +449 -0
  10. data/.yardopts +5 -0
  11. data/CHANGELOG.md +1277 -0
  12. data/CODE_OF_CONDUCT.md +128 -0
  13. data/CONTRIBUTING.md +81 -0
  14. data/Gemfile +4 -0
  15. data/LICENSE +20 -0
  16. data/README.md +324 -0
  17. data/Rakefile +190 -0
  18. data/before_install_linux.sh +69 -0
  19. data/before_install_osx.sh +57 -0
  20. data/deprecated/RMagick.rb +6 -0
  21. data/ext/RMagick/extconf.rb +334 -333
  22. data/ext/RMagick/rmagick.c +129 -127
  23. data/ext/RMagick/rmagick.h +221 -320
  24. data/ext/RMagick/rmdraw.c +458 -767
  25. data/ext/RMagick/rmenum.c +305 -752
  26. data/ext/RMagick/rmfill.c +231 -199
  27. data/ext/RMagick/rmilist.c +437 -478
  28. data/ext/RMagick/rmimage.c +6130 -5342
  29. data/ext/RMagick/rminfo.c +695 -833
  30. data/ext/RMagick/rmkinfo.c +198 -0
  31. data/ext/RMagick/rmmain.c +752 -506
  32. data/ext/RMagick/rmmontage.c +94 -152
  33. data/ext/RMagick/rmpixel.c +619 -425
  34. data/ext/RMagick/rmstruct.c +206 -309
  35. data/ext/RMagick/rmutil.c +514 -344
  36. data/lib/rmagick/version.rb +5 -0
  37. data/lib/rmagick.rb +1 -0
  38. data/lib/rmagick_internal.rb +1922 -0
  39. data/lib/rvg/clippath.rb +35 -39
  40. data/lib/rvg/container.rb +123 -124
  41. data/lib/rvg/deep_equal.rb +45 -49
  42. data/lib/rvg/describable.rb +41 -47
  43. data/lib/rvg/embellishable.rb +380 -411
  44. data/lib/rvg/misc.rb +691 -711
  45. data/lib/rvg/paint.rb +43 -47
  46. data/lib/rvg/pathdata.rb +119 -125
  47. data/lib/rvg/rvg.rb +214 -213
  48. data/lib/rvg/stretchable.rb +153 -162
  49. data/lib/rvg/stylable.rb +111 -117
  50. data/lib/rvg/text.rb +169 -180
  51. data/lib/rvg/transformable.rb +121 -127
  52. data/lib/rvg/units.rb +58 -61
  53. data/rmagick.gemspec +36 -16
  54. metadata +188 -365
  55. data/ChangeLog +0 -773
  56. data/Doxyfile +0 -1514
  57. data/README-Mac-OSX.txt +0 -1
  58. data/README.html +0 -10
  59. data/build_tarball.rake +0 -215
  60. data/doc/comtasks.html +0 -287
  61. data/doc/constants.html +0 -1581
  62. data/doc/css/doc.css +0 -299
  63. data/doc/css/popup.css +0 -34
  64. data/doc/css/ref.css +0 -67
  65. data/doc/draw.html +0 -3269
  66. data/doc/ex/InitialCoords.rb +0 -23
  67. data/doc/ex/NewCoordSys.rb +0 -32
  68. data/doc/ex/OrigCoordSys.rb +0 -18
  69. data/doc/ex/PreserveAspectRatio.rb +0 -205
  70. data/doc/ex/RotateScale.rb +0 -37
  71. data/doc/ex/Skew.rb +0 -38
  72. data/doc/ex/Use01.rb +0 -16
  73. data/doc/ex/Use02.rb +0 -21
  74. data/doc/ex/Use03.rb +0 -16
  75. data/doc/ex/ViewBox.rb +0 -33
  76. data/doc/ex/adaptive_threshold.rb +0 -10
  77. data/doc/ex/add_noise.rb +0 -17
  78. data/doc/ex/affine.rb +0 -48
  79. data/doc/ex/affine_transform.rb +0 -20
  80. data/doc/ex/arc.rb +0 -49
  81. data/doc/ex/arcpath.rb +0 -33
  82. data/doc/ex/arcs01.rb +0 -28
  83. data/doc/ex/arcs02.rb +0 -61
  84. data/doc/ex/average.rb +0 -15
  85. data/doc/ex/axes.rb +0 -64
  86. data/doc/ex/baseline_shift01.rb +0 -18
  87. data/doc/ex/bilevel_channel.rb +0 -9
  88. data/doc/ex/blur_image.rb +0 -12
  89. data/doc/ex/border.rb +0 -10
  90. data/doc/ex/bounding_box.rb +0 -44
  91. data/doc/ex/cbezier1.rb +0 -42
  92. data/doc/ex/cbezier2.rb +0 -42
  93. data/doc/ex/cbezier3.rb +0 -42
  94. data/doc/ex/cbezier4.rb +0 -43
  95. data/doc/ex/cbezier5.rb +0 -43
  96. data/doc/ex/cbezier6.rb +0 -53
  97. data/doc/ex/channel.rb +0 -26
  98. data/doc/ex/charcoal.rb +0 -12
  99. data/doc/ex/chop.rb +0 -29
  100. data/doc/ex/circle.rb +0 -33
  101. data/doc/ex/circle01.rb +0 -17
  102. data/doc/ex/clip_path.rb +0 -60
  103. data/doc/ex/coalesce.rb +0 -60
  104. data/doc/ex/color_fill_to_border.rb +0 -29
  105. data/doc/ex/color_floodfill.rb +0 -28
  106. data/doc/ex/color_histogram.rb +0 -48
  107. data/doc/ex/color_reset.rb +0 -11
  108. data/doc/ex/colorize.rb +0 -16
  109. data/doc/ex/colors.rb +0 -64
  110. data/doc/ex/compose_mask.rb +0 -23
  111. data/doc/ex/composite.rb +0 -135
  112. data/doc/ex/composite_layers.rb +0 -53
  113. data/doc/ex/composite_tiled.rb +0 -23
  114. data/doc/ex/contrast.rb +0 -36
  115. data/doc/ex/crop.rb +0 -31
  116. data/doc/ex/crop_with_gravity.rb +0 -46
  117. data/doc/ex/cubic01.rb +0 -45
  118. data/doc/ex/cubic02.rb +0 -94
  119. data/doc/ex/cycle_colormap.rb +0 -21
  120. data/doc/ex/dissolve.rb +0 -13
  121. data/doc/ex/drawcomp.rb +0 -42
  122. data/doc/ex/drop_shadow.rb +0 -60
  123. data/doc/ex/edge.rb +0 -11
  124. data/doc/ex/ellipse.rb +0 -45
  125. data/doc/ex/ellipse01.rb +0 -22
  126. data/doc/ex/emboss.rb +0 -11
  127. data/doc/ex/enhance.rb +0 -28
  128. data/doc/ex/equalize.rb +0 -11
  129. data/doc/ex/evenodd.rb +0 -43
  130. data/doc/ex/fill_pattern.rb +0 -26
  131. data/doc/ex/flatten_images.rb +0 -36
  132. data/doc/ex/flip.rb +0 -11
  133. data/doc/ex/flop.rb +0 -11
  134. data/doc/ex/font_styles.rb +0 -34
  135. data/doc/ex/fonts.rb +0 -20
  136. data/doc/ex/frame.rb +0 -12
  137. data/doc/ex/gaussian_blur.rb +0 -11
  138. data/doc/ex/get_multiline_type_metrics.rb +0 -42
  139. data/doc/ex/get_pixels.rb +0 -48
  140. data/doc/ex/get_type_metrics.rb +0 -146
  141. data/doc/ex/gradientfill.rb +0 -27
  142. data/doc/ex/grav.rb +0 -46
  143. data/doc/ex/gravity.rb +0 -79
  144. data/doc/ex/group.rb +0 -26
  145. data/doc/ex/hatchfill.rb +0 -27
  146. data/doc/ex/image.rb +0 -46
  147. data/doc/ex/images/Apple.miff +0 -0
  148. data/doc/ex/images/Ballerina.jpg +0 -0
  149. data/doc/ex/images/Ballerina3.jpg +0 -0
  150. data/doc/ex/images/Button_0.gif +0 -0
  151. data/doc/ex/images/Button_1.gif +0 -0
  152. data/doc/ex/images/Button_2.gif +0 -0
  153. data/doc/ex/images/Button_3.gif +0 -0
  154. data/doc/ex/images/Button_4.gif +0 -0
  155. data/doc/ex/images/Button_5.gif +0 -0
  156. data/doc/ex/images/Button_6.gif +0 -0
  157. data/doc/ex/images/Button_7.gif +0 -0
  158. data/doc/ex/images/Button_8.gif +0 -0
  159. data/doc/ex/images/Button_9.gif +0 -0
  160. data/doc/ex/images/Button_A.gif +0 -0
  161. data/doc/ex/images/Button_B.gif +0 -0
  162. data/doc/ex/images/Button_C.gif +0 -0
  163. data/doc/ex/images/Button_D.gif +0 -0
  164. data/doc/ex/images/Button_E.gif +0 -0
  165. data/doc/ex/images/Button_F.gif +0 -0
  166. data/doc/ex/images/Button_G.gif +0 -0
  167. data/doc/ex/images/Button_H.gif +0 -0
  168. data/doc/ex/images/Button_I.gif +0 -0
  169. data/doc/ex/images/Button_J.gif +0 -0
  170. data/doc/ex/images/Button_K.gif +0 -0
  171. data/doc/ex/images/Button_L.gif +0 -0
  172. data/doc/ex/images/Button_M.gif +0 -0
  173. data/doc/ex/images/Button_N.gif +0 -0
  174. data/doc/ex/images/Button_O.gif +0 -0
  175. data/doc/ex/images/Button_P.gif +0 -0
  176. data/doc/ex/images/Button_Q.gif +0 -0
  177. data/doc/ex/images/Button_R.gif +0 -0
  178. data/doc/ex/images/Button_S.gif +0 -0
  179. data/doc/ex/images/Button_T.gif +0 -0
  180. data/doc/ex/images/Button_U.gif +0 -0
  181. data/doc/ex/images/Button_V.gif +0 -0
  182. data/doc/ex/images/Button_W.gif +0 -0
  183. data/doc/ex/images/Button_X.gif +0 -0
  184. data/doc/ex/images/Button_Y.gif +0 -0
  185. data/doc/ex/images/Button_Z.gif +0 -0
  186. data/doc/ex/images/Cheetah.jpg +0 -0
  187. data/doc/ex/images/Coffee.wmf +0 -0
  188. data/doc/ex/images/Flower_Hat.jpg +0 -0
  189. data/doc/ex/images/Gold_Statue.jpg +0 -0
  190. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  191. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  192. data/doc/ex/images/Leaf.miff +0 -0
  193. data/doc/ex/images/No.wmf +0 -0
  194. data/doc/ex/images/Polynesia.jpg +0 -0
  195. data/doc/ex/images/Red_Rocks.jpg +0 -0
  196. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  197. data/doc/ex/images/Shorts.jpg +0 -0
  198. data/doc/ex/images/Snake.wmf +0 -0
  199. data/doc/ex/images/Violin.jpg +0 -0
  200. data/doc/ex/images/Yellow_Rose.miff +0 -0
  201. data/doc/ex/images/big-duck.gif +0 -0
  202. data/doc/ex/images/duck.gif +0 -0
  203. data/doc/ex/images/duck0.gif +0 -0
  204. data/doc/ex/images/duck1.gif +0 -0
  205. data/doc/ex/images/duck10.gif +0 -0
  206. data/doc/ex/images/duck11.gif +0 -0
  207. data/doc/ex/images/duck12.gif +0 -0
  208. data/doc/ex/images/duck13.gif +0 -0
  209. data/doc/ex/images/duck14.gif +0 -0
  210. data/doc/ex/images/duck15.gif +0 -0
  211. data/doc/ex/images/duck2.gif +0 -0
  212. data/doc/ex/images/duck3.gif +0 -0
  213. data/doc/ex/images/duck4.gif +0 -0
  214. data/doc/ex/images/duck5.gif +0 -0
  215. data/doc/ex/images/duck6.gif +0 -0
  216. data/doc/ex/images/duck7.gif +0 -0
  217. data/doc/ex/images/duck8.gif +0 -0
  218. data/doc/ex/images/duck9.gif +0 -0
  219. data/doc/ex/images/graydient230x6.gif +0 -0
  220. data/doc/ex/images/logo400x83.gif +0 -0
  221. data/doc/ex/images/model.miff +0 -0
  222. data/doc/ex/images/notimplemented.gif +0 -0
  223. data/doc/ex/images/smile.miff +0 -0
  224. data/doc/ex/images/spin.gif +0 -0
  225. data/doc/ex/implode.rb +0 -34
  226. data/doc/ex/level.rb +0 -11
  227. data/doc/ex/level_colors.rb +0 -11
  228. data/doc/ex/line.rb +0 -42
  229. data/doc/ex/line01.rb +0 -23
  230. data/doc/ex/mask.rb +0 -36
  231. data/doc/ex/matte_fill_to_border.rb +0 -40
  232. data/doc/ex/matte_floodfill.rb +0 -33
  233. data/doc/ex/matte_replace.rb +0 -40
  234. data/doc/ex/median_filter.rb +0 -28
  235. data/doc/ex/modulate.rb +0 -11
  236. data/doc/ex/mono.rb +0 -23
  237. data/doc/ex/morph.rb +0 -26
  238. data/doc/ex/mosaic.rb +0 -35
  239. data/doc/ex/motion_blur.rb +0 -11
  240. data/doc/ex/negate.rb +0 -11
  241. data/doc/ex/negate_channel.rb +0 -9
  242. data/doc/ex/nested_rvg.rb +0 -21
  243. data/doc/ex/nonzero.rb +0 -43
  244. data/doc/ex/normalize.rb +0 -11
  245. data/doc/ex/oil_paint.rb +0 -11
  246. data/doc/ex/opacity.rb +0 -37
  247. data/doc/ex/ordered_dither.rb +0 -11
  248. data/doc/ex/path.rb +0 -64
  249. data/doc/ex/pattern1.rb +0 -25
  250. data/doc/ex/pattern2.rb +0 -26
  251. data/doc/ex/polaroid.rb +0 -28
  252. data/doc/ex/polygon.rb +0 -24
  253. data/doc/ex/polygon01.rb +0 -23
  254. data/doc/ex/polyline.rb +0 -23
  255. data/doc/ex/polyline01.rb +0 -23
  256. data/doc/ex/posterize.rb +0 -8
  257. data/doc/ex/preview.rb +0 -9
  258. data/doc/ex/qbezierpath.rb +0 -52
  259. data/doc/ex/quad01.rb +0 -36
  260. data/doc/ex/quantize-m.rb +0 -25
  261. data/doc/ex/radial_blur.rb +0 -9
  262. data/doc/ex/raise.rb +0 -8
  263. data/doc/ex/random_threshold_channel.rb +0 -13
  264. data/doc/ex/rect01.rb +0 -15
  265. data/doc/ex/rect02.rb +0 -22
  266. data/doc/ex/rectangle.rb +0 -35
  267. data/doc/ex/reduce_noise.rb +0 -28
  268. data/doc/ex/remap.rb +0 -12
  269. data/doc/ex/remap_images.rb +0 -21
  270. data/doc/ex/resize_to_fill.rb +0 -10
  271. data/doc/ex/resize_to_fit.rb +0 -10
  272. data/doc/ex/roll.rb +0 -9
  273. data/doc/ex/rotate.rb +0 -45
  274. data/doc/ex/rotate_f.rb +0 -14
  275. data/doc/ex/roundrect.rb +0 -34
  276. data/doc/ex/rubyname.rb +0 -30
  277. data/doc/ex/rvg_clippath.rb +0 -14
  278. data/doc/ex/rvg_linecap.rb +0 -43
  279. data/doc/ex/rvg_linejoin.rb +0 -41
  280. data/doc/ex/rvg_opacity.rb +0 -19
  281. data/doc/ex/rvg_pattern.rb +0 -26
  282. data/doc/ex/rvg_stroke_dasharray.rb +0 -12
  283. data/doc/ex/segment.rb +0 -11
  284. data/doc/ex/sepiatone.rb +0 -8
  285. data/doc/ex/shade.rb +0 -11
  286. data/doc/ex/shadow.rb +0 -31
  287. data/doc/ex/shave.rb +0 -15
  288. data/doc/ex/shear.rb +0 -10
  289. data/doc/ex/sketch.rb +0 -18
  290. data/doc/ex/skewx.rb +0 -52
  291. data/doc/ex/skewy.rb +0 -47
  292. data/doc/ex/smile.rb +0 -125
  293. data/doc/ex/solarize.rb +0 -11
  294. data/doc/ex/sparse_color.rb +0 -55
  295. data/doc/ex/splice.rb +0 -9
  296. data/doc/ex/spread.rb +0 -11
  297. data/doc/ex/stegano.rb +0 -55
  298. data/doc/ex/stroke_dasharray.rb +0 -43
  299. data/doc/ex/stroke_fill.rb +0 -11
  300. data/doc/ex/stroke_linecap.rb +0 -44
  301. data/doc/ex/stroke_linejoin.rb +0 -48
  302. data/doc/ex/stroke_width.rb +0 -49
  303. data/doc/ex/swirl.rb +0 -17
  304. data/doc/ex/text.rb +0 -37
  305. data/doc/ex/text01.rb +0 -17
  306. data/doc/ex/text_align.rb +0 -36
  307. data/doc/ex/text_antialias.rb +0 -38
  308. data/doc/ex/text_styles.rb +0 -21
  309. data/doc/ex/text_undercolor.rb +0 -28
  310. data/doc/ex/texture_fill_to_border.rb +0 -34
  311. data/doc/ex/texture_floodfill.rb +0 -32
  312. data/doc/ex/texturefill.rb +0 -25
  313. data/doc/ex/threshold.rb +0 -13
  314. data/doc/ex/to_blob.rb +0 -14
  315. data/doc/ex/translate.rb +0 -39
  316. data/doc/ex/transparent.rb +0 -38
  317. data/doc/ex/transpose.rb +0 -9
  318. data/doc/ex/transverse.rb +0 -9
  319. data/doc/ex/tref01.rb +0 -25
  320. data/doc/ex/triangle01.rb +0 -16
  321. data/doc/ex/trim.rb +0 -24
  322. data/doc/ex/tspan01.rb +0 -18
  323. data/doc/ex/tspan02.rb +0 -19
  324. data/doc/ex/tspan03.rb +0 -21
  325. data/doc/ex/unsharp_mask.rb +0 -28
  326. data/doc/ex/viewex.rb +0 -35
  327. data/doc/ex/vignette.rb +0 -12
  328. data/doc/ex/watermark.rb +0 -28
  329. data/doc/ex/wave.rb +0 -9
  330. data/doc/ex/wet_floor.rb +0 -59
  331. data/doc/ex/writing_mode01.rb +0 -27
  332. data/doc/ex/writing_mode02.rb +0 -26
  333. data/doc/ilist.html +0 -2056
  334. data/doc/image1.html +0 -4680
  335. data/doc/image2.html +0 -3665
  336. data/doc/image3.html +0 -4522
  337. data/doc/imageattrs.html +0 -1638
  338. data/doc/imusage.html +0 -514
  339. data/doc/index.html +0 -416
  340. data/doc/info.html +0 -1499
  341. data/doc/magick.html +0 -565
  342. data/doc/optequiv.html +0 -2435
  343. data/doc/rvg.html +0 -975
  344. data/doc/rvgclip.html +0 -248
  345. data/doc/rvggroup.html +0 -305
  346. data/doc/rvgimage.html +0 -289
  347. data/doc/rvgpattern.html +0 -475
  348. data/doc/rvgshape.html +0 -406
  349. data/doc/rvgstyle.html +0 -270
  350. data/doc/rvgtext.html +0 -465
  351. data/doc/rvgtspan.html +0 -238
  352. data/doc/rvgtut.html +0 -530
  353. data/doc/rvguse.html +0 -145
  354. data/doc/rvgxform.html +0 -294
  355. data/doc/scripts/doc.js +0 -22
  356. data/doc/scripts/stripeTables.js +0 -23
  357. data/doc/struct.html +0 -1339
  358. data/doc/usage.html +0 -1621
  359. data/examples/constitute.rb +0 -7
  360. data/examples/crop_with_gravity.rb +0 -46
  361. data/examples/demo.rb +0 -324
  362. data/examples/describe.rb +0 -44
  363. data/examples/find_similar_region.rb +0 -34
  364. data/examples/histogram.rb +0 -325
  365. data/examples/identify.rb +0 -187
  366. data/examples/image_opacity.rb +0 -29
  367. data/examples/import_export.rb +0 -31
  368. data/examples/pattern_fill.rb +0 -38
  369. data/examples/rotating_text.rb +0 -45
  370. data/examples/spinner.rb +0 -50
  371. data/examples/thumbnail.rb +0 -65
  372. data/examples/vignette.rb +0 -79
  373. data/ext/RMagick/MANIFEST +0 -358
  374. data/lib/RMagick.rb +0 -1962
  375. data/metaconfig +0 -7
  376. data/post-clean.rb +0 -12
  377. data/post-install.rb +0 -50
  378. data/post-setup.rb +0 -254
  379. data/setup.rb +0 -1585
  380. data/uninstall.rb +0 -76
@@ -2,416 +2,385 @@
2
2
  # $Id: embellishable.rb,v 1.9 2009/02/28 23:52:13 rmagick Exp $
3
3
  # Copyright (C) 2009 Timothy P. Hunter
4
4
  #++
5
-
6
5
  module Magick
7
- class RVG
8
-
9
- # Parent class of Circle, Ellipse, Text, etc.
10
- class Shape #:nodoc:
11
- include Stylable
12
- include Transformable
13
- include Duplicatable
14
-
15
- # Each shape can have its own set of transforms and styles.
16
- def add_primitives(gc)
17
- gc.push
18
- add_transform_primitives(gc)
19
- add_style_primitives(gc)
20
- gc.__send__(@primitive, *@args)
21
- gc.pop
22
- end
23
-
24
- end # class Shape
25
-
26
- class Circle < Shape
27
-
28
- # Define a circle with radius +r+ and centered at [<tt>cx</tt>, <tt>cy</tt>].
29
- # Use the RVG::ShapeConstructors#circle method to create Circle objects in a container.
30
- def initialize(r, cx=0, cy=0)
31
- super()
32
- r, cx, cy = Magick::RVG.convert_to_float(r, cx, cy)
33
- if r < 0
34
- raise ArgumentError, "radius must be >= 0 (#{r} given)"
35
- end
36
- @primitive = :circle
37
- @args = [cx, cy, cx+r, cy]
38
- self
39
- end
40
-
41
- end # class Circle
42
-
43
- class Ellipse < Shape
44
-
45
- # Define an ellipse with a center at [<tt>cx</tt>, <tt>cy</tt>], a horizontal radius +rx+
46
- # and a vertical radius +ry+.
47
- # Use the RVG::ShapeConstructors#ellipse method to create Ellipse objects in a container.
48
- def initialize(rx, ry, cx=0, cy=0)
49
- super()
50
- rx, ry, cx, cy = Magick::RVG.convert_to_float(rx, ry, cx, cy)
51
- if rx < 0 || ry < 0
52
- raise ArgumentError, "radii must be >= 0 (#{rx}, #{ry} given)"
53
- end
54
- @primitive = :ellipse
55
- # Ellipses are always complete.
56
- @args = [cx, cy, rx, ry, 0, 360]
57
- end
58
-
59
- end # class Ellipse
60
-
61
- class Line < Shape
62
-
63
- # Define a line from [<tt>x1</tt>, <tt>y1</tt>] to [<tt>x2</tt>, <tt>y2</tt>].
64
- # Use the RVG::ShapeConstructors#line method to create Line objects in a container.
65
- def initialize(x1=0, y1=0, x2=0, y2=0)
66
- super()
67
- @primitive = :line
68
- @args = [x1, y1, x2, y2]
69
- end
70
-
71
- end # class Line
72
-
73
- class Path < Shape
74
-
75
- # Define an SVG path. The argument can be either a path string
76
- # or a PathData object.
77
- # Use the RVG::ShapeConstructors#path method to create Path objects in a container.
78
- def initialize(path)
79
- super()
80
- @primitive = :path
81
- @args = [path.to_s]
82
- end
83
-
84
- end # class Path
85
-
86
- class Rect < Shape
87
-
88
- # Define a width x height rectangle. The upper-left corner is at [<tt>x</tt>, <tt>y</tt>].
89
- # If either <tt>width</tt> or <tt>height</tt> is 0, the rectangle is not rendered.
90
- # Use the RVG::ShapeConstructors#rect method to create Rect objects in a container.
91
- def initialize(width, height, x=0, y=0)
92
- super()
93
- width, height, x, y = Magick::RVG.convert_to_float(width, height, x, y)
94
- if width < 0 || height < 0
95
- raise ArgumentError, "width, height must be >= 0 (#{width}, #{height} given)"
96
- end
97
- @args = [x, y, x+width, y+height]
98
- @primitive = :rectangle
99
- end
100
-
101
- # Specify optional rounded corners for a rectangle. The arguments
102
- # are the x- and y-axis radii. If y is omitted it defaults to x.
103
- def round(rx, ry=nil)
104
- rx, ry = Magick::RVG.convert_to_float(rx, ry || rx)
105
- if rx < 0 || ry < 0
106
- raise ArgumentError, "rx, ry must be >= 0 (#{rx}, #{ry} given)"
107
- end
108
- @args << rx << ry
109
- @primitive = :roundrectangle
110
- self
111
- end
112
-
113
- end # class Rect
114
-
115
- class PolyShape < Shape
116
-
117
- def polypoints(points)
118
- case points.length
119
- when 1
120
- points = Array(points[0])
121
- when 2
122
- x_coords = Array(points[0])
123
- y_coords = Array(points[1])
124
- unless x_coords.length > 0 && y_coords.length > 0
125
- raise ArgumentError, "array arguments must contain at least one point"
126
- end
127
- n = x_coords.length - y_coords.length
128
- short = n > 0 ? y_coords : x_coords
129
- olen = short.length
130
- n.abs.times {|x| short << short[x % olen]}
131
- points = x_coords.zip(y_coords).flatten
132
- end
133
- n = points.length
134
- if n < 4 || n % 2 != 0
135
- raise ArgumentError, "insufficient/odd number of points specified: #{n}"
136
- end
137
- return Magick::RVG.convert_to_float(*points)
138
- end
139
-
140
- end # class PolyShape
141
-
142
- class Polygon < PolyShape
143
-
144
- # Draws a polygon. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
145
- # define the points that make up the polygon. At least two
146
- # points must be specified. If the last point is not the
147
- # same as the first, adds an additional point to close
148
- # the polygon.
149
- # Use the RVG::ShapeConstructors#polygon method to create Polygon objects in a container.
150
- def initialize(*points)
151
- super()
152
- @primitive = :polygon
153
- @args = polypoints(points)
154
- end
155
-
156
- end # class Polygon
157
-
158
- class Polyline < PolyShape
159
-
160
- # Draws a polyline. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
161
- # define the points that make up the polyline. At least two
162
- # points must be specified.
163
- # Use the RVG::ShapeConstructors#polyline method to create Polyline objects in a container.
164
- def initialize(*points)
165
- super()
166
- points = polypoints(points)
167
- @primitive = :polyline
168
- @args = Magick::RVG.convert_to_float(*points)
169
- end
170
-
171
- end # class Polyline
172
-
173
-
174
- class Image
175
- include Stylable
176
- include Transformable
177
- include Describable
178
- include PreserveAspectRatio
179
- include Duplicatable
180
-
181
- private
182
- def align_to_viewport(scale)
183
- tx = case @align
184
- when 'none', /\AxMin/
185
- 0
186
- when NilClass, /\AxMid/
187
- (@width - @image.columns*scale) / 2.0
188
- when /\AxMax/
189
- @width - @image.columns*scale
190
- end
191
-
192
- ty = case @align
193
- when 'none', /YMin\z/
194
- 0
195
- when NilClass, /YMid\z/
196
- (@height - @image.rows*scale) / 2.0
197
- when /YMax\z/
198
- @height - @image.rows*scale
199
- end
200
- return [tx, ty]
201
- end
202
-
203
- def add_composite_primitive(gc)
204
- if @align == 'none'
205
- # Let RMagick do the scaling
206
- scale = 1.0
207
- width, height = @width, @height
208
- elsif @meet_or_slice == 'meet'
209
- scale = [@width/@image.columns, @height/@image.rows].min
210
- width, height = @image.columns, @image.rows
211
- else
212
- # Establish clipping path around the current viewport
213
- name = __id__.to_s
214
- gc.define_clip_path(name) do
215
- gc.path("M#{@x},#{@y} l#{@width},0 l0,#{@height} l-#{@width},0 l0,-#{@height}z")
216
- end
217
-
218
- gc.clip_path(name)
219
- scale = [@width/@image.columns, @height/@image.rows].max
220
- width, height = @image.columns, @image.rows
221
- end
222
- tx, ty = align_to_viewport(scale)
223
- gc.composite(@x+tx, @y+ty, width*scale, height*scale, @image)
224
- end
225
-
226
- def init_viewbox()
227
- @align = nil
228
- @vbx_width, @vbx_height = @image.columns, @image.rows
229
- @meet_or_slice = 'meet'
230
- end
231
-
232
- public
233
-
234
- # Composite a raster image in the viewport defined by [x,y] and
235
- # +width+ and +height+.
236
- # Use the RVG::ImageConstructors#image method to create Text objects in a container.
237
- def initialize(image, width=nil, height=nil, x=0, y=0)
238
- super() # run module initializers
239
- @image = image.copy # use a copy of the image in case app. re-uses the argument
240
- @x, @y, @width, @height = Magick::RVG.convert_to_float(x, y, width || @image.columns, height || @image.rows)
241
- if @width < 0 || @height < 0
242
- raise ArgumentError, "width, height must be >= 0"
243
- end
244
- init_viewbox()
245
- end
246
-
247
- def add_primitives(gc) #:nodoc:
248
- # Do not render if width or height is 0
249
- return if @width == 0 || @height == 0
250
- gc.push
251
- add_transform_primitives(gc)
252
- add_style_primitives(gc)
253
- add_composite_primitive(gc)
254
- gc.pop
255
- end
256
-
257
- end # class Image
258
-
259
-
260
- # Methods that construct basic shapes within a container
261
- module ShapeConstructors
262
-
263
- # Draws a circle whose center is [<tt>cx</tt>, <tt>cy</tt>] and radius is +r+.
264
- def circle(r, cx=0, cy=0)
265
- circle = Circle.new(r, cx, cy)
266
- @content << circle
267
- return circle
268
- end
269
-
270
- # Draws an ellipse whose center is [<tt>cx</tt>, <tt>cy</tt>] and having
271
- # a horizontal radius +rx+ and vertical radius +ry+.
272
- def ellipse(rx, ry, cx=0, cy=0)
273
- ellipse = Ellipse.new(rx, ry, cx, cy)
274
- @content << ellipse
275
- return ellipse
276
- end
277
-
278
- # Draws a line from [<tt>x1</tt>, <tt>y1</tt>] to [<tt>x2</tt>, <tt>y2</tt>].
279
- def line(x1=0, y1=0, x2=0, y2=0)
280
- line = Line.new(x1, y1, x2, y2)
281
- @content << line
282
- return line
283
- end
284
-
285
- # Draws a path defined by an SVG path string or a PathData
286
- # object.
287
- def path(path)
288
- path = Path.new(path)
289
- @content << path
290
- return path
291
- end
292
-
293
- # Draws a rectangle whose upper-left corner is [<tt>x</tt>, <tt>y</tt>] and
294
- # with the specified +width+ and +height+. Unless otherwise
295
- # specified the rectangle has square corners. Returns a
296
- # Rectangle object.
297
- #
298
- # Draw a rectangle with rounded corners by calling the #round
299
- # method on the Rectangle object. <tt>rx</tt> and <tt>ry</tt> are
300
- # the corner radii in the x- and y-directions. For example:
301
- # canvas.rect(width, height, x, y).round(8, 6)
302
- # If <tt>ry</tt> is omitted it defaults to <tt>rx</tt>.
303
- def rect(width, height, x=0, y=0)
304
- rect = Rect.new(width, height, x, y)
305
- @content << rect
306
- return rect
307
- end
308
-
309
- # Draws a polygon. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
310
- # define the points that make up the polygon. At least two
311
- # points must be specified. If the last point is not the
312
- # same as the first, adds an additional point to close
313
- # the polygon.
314
- def polygon(*points)
315
- polygon = Polygon.new(*points)
316
- @content << polygon
317
- return polygon
318
- end
319
-
320
- # Draws a polyline. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
321
- # define the points that make up the polyline. At least two
322
- # points must be specified.
323
- def polyline(*points)
324
- polyline = Polyline.new(*points)
325
- @content << polyline
326
- return polyline
327
- end
328
-
329
- end # module ShapeContent
330
-
331
- # Methods that reference ("use") other drawable objects within a container
332
- module UseConstructors
333
-
334
- # Reference an object to be inserted into the container's
335
- # content. [<tt>x</tt>,<tt>y</tt>] is the offset from the upper-left
336
- # corner. If the argument is an RVG or Image object and +width+ and +height+
337
- # are specified, these values will override the +width+ and +height+
338
- # attributes on the argument.
339
- def use(obj, x=0, y=0, width=nil, height=nil)
340
- use = Use.new(obj, x, y, width, height)
341
- @content << use
342
- return use
343
- end
344
-
345
- end # module UseConstructors
346
-
347
- # Methods that construct container objects within a container
348
- module StructureConstructors
349
-
350
- # Establishes a new viewport. [<tt>x</tt>, <tt>y</tt>] is the coordinate of the
351
- # upper-left corner within the containing viewport. This is a
352
- # _container_ method. Styles and
353
- # transforms specified on this object will be used by objects
354
- # contained within, unless overridden by an inner container or
355
- # the contained object itself.
356
- def rvg(cols, rows, x=0, y=0, &block)
357
- rvg = Magick::RVG.new(cols, rows, &block)
358
- begin
359
- x, y = Float(x), Float(y)
360
- rescue ArgumentError
361
- args = [cols, rows, x, y]
362
- raise ArgumentError, "at least one argument is not convertable to Float (got #{args.collect {|a| a.class}.join(', ')})"
363
- end
364
- rvg.corner(x, y)
365
- @content << rvg
366
- return rvg
367
- end
368
-
369
- # Defines a group.
370
- #
371
- # This method constructs a new
372
- # Group _container_ object. The styles and
373
- # transforms specified on this object will be used by objects
374
- # contained within, unless overridden by an inner container or
375
- # the contained object itself.
376
- # Define grouped elements by calling RVG::Embellishable
377
- # methods within the associated block.
378
- def g(&block)
379
- group = Group.new(&block)
380
- @content << group
381
- return group
382
- end
383
-
384
- end # module StructureConstructors
385
-
386
- # Methods that construct raster image objects within a container
387
- module ImageConstructors
388
-
389
- # Composite a raster image at [<tt>x</tt>,<tt>y</tt>]
390
- # in a viewport of the specified <tt>width</tt> and <tt>height</tt>.
391
- # If not specified, the width and height are the width and height
392
- # of the image. Use the RVG::PreserveAspectRatio#preserve_aspect_ratio method to
393
- # control the placement and scaling of the image within the
394
- # viewport. By default, the image is scaled to fit inside the
395
- # viewport and centered within the viewport.
396
- def image(image, width=nil, height=nil, x=0, y=0)
397
- img = Image.new(image, width, height, x, y)
398
- @content << img
399
- return img
400
- end
401
-
402
- end # module ImageConstructors
403
-
404
- # Methods that create shapes, text, and other drawable objects
405
- # within container objects such as ::Magick::RVG and
406
- # ::Magick::RVG::Group
407
- module Embellishable
408
- include StructureConstructors
409
- include ShapeConstructors
410
- include TextConstructors
411
- include UseConstructors
412
- include ImageConstructors
413
- end # module Embellishable
414
-
415
- end # class RVG
6
+ class RVG
7
+ # Parent class of Circle, Ellipse, Text, etc.
8
+ # @private
9
+ class Shape
10
+ include Stylable
11
+ include Transformable
12
+ include Duplicatable
13
+
14
+ # Each shape can have its own set of transforms and styles.
15
+ def add_primitives(gc)
16
+ gc.push
17
+ add_transform_primitives(gc)
18
+ add_style_primitives(gc)
19
+ gc.__send__(@primitive, *@args)
20
+ gc.pop
21
+ end
22
+ end # class Shape
23
+
24
+ class Circle < Shape
25
+ # Define a circle with radius +r+ and centered at [<tt>cx</tt>, <tt>cy</tt>].
26
+ # Use the RVG::ShapeConstructors#circle method to create Circle objects in a container.
27
+ def initialize(r, cx = 0, cy = 0)
28
+ super()
29
+ r, cx, cy = Magick::RVG.convert_to_float(r, cx, cy)
30
+ raise ArgumentError, "radius must be >= 0 (#{r} given)" if r < 0
31
+
32
+ @primitive = :circle
33
+ @args = [cx, cy, cx + r, cy]
34
+ end
35
+ end # class Circle
36
+
37
+ class Ellipse < Shape
38
+ # Define an ellipse with a center at [<tt>cx</tt>, <tt>cy</tt>], a horizontal radius +rx+
39
+ # and a vertical radius +ry+.
40
+ # Use the RVG::ShapeConstructors#ellipse method to create Ellipse objects in a container.
41
+ def initialize(rx, ry, cx = 0, cy = 0)
42
+ super()
43
+ rx, ry, cx, cy = Magick::RVG.convert_to_float(rx, ry, cx, cy)
44
+ raise ArgumentError, "radii must be >= 0 (#{rx}, #{ry} given)" if rx < 0 || ry < 0
45
+
46
+ @primitive = :ellipse
47
+ # Ellipses are always complete.
48
+ @args = [cx, cy, rx, ry, 0, 360]
49
+ end
50
+ end # class Ellipse
51
+
52
+ class Line < Shape
53
+ # Define a line from [<tt>x1</tt>, <tt>y1</tt>] to [<tt>x2</tt>, <tt>y2</tt>].
54
+ # Use the RVG::ShapeConstructors#line method to create Line objects in a container.
55
+ def initialize(x1 = 0, y1 = 0, x2 = 0, y2 = 0)
56
+ super()
57
+ @primitive = :line
58
+ @args = [x1, y1, x2, y2]
59
+ end
60
+ end # class Line
61
+
62
+ class Path < Shape
63
+ # Define an SVG path. The argument can be either a path string
64
+ # or a PathData object.
65
+ # Use the RVG::ShapeConstructors#path method to create Path objects in a container.
66
+ def initialize(path)
67
+ super()
68
+ @primitive = :path
69
+ @args = [path.to_s]
70
+ end
71
+ end # class Path
72
+
73
+ class Rect < Shape
74
+ # Define a width x height rectangle. The upper-left corner is at [<tt>x</tt>, <tt>y</tt>].
75
+ # If either <tt>width</tt> or <tt>height</tt> is 0, the rectangle is not rendered.
76
+ # Use the RVG::ShapeConstructors#rect method to create Rect objects in a container.
77
+ def initialize(width, height, x = 0, y = 0)
78
+ super()
79
+ width, height, x, y = Magick::RVG.convert_to_float(width, height, x, y)
80
+ raise ArgumentError, "width, height must be >= 0 (#{width}, #{height} given)" if width < 0 || height < 0
81
+
82
+ @args = [x, y, x + width, y + height]
83
+ @primitive = :rectangle
84
+ end
85
+
86
+ # Specify optional rounded corners for a rectangle. The arguments
87
+ # are the x- and y-axis radii. If y is omitted it defaults to x.
88
+ def round(rx, ry = nil)
89
+ rx, ry = Magick::RVG.convert_to_float(rx, ry || rx)
90
+ raise ArgumentError, "rx, ry must be >= 0 (#{rx}, #{ry} given)" if rx < 0 || ry < 0
91
+
92
+ @args << rx << ry
93
+ @primitive = :roundrectangle
94
+ self
95
+ end
96
+ end # class Rect
97
+
98
+ class PolyShape < Shape
99
+ def polypoints(points)
100
+ case points.length
101
+ when 1
102
+ points = Array(points[0])
103
+ when 2
104
+ x_coords = Array(points[0])
105
+ y_coords = Array(points[1])
106
+ raise ArgumentError, 'array arguments must contain at least one point' unless !x_coords.empty? && !y_coords.empty?
107
+
108
+ n = x_coords.length - y_coords.length
109
+ short = n > 0 ? y_coords : x_coords
110
+ olen = short.length
111
+ n.abs.times { |x| short << short[x % olen] }
112
+ points = x_coords.zip(y_coords).flatten
113
+ end
114
+ n = points.length
115
+ raise ArgumentError, "insufficient/odd number of points specified: #{n}" if n < 4 || n.odd?
116
+
117
+ Magick::RVG.convert_to_float(*points)
118
+ end
119
+ end # class PolyShape
120
+
121
+ class Polygon < PolyShape
122
+ # Draws a polygon. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
123
+ # define the points that make up the polygon. At least two
124
+ # points must be specified. If the last point is not the
125
+ # same as the first, adds an additional point to close
126
+ # the polygon.
127
+ # Use the RVG::ShapeConstructors#polygon method to create Polygon objects in a container.
128
+ def initialize(*points)
129
+ super()
130
+ @primitive = :polygon
131
+ @args = polypoints(points)
132
+ end
133
+ end # class Polygon
134
+
135
+ class Polyline < PolyShape
136
+ # Draws a polyline. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
137
+ # define the points that make up the polyline. At least two
138
+ # points must be specified.
139
+ # Use the RVG::ShapeConstructors#polyline method to create Polyline objects in a container.
140
+ def initialize(*points)
141
+ super()
142
+ points = polypoints(points)
143
+ @primitive = :polyline
144
+ @args = Magick::RVG.convert_to_float(*points)
145
+ end
146
+ end # class Polyline
147
+
148
+ class Image
149
+ include Stylable
150
+ include Transformable
151
+ include Describable
152
+ include PreserveAspectRatio
153
+ include Duplicatable
154
+
155
+ private
156
+
157
+ def align_to_viewport(scale)
158
+ tx = case @align
159
+ when 'none', /\AxMin/
160
+ 0
161
+ when NilClass, /\AxMid/
162
+ (@width - @image.columns * scale) / 2.0
163
+ when /\AxMax/
164
+ @width - @image.columns * scale
165
+ end
166
+
167
+ ty = case @align
168
+ when 'none', /YMin\z/
169
+ 0
170
+ when NilClass, /YMid\z/
171
+ (@height - @image.rows * scale) / 2.0
172
+ when /YMax\z/
173
+ @height - @image.rows * scale
174
+ end
175
+ [tx, ty]
176
+ end
177
+
178
+ def add_composite_primitive(gc)
179
+ if @align == 'none'
180
+ # Let RMagick do the scaling
181
+ scale = 1.0
182
+ width = @width
183
+ height = @height
184
+ elsif @meet_or_slice == 'meet'
185
+ scale = [@width / @image.columns, @height / @image.rows].min
186
+ width = @image.columns
187
+ height = @image.rows
188
+ else
189
+ # Establish clipping path around the current viewport
190
+ name = __id__.to_s
191
+ gc.define_clip_path(name) do
192
+ gc.path("M#{@x},#{@y} l#{@width},0 l0,#{@height} l-#{@width},0 l0,-#{@height}z")
193
+ end
194
+
195
+ gc.clip_path(name)
196
+ scale = [@width / @image.columns, @height / @image.rows].max
197
+ width = @image.columns
198
+ height = @image.rows
199
+ end
200
+ tx, ty = align_to_viewport(scale)
201
+ gc.composite(@x + tx, @y + ty, width * scale, height * scale, @image)
202
+ end
203
+
204
+ def init_viewbox
205
+ @align = nil
206
+ @vbx_width = @image.columns
207
+ @vbx_height = @image.rows
208
+ @meet_or_slice = 'meet'
209
+ end
210
+
211
+ public
212
+
213
+ # Composite a raster image in the viewport defined by [x,y] and
214
+ # +width+ and +height+.
215
+ # Use the RVG::ImageConstructors#image method to create Text objects in a container.
216
+ def initialize(image, width = nil, height = nil, x = 0, y = 0)
217
+ super() # run module initializers
218
+ @image = image.copy # use a copy of the image in case app. re-uses the argument
219
+ @x, @y, @width, @height = Magick::RVG.convert_to_float(x, y, width || @image.columns, height || @image.rows)
220
+ raise ArgumentError, 'width, height must be >= 0' if @width < 0 || @height < 0
221
+
222
+ init_viewbox
223
+ end
224
+
225
+ # @private
226
+ def add_primitives(gc)
227
+ # Do not render if width or height is 0
228
+ return if @width.zero? || @height.zero?
229
+
230
+ gc.push
231
+ add_transform_primitives(gc)
232
+ add_style_primitives(gc)
233
+ add_composite_primitive(gc)
234
+ gc.pop
235
+ end
236
+ end # class Image
237
+
238
+ # Methods that construct basic shapes within a container
239
+ module ShapeConstructors
240
+ # Draws a circle whose center is [<tt>cx</tt>, <tt>cy</tt>] and radius is +r+.
241
+ def circle(r, cx = 0, cy = 0)
242
+ circle = Circle.new(r, cx, cy)
243
+ @content << circle
244
+ circle
245
+ end
246
+
247
+ # Draws an ellipse whose center is [<tt>cx</tt>, <tt>cy</tt>] and having
248
+ # a horizontal radius +rx+ and vertical radius +ry+.
249
+ def ellipse(rx, ry, cx = 0, cy = 0)
250
+ ellipse = Ellipse.new(rx, ry, cx, cy)
251
+ @content << ellipse
252
+ ellipse
253
+ end
254
+
255
+ # Draws a line from [<tt>x1</tt>, <tt>y1</tt>] to [<tt>x2</tt>, <tt>y2</tt>].
256
+ def line(x1 = 0, y1 = 0, x2 = 0, y2 = 0)
257
+ line = Line.new(x1, y1, x2, y2)
258
+ @content << line
259
+ line
260
+ end
261
+
262
+ # Draws a path defined by an SVG path string or a PathData
263
+ # object.
264
+ def path(path)
265
+ path = Path.new(path)
266
+ @content << path
267
+ path
268
+ end
269
+
270
+ # Draws a rectangle whose upper-left corner is [<tt>x</tt>, <tt>y</tt>] and
271
+ # with the specified +width+ and +height+. Unless otherwise
272
+ # specified the rectangle has square corners. Returns a
273
+ # Rectangle object.
274
+ #
275
+ # Draw a rectangle with rounded corners by calling the #round
276
+ # method on the Rectangle object. <tt>rx</tt> and <tt>ry</tt> are
277
+ # the corner radii in the x- and y-directions. For example:
278
+ # canvas.rect(width, height, x, y).round(8, 6)
279
+ # If <tt>ry</tt> is omitted it defaults to <tt>rx</tt>.
280
+ def rect(width, height, x = 0, y = 0)
281
+ rect = Rect.new(width, height, x, y)
282
+ @content << rect
283
+ rect
284
+ end
285
+
286
+ # Draws a polygon. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
287
+ # define the points that make up the polygon. At least two
288
+ # points must be specified. If the last point is not the
289
+ # same as the first, adds an additional point to close
290
+ # the polygon.
291
+ def polygon(*points)
292
+ polygon = Polygon.new(*points)
293
+ @content << polygon
294
+ polygon
295
+ end
296
+
297
+ # Draws a polyline. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
298
+ # define the points that make up the polyline. At least two
299
+ # points must be specified.
300
+ def polyline(*points)
301
+ polyline = Polyline.new(*points)
302
+ @content << polyline
303
+ polyline
304
+ end
305
+ end # module ShapeContent
306
+
307
+ # Methods that reference ("use") other drawable objects within a container
308
+ module UseConstructors
309
+ # Reference an object to be inserted into the container's
310
+ # content. [<tt>x</tt>,<tt>y</tt>] is the offset from the upper-left
311
+ # corner. If the argument is an RVG or Image object and +width+ and +height+
312
+ # are specified, these values will override the +width+ and +height+
313
+ # attributes on the argument.
314
+ def use(obj, x = 0, y = 0, width = nil, height = nil)
315
+ use = Use.new(obj, x, y, width, height)
316
+ @content << use
317
+ use
318
+ end
319
+ end # module UseConstructors
320
+
321
+ # Methods that construct container objects within a container
322
+ module StructureConstructors
323
+ # Establishes a new viewport. [<tt>x</tt>, <tt>y</tt>] is the coordinate of the
324
+ # upper-left corner within the containing viewport. This is a
325
+ # _container_ method. Styles and
326
+ # transforms specified on this object will be used by objects
327
+ # contained within, unless overridden by an inner container or
328
+ # the contained object itself.
329
+ def rvg(cols, rows, x = 0, y = 0, &block)
330
+ rvg = Magick::RVG.new(cols, rows, &block)
331
+ begin
332
+ x = Float(x)
333
+ y = Float(y)
334
+ rescue ArgumentError
335
+ args = [cols, rows, x, y]
336
+ raise ArgumentError, "at least one argument is not convertable to Float (got #{args.map(&:class).join(', ')})"
337
+ end
338
+ rvg.corner(x, y)
339
+ @content << rvg
340
+ rvg
341
+ end
342
+
343
+ # Defines a group.
344
+ #
345
+ # This method constructs a new
346
+ # Group _container_ object. The styles and
347
+ # transforms specified on this object will be used by objects
348
+ # contained within, unless overridden by an inner container or
349
+ # the contained object itself.
350
+ # Define grouped elements by calling RVG::Embellishable
351
+ # methods within the associated block.
352
+ def g(&block)
353
+ group = Group.new(&block)
354
+ @content << group
355
+ group
356
+ end
357
+ end # module StructureConstructors
358
+
359
+ # Methods that construct raster image objects within a container
360
+ module ImageConstructors
361
+ # Composite a raster image at [<tt>x</tt>,<tt>y</tt>]
362
+ # in a viewport of the specified <tt>width</tt> and <tt>height</tt>.
363
+ # If not specified, the width and height are the width and height
364
+ # of the image. Use the RVG::PreserveAspectRatio#preserve_aspect_ratio method to
365
+ # control the placement and scaling of the image within the
366
+ # viewport. By default, the image is scaled to fit inside the
367
+ # viewport and centered within the viewport.
368
+ def image(image, width = nil, height = nil, x = 0, y = 0)
369
+ img = Image.new(image, width, height, x, y)
370
+ @content << img
371
+ img
372
+ end
373
+ end # module ImageConstructors
374
+
375
+ # Methods that create shapes, text, and other drawable objects
376
+ # within container objects such as ::Magick::RVG and
377
+ # ::Magick::RVG::Group
378
+ module Embellishable
379
+ include StructureConstructors
380
+ include ShapeConstructors
381
+ include TextConstructors
382
+ include UseConstructors
383
+ include ImageConstructors
384
+ end # module Embellishable
385
+ end # class RVG
416
386
  end # module Magick
417
-