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
data/lib/rvg/rvg.rb CHANGED
@@ -27,8 +27,7 @@
27
27
  # OSI Certified is a certification mark of the Open Source Initiative.
28
28
  #
29
29
  #++############################################################################
30
-
31
- require 'RMagick'
30
+ require 'rmagick'
32
31
  require 'rvg/misc'
33
32
  require 'rvg/describable'
34
33
  require 'rvg/stylable'
@@ -47,237 +46,239 @@ require 'pp' if ENV['debug_rvg']
47
46
  # RVG is the main class in this library. All graphic elements
48
47
  # must be contained within an RVG object.
49
48
  module Magick
50
- class RVG
49
+ class RVG
50
+ include Stylable
51
+ include Transformable
52
+ include Stretchable
53
+ include Embellishable
54
+ include Describable
55
+ include Duplicatable
51
56
 
52
- include Stylable
53
- include Transformable
54
- include Stretchable
55
- include Embellishable
56
- include Describable
57
- include Duplicatable
57
+ private
58
58
 
59
- private
59
+ # background_fill defaults to 'none'. If background_fill has been set to something
60
+ # else, combine it with the background_fill_opacity.
61
+ def bgfill
62
+ if @background_fill.nil?
63
+ color = Magick::Pixel.new(0, 0, 0, Magick::OpaqueAlpha)
64
+ else
65
+ color = @background_fill
66
+ color.alpha = @background_fill_opacity * Magick::OpaqueAlpha
67
+ end
68
+ color
69
+ end
60
70
 
61
- # background_fill defaults to 'none'. If background_fill has been set to something
62
- # else, combine it with the background_fill_opacity.
63
- def bgfill()
64
- if @background_fill.nil?
65
- color = Magick::Pixel.new(0,0,0,Magick::TransparentOpacity)
66
- else
67
- color = @background_fill
68
- color.opacity = (1.0 - @background_fill_opacity) * Magick::TransparentOpacity
69
- end
70
- return color
71
- end
71
+ def new_canvas
72
+ if @background_pattern
73
+ canvas = Magick::Image.new(@width, @height, @background_pattern)
74
+ elsif @background_image
75
+ canvas = if @width != @background_image.columns || @height != @background_image.rows
76
+ case @background_position
77
+ when :scaled
78
+ @background_image.resize(@width, @height)
79
+ when :tiled
80
+ Magick::Image.new(@width, @height, Magick::TextureFill.new(@background_image))
81
+ when :fit
82
+ width = @width
83
+ height = @height
84
+ bgcolor = bgfill
85
+ @background_image.change_geometry(Magick::Geometry.new(width, height)) do |new_cols, new_rows|
86
+ bg_image = @background_image.resize(new_cols, new_rows)
87
+ if bg_image.columns != width || bg_image.rows != height
88
+ bg = Magick::Image.new(width, height) { self.background_color = bgcolor }
89
+ bg_image = bg.composite!(bg_image, Magick::CenterGravity, Magick::OverCompositeOp)
90
+ end
91
+ bg_image
92
+ end
93
+ end
94
+ else
95
+ @background_image.copy
96
+ end
97
+ else
98
+ bgcolor = bgfill
99
+ canvas = Magick::Image.new(Integer(@width), Integer(@height)) { self.background_color = bgcolor }
100
+ end
101
+ canvas[:desc] = @desc if @desc
102
+ canvas[:title] = @title if @title
103
+ canvas[:metadata] = @metadata if @metadata
104
+ canvas
105
+ end
72
106
 
