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/text.rb CHANGED
@@ -3,185 +3,174 @@
3
3
  # Copyright (C) 2009 Timothy P. Hunter
4
4
  #++
5
5
  # Text-related classes
6
-
7
6
  module Magick
8
- class RVG
9
-
10
- # Base class for Tspan, Tref and Text.
11
- class TextBase
12
- include Stylable
13
- include Duplicatable
14
-
15
- private
16
-
17
- def initialize(text, &block) #:nodoc:
18
- super()
19
- @text = text.to_s if text
20
- @dx = @dy = 0
21
- @rotation = 0
22
- @tspans = Content.new
23
- yield(self) if block_given?
24
- end
25
-
26
- public
27
-
28
- # Create a new text chunk. Each chunk can have its own initial position and styles.
29
- # If <tt>x</tt> and <tt>y</tt> are omitted the text starts at the current text
30
- # position.
31
- def tspan(text, x=nil, y=nil)
32
- tspan = Tspan.new(text, x, y)
33
- tspan.parent = self
34
- @tspans << tspan
35
- return tspan
36
- end
37
-
38
- # Add <tt>x</tt> and <tt>y</tt> to the current text position.
39
- def d(x, y=0)
40
- @dx, @dy = Magick::RVG.convert_to_float(x, y)
41
- yield(self) if block_given?
42
- self
43
- end
44
-
45
- # Rotate the text about the current text position.
46
- def rotate(degrees)
47
- @rotation = Magick::RVG.convert_to_float(degrees)[0]
48
- yield(self) if block_given?
49
- self
50
- end
51
-
52
- # We do our own transformations.
53
- def add_primitives(gc) #:nodoc:
54
- if @text || @tspans.length > 0
55
- gc.push
56
- x = self.cx + @dx
57
- y = self.cy + @dy
58
- if @rotation != 0
59
- gc.translate(x, y)
60
- gc.rotate(@rotation)
61
- gc.translate(-x, -y)
62
- end
63
- add_style_primitives(gc)
64
- if @text
65
- x2, y2 = gc.text(x, y, @text)
66
- self.cx = x + x2
67
- self.cy = y + y2
68
- end
69
- @tspans.each do |tspan|
70
- tspan.add_primitives(gc)
71
- end
72
- gc.pop
73
- end
74
- end
75
-
76
- end # class TextBase
77
-
78
- # Tspan and Tref shared methods - read/update @cx, @cy in parent Text object.
79
- module TextLink #:nodoc:
80
-
81
- def add_primitives(gc)
82
- @parent.cx = @x if @x
83
- @parent.cy = @y if @y
84
- super
85
- end
86
-
87
- def cx()
88
- @parent.cx
89
- end
90
-
91
- def cy()
92
- @parent.cy
93
- end
94
-
95
- def cx=(x)
96
- @parent.cx = x
97
- end
98
-
99
- def cy=(y)
100
- @parent.cy = y
101
- end
102
-
103
- end # module TextLink
104
-
105
-
106
- class Tref < TextBase #:nodoc:
107
- include TextLink
108
-
109
- def initialize(obj, x, y, parent)
110
- @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
111
- super(nil)
112
- @tspans << obj
113
- @parent = parent
114
- end
115
-
116
- end # class Tref
117
-
118
- class Tspan < TextBase #:nodoc:
119
- include TextLink
120
-
121
- attr_accessor :parent
122
-
123
- # Define a text segment starting at (<tt>x</tt>, <tt>y</tt>).
124
- # If <tt>x</tt> and <tt>y</tt> are omitted the segment starts
125
- # at the current text position.
126
- #
127
- # Tspan objects can contain Tspan objects.
128
- def initialize(text=nil, x=nil, y=nil, &block)
129
- @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
130
- super(text, &block)
131
- end
132
-
133
- end # class Tspan
134
-
135
- class Text < TextBase
136
-
137
- attr_accessor :cx, :cy #:nodoc:
138
-
139
- # Define a text string starting at [<tt>x</tt>, <tt>y</tt>].
140
- # Use the RVG::TextConstructors#text method to create Text objects in a container.
141
- #
142
- # container.text(100, 100, "Simple text").styles(:font=>'Arial')
143
- #
144
- # Text objects can contain Tspan objects.
145
- #
146
- # container.text(100, 100).styles(:font=>'Arial') do |t|
147
- # t.tspan("Red text").styles(:fill=>'red')
148
- # t.tspan("Blue text").styles(:fill=>'blue')
149
- # end
150
- def initialize(x=0, y=0, text=nil, &block)
151
- @cx, @cy = Magick::RVG.convert_to_float(x, y)
152
- super(text, &block)
153
- end
154
-
155
- # Reference a Tspan object. <tt>x</tt> and <tt>y</tt> are just
156
- # like <tt>x</tt> and <tt>y</tt> in RVG::TextBase#tspan
157
- def tref(obj, x=nil, y=nil)
158
- if ! obj.kind_of?(Tspan)
159
- raise ArgumentError, "wrong argument type #{obj.class} (expected Tspan)"
160
- end
161
- obj = obj.deep_copy
162
- obj.parent = self
163
- tref = Tref.new(obj, x, y, self)
164
- @tspans << tref
165
- return tref
166
- end
167
-
168
- end # class Text
169
-
170
-
171
-
172
- # Methods that construct text objects within a container
173
- module TextConstructors
174
-
175
- # Draw a text string at (<tt>x</tt>,<tt>y</tt>). The string can
176
- # be omitted. Optionally, define text chunks within the associated
177
- # block.
178
- def text(x=0, y=0, text=nil, &block)
179
- t = Text.new(x, y, text, &block)
180
- @content << t
181
- return t
182
- end
183
-
184
- end # module TextConstructors
185
-
186
- end # class RVG
7
+ class RVG
8
+ # Base class for Tspan, Tref and Text.
9
+ class TextBase
10
+ include Stylable
11
+ include Duplicatable
12
+
13
+ private
14
+
15
+ def initialize(text)
16
+ super()
17
+ @text = text.to_s if text
18
+ @dx = @dy = 0
19
+ @rotation = 0
20
+ @tspans = Content.new
21
+ yield(self) if block_given?
22
+ end
23
+
24
+ public
25
+
26
+ # Create a new text chunk. Each chunk can have its own initial position and styles.
27
+ # If <tt>x</tt> and <tt>y</tt> are omitted the text starts at the current text
28
+ # position.
29
+ def tspan(text, x = nil, y = nil)
30
+ tspan = Tspan.new(text, x, y)
31
+ tspan.parent = self
32
+ @tspans << tspan
33
+ tspan
34
+ end
35
+
36
+ # Add <tt>x</tt> and <tt>y</tt> to the current text position.
37
+ def d(x, y = 0)
38
+ @dx, @dy = Magick::RVG.convert_to_float(x, y)
39
+ yield(self) if block_given?
40
+ self
41
+ end
42
+
43
+ # Rotate the text about the current text position.
44
+ def rotate(degrees)
45
+ @rotation = Magick::RVG.convert_to_float(degrees)[0]
46
+ yield(self) if block_given?
47
+ self
48
+ end
49
+
50
+ # We do our own transformations.
51
+ # @private
52
+ def add_primitives(gc)
53
+ return if !@text && @tspans.empty?
54
+
55
+ gc.push
56
+ x = cx + @dx
57
+ y = cy + @dy
58
+ if @rotation != 0
59
+ gc.translate(x, y)
60
+ gc.rotate(@rotation)
61
+ gc.translate(-x, -y)
62
+ end
63
+ add_style_primitives(gc)
64
+ if @text
65
+ x2, y2 = gc.text(x, y, @text)
66
+ self.cx = x + x2
67
+ self.cy = y + y2
68
+ end
69
+ @tspans.each do |tspan|
70
+ tspan.add_primitives(gc)
71
+ end
72
+ gc.pop
73
+ end
74
+ end # class TextBase
75
+
76
+ # Tspan and Tref shared methods - read/update @cx, @cy in parent Text object.
77
+ # @private
78
+ module TextLink
79
+ def add_primitives(gc)
80
+ @parent.cx = @x if @x
81
+ @parent.cy = @y if @y
82
+ super
83
+ end
84
+
85
+ def cx
86
+ @parent.cx
87
+ end
88
+
89
+ def cy
90
+ @parent.cy
91
+ end
92
+
93
+ def cx=(x)
94
+ @parent.cx = x
95
+ end
96
+
97
+ def cy=(y)
98
+ @parent.cy = y
99
+ end
100
+ end # module TextLink
101
+
102
+ # @private
103
+ class Tref < TextBase
104
+ include TextLink
105
+
106
+ def initialize(obj, x, y, parent)
107
+ @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
108
+ super(nil)
109
+ @tspans << obj
110
+ @parent = parent
111
+ end
112
+ end # class Tref
113
+
114
+ # @private
115
+ class Tspan < TextBase
116
+ include TextLink
117
+
118
+ attr_accessor :parent
119
+
120
+ # Define a text segment starting at (<tt>x</tt>, <tt>y</tt>).
121
+ # If <tt>x</tt> and <tt>y</tt> are omitted the segment starts
122
+ # at the current text position.
123
+ #
124
+ # Tspan objects can contain Tspan objects.
125
+ def initialize(text = nil, x = nil, y = nil, &block)
126
+ @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
127
+ super(text, &block)
128
+ end
129
+ end # class Tspan
130
+
131
+ class Text < TextBase
132
+ # @private
133
+ attr_accessor :cx, :cy
134
+
135
+ # Define a text string starting at [<tt>x</tt>, <tt>y</tt>].
136
+ # Use the RVG::TextConstructors#text method to create Text objects in a container.
137
+ #
138
+ # container.text(100, 100, "Simple text").styles(:font=>'Arial')
139
+ #
140
+ # Text objects can contain Tspan objects.
141
+ #
142
+ # container.text(100, 100).styles(:font=>'Arial') do |t|
143
+ # t.tspan("Red text").styles(:fill=>'red')
144
+ # t.tspan("Blue text").styles(:fill=>'blue')
145
+ # end
146
+ def initialize(x = 0, y = 0, text = nil, &block)
147
+ @cx, @cy = Magick::RVG.convert_to_float(x, y)
148
+ super(text, &block)
149
+ end
150
+
151
+ # Reference a Tspan object. <tt>x</tt> and <tt>y</tt> are just
152
+ # like <tt>x</tt> and <tt>y</tt> in RVG::TextBase#tspan
153
+ def tref(obj, x = nil, y = nil)
154
+ raise ArgumentError, "wrong argument type #{obj.class} (expected Tspan)" unless obj.is_a?(Tspan)
155
+
156
+ obj = obj.deep_copy
157
+ obj.parent = self
158
+ tref = Tref.new(obj, x, y, self)
159
+ @tspans << tref
160
+ tref
161
+ end
162
+ end # class Text
163
+
164
+ # Methods that construct text objects within a container
165
+ module TextConstructors
166
+ # Draw a text string at (<tt>x</tt>,<tt>y</tt>). The string can
167
+ # be omitted. Optionally, define text chunks within the associated
168
+ # block.
169
+ def text(x = 0, y = 0, text = nil, &block)
170
+ t = Text.new(x, y, text, &block)
171
+ @content << t
172
+ t
173
+ end
174
+ end # module TextConstructors
175
+ end # class RVG
187
176
  end # module Magick
