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,167 +2,158 @@
2
2
  # $Id: stretchable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $
3
3
  # Copyright (C) 2009 Timothy P. Hunter
4
4
  #++
5
-
6
5
  module Magick
7
- class RVG
8
-
9
- module PreserveAspectRatio
10
- #--
11
- # Included in Stretchable module and Image class
12
- #++
13
- # Specifies how the image within a viewport should be scaled.
14
- # [+align+] a combination of 'xMin', 'xMid', or 'xMax', followed by
15
- # 'YMin', 'YMid', or 'YMax'
16
- # [+meet_or_slice+] one of 'meet' or 'slice'
17
- def preserve_aspect_ratio(align, meet_or_slice='meet')
18
- @align = align.to_s
19
- if @align != 'none'
20
- m = /\A(xMin|xMid|xMax)(YMin|YMid|YMax)\z/.match(@align)
21
- raise(ArgumentError, "unknown alignment specifier: #{@align}") unless m
22
- end
23
-
24
- if meet_or_slice
25
- meet_or_slice = meet_or_slice.to_s.downcase
26
- if meet_or_slice == 'meet' || meet_or_slice == 'slice'
27
- @meet_or_slice = meet_or_slice
28
- else
29
- raise(ArgumentError, "specifier must be `meet' or `slice' (got #{meet_or_slice})")
30
- end
31
- end
32
- yield(self) if block_given?
33
- self
34
- end
35
- end # module PreserveAspectRatio
36
-
37
-
38
- # The methods in this module describe the user-coordinate space.
39
- # RVG and Pattern objects are stretchable.
40
- module Stretchable
41
-
42
- private
43
- # Scale to fit
44
- def set_viewbox_none(width, height)
45
- sx, sy = 1.0, 1.0
46
-
47
- if @vbx_width
48
- sx = width / @vbx_width
49
- end
50
- if @vbx_height
51
- sy = height / @vbx_height
52
- end
53
-
54
- return [sx, sy]
55
- end
56
-
57
- # Use align attribute to compute x- and y-offset from viewport's upper-left corner.
58
- def align_to_viewport(width, height, sx, sy)
59
- tx = case @align
60
- when /\AxMin/
61
- 0
62
- when NilClass, /\AxMid/
63
- (width - @vbx_width*sx) / 2.0
64
- when /\AxMax/
65
- width - @vbx_width*sx
66
- end
67
-
68
- ty = case @align
69
- when /YMin\z/
70
- 0
71
- when NilClass, /YMid\z/
72
- (height - @vbx_height*sy) / 2.0
73
- when /YMax\z/
74
- height - @vbx_height*sy
75
- end
76
- return [tx, ty]
77
- end
78
-
79
- # Scale to smaller viewbox dimension
80
- def set_viewbox_meet(width, height)
81
- sx = sy = [width / @vbx_width, height / @vbx_height].min
82
- return [sx, sy]
83
- end
84
-
85
- # Scale to larger viewbox dimension
86
- def set_viewbox_slice(width, height)
87
- sx = sy = [width / @vbx_width, height / @vbx_height].max
88
- return [sx, sy]
89
- end
90
-
91
- # Establish the viewbox as necessary
92
- def add_viewbox_primitives(width, height, gc)
93
- @vbx_width ||= width
94
- @vbx_height ||= height
95
- @vbx_x ||= 0.0
96
- @vbx_y ||= 0.0
97
-
98
- if @align == 'none'
99
- sx, sy = set_viewbox_none(width, height)
100
- tx, ty = 0, 0
101
- elsif @meet_or_slice == 'meet'
102
- sx, sy = set_viewbox_meet(width, height)
103
- tx, ty = align_to_viewport(width, height, sx, sy)
104
- else
105
- sx, sy = set_viewbox_slice(width, height)
106
- tx, ty = align_to_viewport(width, height, sx, sy)
107
- end
108
-
109
- # Establish clipping path around the current viewport
110
- name = __id__.to_s
111
- gc.define_clip_path(name) do
112
- gc.path("M0,0 l#{width},0 l0,#{height} l-#{width},0 l0,-#{height}z")
113
- end
114
-
115
- gc.clip_path(name)
116
- # Add a non-scaled translation if meet or slice
117
- gc.translate(tx, ty) if (tx.abs > 1.0e-10 || ty.abs > 1.0e-10)
118
- # Scale viewbox as necessary
119
- gc.scale(sx, sy) if (sx != 1.0 || sy != 1.0)
120
- # Add a scaled translation if non-0 origin
121
- gc.translate(-@vbx_x, -@vbx_y) if (@vbx_x.abs != 0.0 || @vbx_y.abs != 0)
122
- end
123
-
124
- def initialize(*args, &block)
125
- super()
126
- @vbx_x, @vbx_y, @vbx_width, @vbx_height = nil
127
- @meet_or_slice = 'meet'
128
- @align = nil
129
- end
130
-
131
- public
132
- include PreserveAspectRatio
133
-
134
- # Describe a user coordinate system to be imposed on the viewbox.
135
- # The arguments must be numbers and the +width+ and +height+
136
- # arguments must be positive.
137
- def viewbox(x, y, width, height)
138
- begin
139
- @vbx_x = Float(x)
140
- @vbx_y = Float(y)
141
- @vbx_width = Float(width)
142
- @vbx_height = Float(height)
143
- rescue ArgumentError
144
- raise ArgumentError, "arguments must be convertable to float (got #{x.class}, #{y.class}, #{width.class}, #{height.class})"
145
- end
146
- raise(ArgumentError, "viewbox width must be > 0 (#{width} given)") unless width >= 0
147
- raise(ArgumentError, "viewbox height must be > 0 (#{height} given)") unless height >= 0
148
-
149
- # return the user-coordinate space attributes if defined
150
- class << self
151
- if not defined? @redefined then
152
- @redefined = true
153
- define_method(:x) { @vbx_x }
154
- define_method(:y) { @vbx_y }
155
- define_method(:width) { @vbx_width}
156
- define_method(:height) { @vbx_height }
157
- end
158
- end
159
-
160
- yield(self) if block_given?
161
- self
162
- end
163
-
164
- end # module Stretchable
165
-
166
- end # class RVG
6
+ class RVG
7
+ module PreserveAspectRatio
8
+ #--
9
+ # Included in Stretchable module and Image class
10
+ #++
11
+ # Specifies how the image within a viewport should be scaled.
12
+ # [+align+] a combination of 'xMin', 'xMid', or 'xMax', followed by
13
+ # 'YMin', 'YMid', or 'YMax'
14
+ # [+meet_or_slice+] one of 'meet' or 'slice'
15
+ def preserve_aspect_ratio(align, meet_or_slice = 'meet')
16
+ @align = align.to_s
17
+ if @align != 'none'
18
+ m = /\A(xMin|xMid|xMax)(YMin|YMid|YMax)\z/.match(@align)
19
+ raise(ArgumentError, "unknown alignment specifier: #{@align}") unless m
20
+ end
21
+
22
+ if meet_or_slice
23
+ meet_or_slice = meet_or_slice.to_s.downcase
24
+ raise(ArgumentError, "specifier must be `meet' or `slice' (got #{meet_or_slice})") unless %w[meet slice].include?(meet_or_slice)
25
+
26
+ @meet_or_slice = meet_or_slice
27
+ end
28
+ yield(self) if block_given?
29
+ self
30
+ end
31
+ end # module PreserveAspectRatio
32
+
33
+ # The methods in this module describe the user-coordinate space.
34
+ # RVG and Pattern objects are stretchable.
35
+ module Stretchable
36
+ private
37
+
38
+ # Scale to fit
39
+ def set_viewbox_none(width, height)
40
+ sx = 1.0
41
+ sy = 1.0
42
+
43
+ sx = width / @vbx_width if @vbx_width
44
+ sy = height / @vbx_height if @vbx_height
45
+
46
+ [sx, sy]
47
+ end
48
+
49
+ # Use align attribute to compute x- and y-offset from viewport's upper-left corner.
50
+ def align_to_viewport(width, height, sx, sy)
51
+ tx = case @align
52
+ when /\AxMin/
53
+ 0
54
+ when NilClass, /\AxMid/
55
+ (width - @vbx_width * sx) / 2.0
56
+ when /\AxMax/
57
+ width - @vbx_width * sx
58
+ end
59
+
60
+ ty = case @align
61
+ when /YMin\z/
62
+ 0
63
+ when NilClass, /YMid\z/
64
+ (height - @vbx_height * sy) / 2.0
65
+ when /YMax\z/
66
+ height - @vbx_height * sy
67
+ end
68
+ [tx, ty]
69
+ end
70
+
71
+ # Scale to smaller viewbox dimension
72
+ def set_viewbox_meet(width, height)
73
+ sx = sy = [width / @vbx_width, height / @vbx_height].min
74
+ [sx, sy]
75
+ end
76
+
77
+ # Scale to larger viewbox dimension
78
+ def set_viewbox_slice(width, height)
79
+ sx = sy = [width / @vbx_width, height / @vbx_height].max
80
+ [sx, sy]
81
+ end
82
+
83
+ # Establish the viewbox as necessary
84
+ def add_viewbox_primitives(width, height, gc)
85
+ @vbx_width ||= width
86
+ @vbx_height ||= height
87
+ @vbx_x ||= 0.0
88
+ @vbx_y ||= 0.0
89
+
90
+ if @align == 'none'
91
+ sx, sy = set_viewbox_none(width, height)
92
+ tx = 0
93
+ ty = 0
94
+ elsif @meet_or_slice == 'meet'
95
+ sx, sy = set_viewbox_meet(width, height)
96
+ tx, ty = align_to_viewport(width, height, sx, sy)
97
+ else
98
+ sx, sy = set_viewbox_slice(width, height)
99
+ tx, ty = align_to_viewport(width, height, sx, sy)
100
+ end
101
+
102
+ # Establish clipping path around the current viewport
103
+ name = __id__.to_s
104
+ gc.define_clip_path(name) do
105
+ gc.path("M0,0 l#{width},0 l0,#{height} l-#{width},0 l0,-#{height}z")
106
+ end
107
+
108
+ gc.clip_path(name)
109
+ # Add a non-scaled translation if meet or slice
110
+ gc.translate(tx, ty) if tx.abs > 1.0e-10 || ty.abs > 1.0e-10
111
+ # Scale viewbox as necessary
112
+ gc.scale(sx, sy) if sx != 1.0 || sy != 1.0
113
+ # Add a scaled translation if non-0 origin
114
+ gc.translate(-@vbx_x, -@vbx_y) if @vbx_x.abs != 0.0 || @vbx_y.abs != 0
115
+ end
116
+
117
+ def initialize(*_args)
118
+ super()
119
+ @vbx_x, @vbx_y, @vbx_width, @vbx_height = nil
120
+ @meet_or_slice = 'meet'
121
+ @align = nil
122
+ end
123
+
124
+ public
125
+
126
+ include PreserveAspectRatio
127
+
128
+ # Describe a user coordinate system to be imposed on the viewbox.
129
+ # The arguments must be numbers and the +width+ and +height+
130
+ # arguments must be positive.
131
+ def viewbox(x, y, width, height)
132
+ begin
133
+ @vbx_x = Float(x)
134
+ @vbx_y = Float(y)
135
+ @vbx_width = Float(width)
136
+ @vbx_height = Float(height)
137
+ rescue ArgumentError
138
+ raise ArgumentError, "arguments must be convertable to float (got #{x.class}, #{y.class}, #{width.class}, #{height.class})"
139
+ end
140
+ raise(ArgumentError, "viewbox width must be > 0 (#{width} given)") unless width >= 0
141
+ raise(ArgumentError, "viewbox height must be > 0 (#{height} given)") unless height >= 0
142
+
143
+ # return the user-coordinate space attributes if defined
144
+ class << self
145
+ unless defined? @redefined
146
+ @redefined = true
147
+ define_method(:x) { @vbx_x }
148
+ define_method(:y) { @vbx_y }
149
+ define_method(:width) { @vbx_width }
150
+ define_method(:height) { @vbx_height }
151
+ end
152
+ end
153
+
154
+ yield(self) if block_given?
155
+ self
156
+ end
157
+ end # module Stretchable
158
+ end # class RVG
167
159
  end # module Magick