73
- def new_canvas
74
- if @background_pattern
75
- canvas = Magick::Image.new(@width, @height, @background_pattern)
76
- elsif @background_image
77
- if @width != @background_image.columns || @height != @background_image.rows
78
- canvas = case @background_position
79
- when :scaled
80
- @background_image.resize(@width, @height)
81
- when :tiled
82
- Magick::Image.new(@width, @height, Magick::TextureFill.new(@background_image))
83
- when :fit
84
- width, height = @width, @height
85
- bgcolor = bgfill()
86
- @background_image.change_geometry(Magick::Geometry.new(width, height)) do |new_cols, new_rows|
87
- bg_image = @background_image.resize(new_cols, new_rows)
88
- if bg_image.columns != width || bg_image.rows != height
89
- bg = Magick::Image.new(width, height) { self.background_color = bgcolor }
90
- bg_image = bg.composite!(bg_image, Magick::CenterGravity, Magick::OverCompositeOp)
91
- end
92
- bg_image
93
- end
94
- end
95
- else
96
- canvas = @background_image.copy
97
- end
98
- else
99
- bgcolor = bgfill()
100
- canvas = Magick::Image.new(Integer(@width), Integer(@height)) { self.background_color = bgcolor }
101
- end
102
- canvas[:desc] = @desc if @desc
103
- canvas[:title] = @title if @title
104
- canvas[:metadata] = @metadata if @metadata
105
- return canvas
107
+ if ENV['debug_prim']
108
+ def print_gc(gc)
109
+ primitives = gc.inspect.split(/\n/)
110
+ indent = 0
111
+ primitives.each do |cmd|
112
+ indent -= 1 if cmd['pop ']
113
+ print((' ' * indent), cmd, "\n")
114
+ indent += 1 if cmd['push ']
106
115
  end
116
+ end
117
+ end
107
118
 
108
- if ENV['debug_prim']
109
- def print_gc(gc)
110
- primitives = gc.inspect.split(/\n/)
111
- indent = 0
112
- primitives.each do |cmd|
113
- indent -= 1 if cmd['pop ']
114
- print((' '*indent), cmd, "\n")
115
- indent += 1 if cmd['push ']
116
- end
117
- end
118
- end
119
+ public
119
120
 
120
- public
121
+ WORD_SEP = / / # Regexp to separate words
121
122
 
122
- WORD_SEP = / / # Regexp to separate words
123
+ # The background image specified by background_image=
124
+ attr_reader :background_image
125
+ # The background image layout specified by background_position=
126
+ attr_reader :background_position
127
+ # The background fill color specified by background_fill=
128
+ attr_reader :background_fill
129
+ # The background fill color opacity specified by background_fill_opacity=
130
+ attr_reader :background_fill_opacity
131
+ # The image after drawing has completed
132
+ attr_reader :canvas
133
+ # For embedded RVG objects, the x-axis coordinate of the upper-left corner
134
+ attr_reader :x
135
+ # For embedded RVG objects, the x-axis coordinate of the upper-left corner
136
+ attr_reader :y
137
+ attr_reader :width, :height
123
138
 
124
- # The background image specified by background_image=
125
- attr_reader :background_image
126
- # The background image layout specified by background_position=
127
- attr_reader :background_position
128
- # The background fill color specified by background_fill=
129
- attr_reader :background_fill
130
- # The background fill color opacity specified by background_fill_opacity=
131
- attr_reader :background_fill_opacity
132
- # The image after drawing has completed
133
- attr_reader :canvas
134
- # For embedded RVG objects, the x-axis coordinate of the upper-left corner
135
- attr_reader :x
136
- # For embedded RVG objects, the x-axis coordinate of the upper-left corner
137
- attr_reader :y
138
- attr_reader :width, :height
139
+ # Sets an image to use as the canvas background. See background_position= for layout options.
140
+ def background_image=(bg_image)
141
+ warn 'background_image= has no effect in nested RVG objects' if @nested
142
+ raise ArgumentError, "background image must be an Image (got #{bg_image.class})" if bg_image && !bg_image.is_a?(Magick::Image)
139
143
 
140
- # Sets an image to use as the canvas background. See background_position= for layout options.
141
- def background_image=(bg_image)
142
- warn "background_image= has no effect in nested RVG objects" if @nested
143
- if bg_image && ! bg_image.kind_of?(Magick::Image)
144
- raise ArgumentError, "background image must be an Image (got #{bg_image.class})"
145
- end
146
- @background_image = bg_image
147
- end
144
+ @background_image = bg_image
145
+ end
148
146
 