@@ -2,132 +2,126 @@
2
2
  # $Id: transformable.rb,v 1.5 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
- # Transforms is an Array with a deep_copy method.
10
- # During unit-testing it also has a deep_equal method.
11
- class Transforms < Array #:nodoc:
12
-
13
- def deep_copy(h=nil)
14
- copy = self.class.new
15
- each { |transform| copy << [transform[0], transform[1].dup] }
16
- return copy
17
- end
18
-
19
- end # class Transform
20
-
21
- # Transformations are operations on the coordinate system.
22
- # All the transformations defined within a container (an RVG object
23
- # or a group) are applied before drawing any shapes or text.
24
- # All transformations are applied in the order they were
25
- # defined. <em>Note:</em> This means that
26
- # g.translate(10,20).scale(2)
27
- # is not the same as
28
- # g.scale(2).translate(10,20)
29
- module Transformable
30
-
31
- private
32
-
33
- # Apply transforms in the same order they were specified!
34
- def add_transform_primitives(gc)
35
- @transforms.each { |transform| gc.__send__(transform[0], *transform[1]) }
36
- end
37
-
38
- def initialize(*args, &block)
39
- super()
40
- @transforms = Transforms.new
41
- end
42
-
43
- public
44
-
45
- # Applies the transformation matrix [sx, rx, ry, sy, tx, ty]
46
- def matrix(sx, rx, ry, sy, tx, ty)
47
- begin
48
- @transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]]
49
- rescue ArgumentError
50
- raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})"
51
- end
52
- yield(self) if block_given?
53
- self
54
- end
55
-
56
- # Add <tt>tx</tt> to all x-coordinates and <tt>ty</tt>
57
- # to all y-coordinates. If <tt>ty</tt> is omitted it defaults
58
- # to <tt>tx</tt>.
59
- def translate(tx, ty=nil)
60
- ty ||= tx
61
- begin
62
- @transforms << [:translate, [Float(tx), Float(ty)]]
63
- rescue ArgumentError
64
- raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})"
65
- end
66
- yield(self) if block_given?
67
- self
68
- end
69
-
70
- # Multiply the x-coordinates by <tt>sx</tt> and the y-coordinates
71
- # by <tt>sy</tt>. If <tt>sy</tt> is omitted it defaults to <tt>sx</tt>.
72
- def scale(sx, sy=nil)
73
- sy ||= sx
74
- begin
75
- @transforms << [:scale, [Float(sx), Float(sy)]]
76
- rescue ArgumentError
77
- raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})"
78
- end
79
- yield(self) if block_given?
80
- self
81
- end
82
-
83
- # This method can take either of two argument lists:
84
- # [rotate(angle)] rotate by <tt>angle</tt> degrees
85
- # [rotate(angle, cx, cy)] rotate by <tt>angle</tt> degrees about
86
- # the point [<tt>cx</tt>, <tt>cy</tt>].
87
- def rotate(angle, *args)
88
- begin
89
- case args.length
90
- when 0
91
- @transforms << [:rotate, [Float(angle)]]
92
- when 2
93
- cx, cy = Float(args[0]), Float(args[1])
94
- @transforms << [:translate, [cx, cy]]
95
- @transforms << [:rotate, [angle]]
96
- @transforms << [:translate, [-cx, -cy]]
97
- else
98
- raise ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
99
- end
100
- rescue ArgumentError
101
- raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].collect {|a| a.class}.join(', ')})"
102
- end
103
- yield(self) if block_given?
104
- self
105
- end
106
-
107
- # Skew the X-axis by <tt>angle</tt> degrees.
108
- def skewX(angle)
109
- begin
110
- @transforms << [:skewx, [Float(angle)]]
111
- rescue ArgumentError
112
- raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
113
- end
114
- yield(self) if block_given?
115
- self
116
- end
117
-
118
- # Skew the Y-axis by <tt>angle</tt> degrees.
119
- def skewY(angle)
120
- begin
121
- @transforms << [:skewy, [Float(angle)]]
122
- rescue ArgumentError
123
- raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
124
- end
125
- yield(self) if block_given?
126
- self
127
- end
128
-
129
- end # module Transformable
130
-
131
- end # class RVG
6
+ class RVG
7
+ # Transforms is an Array with a deep_copy method.
8
+ # During unit-testing it also has a deep_equal method.
9
+ # @private
10
+ class Transforms < Array
11
+ def deep_copy(_h = nil)
12
+ copy = self.class.new
13
+ each { |transform| copy << [transform[0], transform[1].dup] }
14
+ copy
15
+ end
16
+ end # class Transform
17
+
18
+ # Transformations are operations on the coordinate system.
19
+ # All the transformations defined within a container (an RVG object
20
+ # or a group) are applied before drawing any shapes or text.
21
+ # All transformations are applied in the order they were
22
+ # defined. <em>Note:</em> This means that
23
+ # g.translate(10,20).scale(2)
24
+ # is not the same as
25
+ # g.scale(2).translate(10,20)
26
+ module Transformable
27
+ private
28
+
29
+ # Apply transforms in the same order they were specified!
30
+ def add_transform_primitives(gc)
31
+ @transforms.each { |transform| gc.__send__(transform[0], *transform[1]) }
32
+ end
33
+
34
+ def initialize(*_args)
35
+ super()
36
+ @transforms = Transforms.new
37
+ end
38
+
39
+ public
40
+
41
+ # Applies the transformation matrix [sx, rx, ry, sy, tx, ty]
42
+ def matrix(sx, rx, ry, sy, tx, ty)
43
+ begin
44
+ @transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]]
45
+ rescue ArgumentError
46
+ raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})"
47
+ end
48
+ yield(self) if block_given?
49
+ self
50
+ end
51
+
52
+ # Add <tt>tx</tt> to all x-coordinates and <tt>ty</tt>
53
+ # to all y-coordinates. If <tt>ty</tt> is omitted it defaults
54
+ # to <tt>tx</tt>.
55
+ def translate(tx, ty = nil)
56
+ ty ||= tx
57
+ begin
58
+ @transforms << [:translate, [Float(tx), Float(ty)]]
59
+ rescue ArgumentError
60
+ raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})"
61
+ end
62
+ yield(self) if block_given?
63
+ self
64
+ end
65
+
66
+ # Multiply the x-coordinates by <tt>sx</tt> and the y-coordinates
67
+ # by <tt>sy</tt>. If <tt>sy</tt> is omitted it defaults to <tt>sx</tt>.
68
+ def scale(sx, sy = nil)
69
+ sy ||= sx
70
+ begin
71
+ @transforms << [:scale, [Float(sx), Float(sy)]]
72
+ rescue ArgumentError
73
+ raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})"
74
+ end
75
+ yield(self) if block_given?
76
+ self
77
+ end
78
+
79
+ # This method can take either of two argument lists:
80
+ # [rotate(angle)] rotate by <tt>angle</tt> degrees
81
+ # [rotate(angle, cx, cy)] rotate by <tt>angle</tt> degrees about
82
+ # the point [<tt>cx</tt>, <tt>cy</tt>].
83
+ def rotate(angle, *args)
84
+ begin
85
+ case args.length
86
+ when 0
87
+ @transforms << [:rotate, [Float(angle)]]
88
+ when 2
89
+ cx = Float(args[0])
90
+ cy = Float(args[1])
91
+ @transforms << [:translate, [cx, cy]]
92
+ @transforms << [:rotate, [angle]]
93
+ @transforms << [:translate, [-cx, -cy]]
94
+ else
95
+ raise ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
96
+ end
97
+ rescue ArgumentError
98
+ raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].map(&:class).join(', ')})"
99
+ end
100
+ yield(self) if block_given?
101
+ self
102
+ end
103
+
104
+ # Skew the X-axis by <tt>angle</tt> degrees.
105
+ def skewX(angle)
106
+ begin
107
+ @transforms << [:skewx, [Float(angle)]]
108
+ rescue ArgumentError
109
+ raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
110
+ end
111
+ yield(self) if block_given?
112
+ self
113
+ end
114
+
115
+ # Skew the Y-axis by <tt>angle</tt> degrees.
116
+ def skewY(angle)
117
+ begin
118
+ @transforms << [:skewy, [Float(angle)]]
119
+ rescue ArgumentError
120
+ raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
121
+ end
122
+ yield(self) if block_given?
123
+ self
124
+ end
125
+ end # module Transformable
126
+ end # class RVG
132
127
  end # module Magick
133
-