168
-
data/lib/rvg/stylable.rb CHANGED
@@ -2,123 +2,117 @@
2
2
  # $Id: stylable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $
3
3
  # Copyright (C) 2009 Timothy P. Hunter
4
4
  #++
5
-
6
5
  module Magick
7
- class RVG
8
-
9
- #:stopdoc:
10
- STYLES = [:clip_path, :clip_rule, :fill, :fill_opacity, :fill_rule, :font,
11
- :font_family, :font_size, :font_stretch, :font_style, :font_weight,
12
- :opacity, :stroke, :stroke_dasharray, :stroke_dashoffset, :stroke_linecap,
13
- :stroke_linejoin, :stroke_miterlimit, :stroke_opacity, :stroke_width,
14
- :text_anchor, :text_decoration,
15
- :glyph_orientation_vertical, :glyph_orientation_horizontal,
16
- :letter_spacing, :word_spacing, :baseline_shift, :writing_mode]
17
-
18
- Styles = Struct.new(*STYLES)
19
-
20
- # Styles is a Struct class with a couple of extra methods
21
- class Styles
22
-
23
- def set(styles)
24
- begin
25
- styles.each_pair do |style, value|
26
- begin
27
- self[style] = value
28
- rescue NoMethodError
29
- raise ArgumentError, "unknown style `#{style}'"
30
- end
31
- end
32
- rescue NoMethodError
33
- raise ArgumentError, "style arguments must be in the form `style => value'"
34
- end
35
- self
36
- end
37
-
38
- # Iterate over the style names. Yield for each style that has a value.
39
- def each_value
40
- each_pair do |style, value|
41
- yield(style, value) if value
42
- end
43
- end
44
-
45
- # The "usual" deep_copy method doesn't copy a Struct correctly.
46
- def deep_copy(h=nil)
47
- copy = Styles.new
48
- each_pair { |style, value| copy[style] = value }
49
- return copy
6
+ class RVG
7
+ #:stopdoc:
8
+ STYLES = %i[
9
+ clip_path clip_rule fill fill_opacity fill_rule font
10
+ font_family font_size font_stretch font_style font_weight
11
+ opacity stroke stroke_dasharray stroke_dashoffset stroke_linecap
12
+ stroke_linejoin stroke_miterlimit stroke_opacity stroke_width
13
+ text_anchor text_decoration
14
+ glyph_orientation_vertical glyph_orientation_horizontal
15
+ letter_spacing word_spacing baseline_shift writing_mode
16
+ ]
17
+
18
+ Styles = Struct.new(*STYLES)
19
+
20
+ # Styles is a Struct class with a couple of extra methods
21
+ class Styles
22
+ def set(styles)
23
+ begin
24
+ styles.each_pair do |style, value|
25
+ begin
26
+ self[style] = value
27
+ rescue NoMethodError
28
+ raise ArgumentError, "unknown style `#{style}'"
50
29
  end