149
- # Sets an object to use to fill the canvas background.
150
- # The object must have a <tt>fill</tt> method. See the <b>Fill Classes</b>
151
- # section in the RMagick doc for more information.
152
- def background_pattern=(filler)
153
- warn "background_pattern= has no effect in nested RVG objects" if @nested
154
- @background_pattern = filler
155
- end
147
+ # Sets an object to use to fill the canvas background.
148
+ # The object must have a <tt>fill</tt> method. See the <b>Fill Classes</b>
149
+ # section in the RMagick doc for more information.
150
+ def background_pattern=(filler)
151
+ warn 'background_pattern= has no effect in nested RVG objects' if @nested
152
+ @background_pattern = filler
153
+ end
156
154
 
157
- # How to position the background image on the canvas. One of the following symbols:
158
- # [:scaled] Scale the image to the canvas width and height.
159
- # [:tiled] Tile the image across the canvas.
160
- # [:fit] Scale the image to fit within the canvas while retaining the
161
- # image proportions. Center the image on the canvas. Color any part of
162
- # the canvas not covered by the image with the background color.
163
- def background_position=(pos)
164
- warn "background_position= has no effect in nested RVG objects" if @nested
165
- bg_pos = pos.to_s.downcase
166
- if ! ['scaled', 'tiled', 'fit'].include?(bg_pos)
167
- raise ArgumentError, "background position must be `scaled', `tiled', or `fit' (#{pos} given)"
168
- end
169
- @background_position = bg_pos.to_sym
170
- end
155
+ # How to position the background image on the canvas. One of the following symbols:
156
+ # [:scaled] Scale the image to the canvas width and height.
157
+ # [:tiled] Tile the image across the canvas.
158
+ # [:fit] Scale the image to fit within the canvas while retaining the
159
+ # image proportions. Center the image on the canvas. Color any part of
160
+ # the canvas not covered by the image with the background color.
161
+ def background_position=(pos)
162
+ warn 'background_position= has no effect in nested RVG objects' if @nested
163
+ bg_pos = pos.to_s.downcase
164
+ raise ArgumentError, "background position must be `scaled', `tiled', or `fit' (#{pos} given)" unless %w[scaled tiled fit].include?(bg_pos)
171
165
 
172
- # Sets the canvas background color. Either a Magick::Pixel or a color name.
173
- # The default fill is "none", that is, transparent black.
174
- def background_fill=(color)
175
- warn "background_fill= has no effect in nested RVG objects" if @nested
176
- if ! color.kind_of?(Magick::Pixel)
177
- begin
178
- @background_fill = Magick::Pixel.from_color(color)
179
- rescue Magick::ImageMagickError
180
- raise ArgumentError, "unknown color `#{color}'"
181
- rescue TypeError
182
- raise TypeError, "cannot convert #{color.class} into Pixel"
183
- rescue
184
- raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})"
185
- end
186
- else
187
- @background_fill = color
188
- end
189
- end
166
+ @background_position = bg_pos.to_sym
167
+ end
190
168
 
191
- # Opacity of the background fill color, a number between 0.0 (transparent) and
192
- # 1.0 (opaque). The default is 1.0 when the background_fill= attribute has been set.
193
- def background_fill_opacity=(opacity)
194
- warn "background_fill_opacity= has no effect in nested RVG objects" if @nested
195
- begin
196
- @background_fill_opacity = Float(opacity)
197
- rescue ArgumentError
198
- raise ArgumentError, "background_fill_opacity must be a number between 0 and 1 (#{opacity} given)"
199
- end
169
+ # Sets the canvas background color. Either a Magick::Pixel or a color name.
170
+ # The default fill is "none", that is, transparent black.
171
+ def background_fill=(color)
172
+ warn 'background_fill= has no effect in nested RVG objects' if @nested
173
+ if !color.is_a?(Magick::Pixel)
174
+ begin
175
+ @background_fill = Magick::Pixel.from_color(color)
176
+ rescue Magick::ImageMagickError
177
+ raise ArgumentError, "unknown color `#{color}'"
178
+ rescue TypeError
179
+ raise TypeError, "cannot convert #{color.class} into Pixel"
180
+ rescue StandardError
181
+ raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})"
200
182
  end
183
+ else
184
+ @background_fill = color
185
+ end
186
+ end
201
187
 
202
- # Draw a +width+ x +height+ image. The image is specified by calling
203
- # one or more drawing methods on the RVG object.
204
- # You can group the drawing method calls in the optional associated block.
205
- # The +x+ and +y+ arguments have no meaning for the outermost RVG object.
206
- # On nested RVG objects [+x+, +y+] is the coordinate of the upper-left
207
- # corner in the containing canvas on which the nested RVG object is placed.
208
- #
209
- # Drawing occurs on a +canvas+ created by the #draw method. By default the
210
- # canvas is transparent. You can specify a different canvas with the
211
- # #background_fill= or #background_image= methods.
212
- #
213
- # RVG objects are _containers_. That is, styles and transforms defined
214
- # on the object are used by contained objects such as shapes, text, and
215
- # groups unless overridden by an inner container or the object itself.
216
- def initialize(width=nil, height=nil)
217
- super
218
- @width, @height = width, height
219
- @content = Content.new
220
- @canvas = nil
221
- @background_fill = nil
222
- @background_fill_opacity = 1.0 # applies only if background_fill= is used
223
- @background_position = :scaled
224
- @background_pattern, @background_image, @desc, @title, @metadata = nil
225
- @x, @y = 0.0, 0.0
226
- @nested = false
227
- yield(self) if block_given?
228
- end
188
+ # Opacity of the background fill color, a number between 0.0 (transparent) and
189
+ # 1.0 (opaque). The default is 1.0 when the background_fill= attribute has been set.
190
+ def background_fill_opacity=(opacity)
191
+ warn 'background_fill_opacity= has no effect in nested RVG objects' if @nested
192
+ begin
193
+ @background_fill_opacity = Float(opacity)
194
+ rescue ArgumentError
195
+ raise ArgumentError, "background_fill_opacity must be a number between 0 and 1 (#{opacity} given)"
196
+ end
197
+ end
229
198
 
230
- # Construct a canvas or reuse an existing canvas.
231
- # Execute drawing commands. Return the canvas.
232
- def draw
233
- raise StandardError, "draw not permitted in nested RVG objects" if @nested
234
- @canvas ||= new_canvas # allow drawing over existing canvas
235
- gc = Utility::GraphicContext.new
236
- add_outermost_primitives(gc)
237
- pp(self) if ENV['debug_rvg']
238
- print_gc(gc) if ENV['debug_prim']
239
- gc.draw(@canvas)
240
- return @canvas
241
- end
199
+ # Draw a +width+ x +height+ image. The image is specified by calling
200
+ # one or more drawing methods on the RVG object.
201
+ # You can group the drawing method calls in the optional associated block.
202
+ # The +x+ and +y+ arguments have no meaning for the outermost RVG object.
203
+ # On nested RVG objects [+x+, +y+] is the coordinate of the upper-left
204
+ # corner in the containing canvas on which the nested RVG object is placed.
205
+ #
206
+ # Drawing occurs on a +canvas+ created by the #draw method. By default the
207
+ # canvas is transparent. You can specify a different canvas with the
208
+ # #background_fill= or #background_image= methods.
209
+ #
210
+ # RVG objects are _containers_. That is, styles and transforms defined
211
+ # on the object are used by contained objects such as shapes, text, and
212
+ # groups unless overridden by an inner container or the object itself.
213
+ def initialize(width = nil, height = nil)
214
+ super
215
+ @width = width
216
+ @height = height
217
+ @content = Content.new
218
+ @canvas = nil
219
+ @background_fill = nil
220
+ @background_fill_opacity = 1.0 # applies only if background_fill= is used
221
+ @background_position = :scaled
222
+ @background_pattern, @background_image, @desc, @title, @metadata = nil
223
+ @x = 0.0
224
+ @y = 0.0
225
+ @nested = false
226
+ yield(self) if block_given?
227
+ end
242
228
 