51
-
52
- end # class Styles
53
-
54
- #:startdoc:
55
-
56
- # This module is mixed into classes that can have styles.
57
- module Stylable
58
-
59
- private
60
-
61
- # For each style that has a value, add a style primitive to the gc.
62
- # Use splat to splat out Array arguments such as stroke_dasharray.
63
- def add_style_primitives(gc)
64
- @styles.each_value do |style, value|
65
- if value.respond_to? :add_primitives
66
- value.add_primitives(gc, style)
67
- else
68
- gc.__send__(style, *value)
69
- end
70
- end
71
- end
72
-
73
- def initialize
74
- super
75
- @styles = Styles.new
76
- end
77
-
78
- public
79
-
80
- # This method can be used with any RVG, Group, Use, Text, or
81
- # shape object. The argument is a hash. The style names are
82
- # the hash keys. The style names and values are:
83
- # [:baseline_shift] modify the text baseline
84
- # [:clip_path] clipping path defined by clip_path
85
- # [:clip_rule] 'evenodd' or 'nozero'
86
- # [:fill] color name
87
- # [:fill_opacity] the fill opacity, 0.0<=N<=1.0
88
- # [:fill_rule] 'evenodd' or 'nozero'
89
- # [:font] font name or font file name
90
- # [:font_family] font family name, ex. 'serif'
91
- # [:font_size] font size in points
92
- # [:font_stretch] 'normal','ultra_condensed','extra_condensed',
93
- # 'condensed','semi_condensed','semi_expanded',
94
- # 'expanded','extra_expanded','ultra_expanded'
95
- # [:font_style] 'normal','italic','oblique'
96
- # [:font_weight] 'normal','bold','bolder','lighter', or
97
- # a multiple of 100 between 100 and 900.
98
- # [:glyph_orientation_horizontal] 0, 90, 180, 270
99
- # [:glyph_orientation_vertical] 0, 90, 180, 270
100
- # [:letter_spacing] modify the spacing between letters
101
- # [:opacity] both fill and stroke opacity, 0.0<=N<=1.0
102
- # [:stroke] color name
103
- # [:stroke_dasharray] dash pattern (Array)
104
- # [:stroke_dashoffset] initial distance into dash pattern
105
- # [:stroke_linecap] 'butt', 'round', 'square'
106
- # [:stroke_linejoin] 'miter', 'round', 'bevel'
107
- # [:stroke_miterlimit] miter length constraint
108
- # [:stroke_opacity] the stroke opacity, 0.0<=N<=1.0
109
- # [:stroke_width] stroke width
110
- # [:text_anchor] 'start','middle','end'
111
- # [:text_decoration] 'none','underline','overline','line_through'
112
- # [:word_spacing] modify the spacing between words
113
- # [:writing_mode] 'lr-tb', 'lr', 'rt-tb', 'rl', 'tb-rl', 'tb'
114
- def styles(styles)
115
- @styles.set(styles)
116
- yield(self) if block_given?
117
- self
118
- end
119
-
120
- end # module Stylable
121
-
122
- end # class RVG
30
+ end
31
+ rescue NoMethodError
32
+ raise ArgumentError, "style arguments must be in the form `style => value'"
33
+ end
34
+ self
35
+ end
36
+
37
+ # Iterate over the style names. Yield for each style that has a value.
38
+ def each_value
39
+ each_pair do |style, value|
40
+ yield(style, value) if value
41
+ end
42
+ end
43
+
44
+ # The "usual" deep_copy method doesn't copy a Struct correctly.
45
+ def deep_copy(_h = nil)
46
+ copy = Styles.new
47
+ each_pair { |style, value| copy[style] = value }
48
+ copy
49
+ end
50
+ end # class Styles
51
+
52
+ #:startdoc:
53
+
54
+ # This module is mixed into classes that can have styles.
55
+ module Stylable
56
+ private
57
+
58
+ # For each style that has a value, add a style primitive to the gc.
59
+ # Use splat to splat out Array arguments such as stroke_dasharray.
60
+ def add_style_primitives(gc)
61
+ @styles.each_value do |style, value|
62
+ if value.respond_to? :add_primitives
63
+ value.add_primitives(gc, style)
64
+ else
65
+ gc.__send__(style, *value)
66
+ end
67
+ end
68
+ end
69
+
70
+ def initialize
71
+ super
72
+ @styles = Styles.new
73
+ end
74
+
75
+ public
76
+
77
+ # This method can be used with any RVG, Group, Use, Text, or
78
+ # shape object. The argument is a hash. The style names are
79
+ # the hash keys. The style names and values are:
80
+ # [:baseline_shift] modify the text baseline
81
+ # [:clip_path] clipping path defined by clip_path
82
+ # [:clip_rule] 'evenodd' or 'nozero'
83
+ # [:fill] color name
84
+ # [:fill_opacity] the fill opacity, 0.0<=N<=1.0
85
+ # [:fill_rule] 'evenodd' or 'nozero'
86
+ # [:font] font name or font file name
87
+ # [:font_family] font family name, ex. 'serif'
88
+ # [:font_size] font size in points
89
+ # [:font_stretch] 'normal','ultra_condensed','extra_condensed',
90
+ # 'condensed','semi_condensed','semi_expanded',
91
+ # 'expanded','extra_expanded','ultra_expanded'
92
+ # [:font_style] 'normal','italic','oblique'
93
+ # [:font_weight] 'normal','bold','bolder','lighter', or
94
+ # a multiple of 100 between 100 and 900.
95
+ # [:glyph_orientation_horizontal] 0, 90, 180, 270
96
+ # [:glyph_orientation_vertical] 0, 90, 180, 270
97
+ # [:letter_spacing] modify the spacing between letters
98
+ # [:opacity] both fill and stroke opacity, 0.0<=N<=1.0
99
+ # [:stroke] color name
100
+ # [:stroke_dasharray] dash pattern (Array)
101
+ # [:stroke_dashoffset] initial distance into dash pattern
102
+ # [:stroke_linecap] 'butt', 'round', 'square'
103
+ # [:stroke_linejoin] 'miter', 'round', 'bevel'
104
+ # [:stroke_miterlimit] miter length constraint
105
+ # [:stroke_opacity] the stroke opacity, 0.0<=N<=1.0
106
+ # [:stroke_width] stroke width
107
+ # [:text_anchor] 'start','middle','end'
108
+ # [:text_decoration] 'none','underline','overline','line_through'
109
+ # [:word_spacing] modify the spacing between words
110
+ # [:writing_mode] 'lr-tb', 'lr', 'rt-tb', 'rl', 'tb-rl', 'tb'
111
+ def styles(styles)
112
+ @styles.set(styles)
113
+ yield(self) if block_given?
114
+ self
115
+ end
116
+ end # module Stylable
117
+ end # class RVG
123
118
  end # module Magick
124
-