243
- # Accept #use arguments. Use (x,y) to generate an additional translate.
244
- # Override @width and @height if new values are supplied.
245
- def ref(x, y, rw, rh) #:nodoc:
246
- translate(x, y) if (x != 0 || y != 0)
247
- @width = rw if rw
248
- @height = rh if rh
249
- end
229
+ # Construct a canvas or reuse an existing canvas.
230
+ # Execute drawing commands. Return the canvas.
231
+ def draw
232
+ raise StandardError, 'draw not permitted in nested RVG objects' if @nested
250
233
 
251
- # Used by Magick::Embellishable.rvg to set non-0 x- and y-coordinates
252
- def corner(x, y) #:nodoc:
253
- @nested = true
254
- @x, @y = Float(x), Float(y)
255
- translate(@x, @y) if (@x != 0.0 || @y != 0.0)
256
- end
234
+ @canvas ||= new_canvas # allow drawing over existing canvas
235
+ gc = Utility::GraphicContext.new
236
+ add_outermost_primitives(gc)
237
+ pp(self) if ENV['debug_rvg']
238
+ print_gc(gc) if ENV['debug_prim']
239
+ gc.draw(@canvas)
240
+ @canvas
241
+ end
257
242
 
258
- # Primitives for the outermost RVG object
259
- def add_outermost_primitives(gc) #:nodoc:
260
- add_transform_primitives(gc)
261
- gc.push
262
- add_viewbox_primitives(@width, @height, gc)
263
- add_style_primitives(gc)
264
- @content.each { |element| element.add_primitives(gc) }
265
- gc.pop
266
- self
267
- end
243
+ # Accept #use arguments. Use (x,y) to generate an additional translate.
244
+ # Override @width and @height if new values are supplied.
245
+ # @private
246
+ def ref(x, y, rw, rh)
247
+ translate(x, y) if x != 0 || y != 0
248
+ @width = rw if rw
249
+ @height = rh if rh
250
+ end
268
251
 
269
- # Primitives for nested RVG objects
270
- def add_primitives(gc) #:nodoc:
271
- if @width.nil? || @height.nil?
272
- raise ArgumentError, "RVG width or height undefined"
273
- elsif @width == 0 || @height == 0
274
- return self
275
- end
276
- gc.push
277
- add_outermost_primitives(gc)
278
- gc.pop
279
- end
252
+ # Used by Magick::Embellishable.rvg to set non-0 x- and y-coordinates
253
+ # @private
254
+ def corner(x, y)
255
+ @nested = true
256
+ @x = Float(x)
257
+ @y = Float(y)
258
+ translate(@x, @y) if @x != 0.0 || @y != 0.0
259
+ end
280
260
 
281
- end # end class RVG
282
- end # end module Magick
261
+ # Primitives for the outermost RVG object
262
+ # @private
263
+ def add_outermost_primitives(gc)
264
+ add_transform_primitives(gc)
265
+ gc.push
266
+ add_viewbox_primitives(@width, @height, gc)
267
+ add_style_primitives(gc)
268
+ @content.each { |element| element.add_primitives(gc) }
269
+ gc.pop
270
+ self
271
+ end
283
272
 
273
+ # Primitives for nested RVG objects
274
+ # @private
275
+ def add_primitives(gc)
276
+ raise ArgumentError, 'RVG width or height undefined' if @width.nil? || @height.nil?
277
+ return self if @width.zero? || @height.zero?
278
+
279
+ gc.push
280
+ add_outermost_primitives(gc)
281
+ gc.pop
282
+ end
283
+ end # end class RVG
284
+ end # end module Magick