rmagick-windows 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +14 -0
  3. data/.gitignore +23 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +340 -0
  7. data/.simplecov +27 -0
  8. data/.travis.yml +60 -0
  9. data/CHANGELOG.md +915 -0
  10. data/CODE_OF_CONDUCT.md +13 -0
  11. data/CONTRIBUTING.md +50 -0
  12. data/Doxyfile +1514 -0
  13. data/Gemfile +10 -0
  14. data/LICENSE +20 -0
  15. data/README.textile +257 -0
  16. data/Rakefile +188 -0
  17. data/before_install_linux.sh +32 -0
  18. data/before_install_osx.sh +2 -0
  19. data/deprecated/RMagick.rb +6 -0
  20. data/doc/.cvsignore +1 -0
  21. data/doc/comtasks.html +287 -0
  22. data/doc/constants.html +1581 -0
  23. data/doc/css/doc.css +299 -0
  24. data/doc/css/popup.css +34 -0
  25. data/doc/css/ref.css +67 -0
  26. data/doc/draw.html +3272 -0
  27. data/doc/ex/InitialCoords.rb +22 -0
  28. data/doc/ex/NewCoordSys.rb +30 -0
  29. data/doc/ex/OrigCoordSys.rb +16 -0
  30. data/doc/ex/PreserveAspectRatio.rb +204 -0
  31. data/doc/ex/RotateScale.rb +36 -0
  32. data/doc/ex/Skew.rb +38 -0
  33. data/doc/ex/Use01.rb +15 -0
  34. data/doc/ex/Use02.rb +20 -0
  35. data/doc/ex/Use03.rb +16 -0
  36. data/doc/ex/ViewBox.rb +31 -0
  37. data/doc/ex/adaptive_threshold.rb +9 -0
  38. data/doc/ex/add_noise.rb +16 -0
  39. data/doc/ex/affine.rb +48 -0
  40. data/doc/ex/affine_transform.rb +20 -0
  41. data/doc/ex/arc.rb +49 -0
  42. data/doc/ex/arcpath.rb +32 -0
  43. data/doc/ex/arcs01.rb +28 -0
  44. data/doc/ex/arcs02.rb +59 -0
  45. data/doc/ex/average.rb +15 -0
  46. data/doc/ex/axes.rb +64 -0
  47. data/doc/ex/baseline_shift01.rb +17 -0
  48. data/doc/ex/bilevel_channel.rb +8 -0
  49. data/doc/ex/blur_image.rb +12 -0
  50. data/doc/ex/border.rb +10 -0
  51. data/doc/ex/bounding_box.rb +42 -0
  52. data/doc/ex/cbezier1.rb +41 -0
  53. data/doc/ex/cbezier2.rb +41 -0
  54. data/doc/ex/cbezier3.rb +41 -0
  55. data/doc/ex/cbezier4.rb +42 -0
  56. data/doc/ex/cbezier5.rb +42 -0
  57. data/doc/ex/cbezier6.rb +53 -0
  58. data/doc/ex/channel.rb +25 -0
  59. data/doc/ex/charcoal.rb +12 -0
  60. data/doc/ex/chop.rb +29 -0
  61. data/doc/ex/circle.rb +33 -0
  62. data/doc/ex/circle01.rb +16 -0
  63. data/doc/ex/clip_path.rb +60 -0
  64. data/doc/ex/coalesce.rb +57 -0
  65. data/doc/ex/color_fill_to_border.rb +29 -0
  66. data/doc/ex/color_floodfill.rb +28 -0
  67. data/doc/ex/color_histogram.rb +47 -0
  68. data/doc/ex/color_reset.rb +11 -0
  69. data/doc/ex/colorize.rb +16 -0
  70. data/doc/ex/colors.rb +64 -0
  71. data/doc/ex/compose_mask.rb +22 -0
  72. data/doc/ex/composite.rb +133 -0
  73. data/doc/ex/composite_layers.rb +53 -0
  74. data/doc/ex/composite_tiled.rb +21 -0
  75. data/doc/ex/contrast.rb +36 -0
  76. data/doc/ex/crop.rb +31 -0
  77. data/doc/ex/crop_with_gravity.rb +42 -0
  78. data/doc/ex/cubic01.rb +43 -0
  79. data/doc/ex/cubic02.rb +91 -0
  80. data/doc/ex/cycle_colormap.rb +21 -0
  81. data/doc/ex/dissolve.rb +12 -0
  82. data/doc/ex/drawcomp.rb +42 -0
  83. data/doc/ex/drop_shadow.rb +60 -0
  84. data/doc/ex/edge.rb +11 -0
  85. data/doc/ex/ellipse.rb +45 -0
  86. data/doc/ex/ellipse01.rb +21 -0
  87. data/doc/ex/emboss.rb +11 -0
  88. data/doc/ex/enhance.rb +28 -0
  89. data/doc/ex/equalize.rb +11 -0
  90. data/doc/ex/evenodd.rb +42 -0
  91. data/doc/ex/fill_pattern.rb +23 -0
  92. data/doc/ex/flatten_images.rb +36 -0
  93. data/doc/ex/flip.rb +11 -0
  94. data/doc/ex/flop.rb +11 -0
  95. data/doc/ex/font_styles.rb +32 -0
  96. data/doc/ex/fonts.rb +20 -0
  97. data/doc/ex/frame.rb +12 -0
  98. data/doc/ex/gaussian_blur.rb +11 -0
  99. data/doc/ex/get_multiline_type_metrics.rb +41 -0
  100. data/doc/ex/get_pixels.rb +47 -0
  101. data/doc/ex/get_type_metrics.rb +141 -0
  102. data/doc/ex/gradientfill.rb +27 -0
  103. data/doc/ex/grav.rb +45 -0
  104. data/doc/ex/gravity.rb +80 -0
  105. data/doc/ex/group.rb +26 -0
  106. data/doc/ex/hatchfill.rb +27 -0
  107. data/doc/ex/image.rb +44 -0
  108. data/doc/ex/images/Apple.miff +0 -0
  109. data/doc/ex/images/Ballerina.jpg +0 -0
  110. data/doc/ex/images/Ballerina3.jpg +0 -0
  111. data/doc/ex/images/Button_0.gif +0 -0
  112. data/doc/ex/images/Button_1.gif +0 -0
  113. data/doc/ex/images/Button_2.gif +0 -0
  114. data/doc/ex/images/Button_3.gif +0 -0
  115. data/doc/ex/images/Button_4.gif +0 -0
  116. data/doc/ex/images/Button_5.gif +0 -0
  117. data/doc/ex/images/Button_6.gif +0 -0
  118. data/doc/ex/images/Button_7.gif +0 -0
  119. data/doc/ex/images/Button_8.gif +0 -0
  120. data/doc/ex/images/Button_9.gif +0 -0
  121. data/doc/ex/images/Button_A.gif +0 -0
  122. data/doc/ex/images/Button_B.gif +0 -0
  123. data/doc/ex/images/Button_C.gif +0 -0
  124. data/doc/ex/images/Button_D.gif +0 -0
  125. data/doc/ex/images/Button_E.gif +0 -0
  126. data/doc/ex/images/Button_F.gif +0 -0
  127. data/doc/ex/images/Button_G.gif +0 -0
  128. data/doc/ex/images/Button_H.gif +0 -0
  129. data/doc/ex/images/Button_I.gif +0 -0
  130. data/doc/ex/images/Button_J.gif +0 -0
  131. data/doc/ex/images/Button_K.gif +0 -0
  132. data/doc/ex/images/Button_L.gif +0 -0
  133. data/doc/ex/images/Button_M.gif +0 -0
  134. data/doc/ex/images/Button_N.gif +0 -0
  135. data/doc/ex/images/Button_O.gif +0 -0
  136. data/doc/ex/images/Button_P.gif +0 -0
  137. data/doc/ex/images/Button_Q.gif +0 -0
  138. data/doc/ex/images/Button_R.gif +0 -0
  139. data/doc/ex/images/Button_S.gif +0 -0
  140. data/doc/ex/images/Button_T.gif +0 -0
  141. data/doc/ex/images/Button_U.gif +0 -0
  142. data/doc/ex/images/Button_V.gif +0 -0
  143. data/doc/ex/images/Button_W.gif +0 -0
  144. data/doc/ex/images/Button_X.gif +0 -0
  145. data/doc/ex/images/Button_Y.gif +0 -0
  146. data/doc/ex/images/Button_Z.gif +0 -0
  147. data/doc/ex/images/Cheetah.jpg +0 -0
  148. data/doc/ex/images/Coffee.wmf +0 -0
  149. data/doc/ex/images/Flower_Hat.jpg +0 -0
  150. data/doc/ex/images/Gold_Statue.jpg +0 -0
  151. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  152. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  153. data/doc/ex/images/Leaf.miff +0 -0
  154. data/doc/ex/images/No.wmf +0 -0
  155. data/doc/ex/images/Polynesia.jpg +0 -0
  156. data/doc/ex/images/Red_Rocks.jpg +0 -0
  157. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  158. data/doc/ex/images/Shorts.jpg +0 -0
  159. data/doc/ex/images/Snake.wmf +0 -0
  160. data/doc/ex/images/Violin.jpg +0 -0
  161. data/doc/ex/images/Yellow_Rose.miff +0 -0
  162. data/doc/ex/images/big-duck.gif +0 -0
  163. data/doc/ex/images/duck.gif +0 -0
  164. data/doc/ex/images/duck0.gif +0 -0
  165. data/doc/ex/images/duck1.gif +0 -0
  166. data/doc/ex/images/duck10.gif +0 -0
  167. data/doc/ex/images/duck11.gif +0 -0
  168. data/doc/ex/images/duck12.gif +0 -0
  169. data/doc/ex/images/duck13.gif +0 -0
  170. data/doc/ex/images/duck14.gif +0 -0
  171. data/doc/ex/images/duck15.gif +0 -0
  172. data/doc/ex/images/duck2.gif +0 -0
  173. data/doc/ex/images/duck3.gif +0 -0
  174. data/doc/ex/images/duck4.gif +0 -0
  175. data/doc/ex/images/duck5.gif +0 -0
  176. data/doc/ex/images/duck6.gif +0 -0
  177. data/doc/ex/images/duck7.gif +0 -0
  178. data/doc/ex/images/duck8.gif +0 -0
  179. data/doc/ex/images/duck9.gif +0 -0
  180. data/doc/ex/images/graydient230x6.gif +0 -0
  181. data/doc/ex/images/image_with_profile.jpg +0 -0
  182. data/doc/ex/images/logo400x83.gif +0 -0
  183. data/doc/ex/images/model.miff +0 -0
  184. data/doc/ex/images/notimplemented.gif +0 -0
  185. data/doc/ex/images/smile.miff +0 -0
  186. data/doc/ex/images/spin.gif +0 -0
  187. data/doc/ex/implode.rb +34 -0
  188. data/doc/ex/level.rb +11 -0
  189. data/doc/ex/level_colors.rb +11 -0
  190. data/doc/ex/line.rb +41 -0
  191. data/doc/ex/line01.rb +21 -0
  192. data/doc/ex/mask.rb +35 -0
  193. data/doc/ex/matte_fill_to_border.rb +39 -0
  194. data/doc/ex/matte_floodfill.rb +32 -0
  195. data/doc/ex/matte_replace.rb +39 -0
  196. data/doc/ex/median_filter.rb +28 -0
  197. data/doc/ex/modulate.rb +11 -0
  198. data/doc/ex/mono.rb +23 -0
  199. data/doc/ex/morph.rb +25 -0
  200. data/doc/ex/mosaic.rb +35 -0
  201. data/doc/ex/motion_blur.rb +11 -0
  202. data/doc/ex/negate.rb +11 -0
  203. data/doc/ex/negate_channel.rb +9 -0
  204. data/doc/ex/nested_rvg.rb +21 -0
  205. data/doc/ex/nonzero.rb +42 -0
  206. data/doc/ex/normalize.rb +11 -0
  207. data/doc/ex/oil_paint.rb +11 -0
  208. data/doc/ex/opacity.rb +37 -0
  209. data/doc/ex/ordered_dither.rb +11 -0
  210. data/doc/ex/path.rb +63 -0
  211. data/doc/ex/pattern1.rb +25 -0
  212. data/doc/ex/pattern2.rb +26 -0
  213. data/doc/ex/polaroid.rb +27 -0
  214. data/doc/ex/polygon.rb +23 -0
  215. data/doc/ex/polygon01.rb +21 -0
  216. data/doc/ex/polyline.rb +22 -0
  217. data/doc/ex/polyline01.rb +21 -0
  218. data/doc/ex/posterize.rb +8 -0
  219. data/doc/ex/preview.rb +8 -0
  220. data/doc/ex/qbezierpath.rb +52 -0
  221. data/doc/ex/quad01.rb +34 -0
  222. data/doc/ex/quantize-m.rb +25 -0
  223. data/doc/ex/radial_blur.rb +9 -0
  224. data/doc/ex/raise.rb +8 -0
  225. data/doc/ex/random_threshold_channel.rb +13 -0
  226. data/doc/ex/rect01.rb +14 -0
  227. data/doc/ex/rect02.rb +20 -0
  228. data/doc/ex/rectangle.rb +34 -0
  229. data/doc/ex/reduce_noise.rb +28 -0
  230. data/doc/ex/remap.rb +11 -0
  231. data/doc/ex/remap_images.rb +19 -0
  232. data/doc/ex/resize_to_fill.rb +8 -0
  233. data/doc/ex/resize_to_fit.rb +8 -0
  234. data/doc/ex/roll.rb +9 -0
  235. data/doc/ex/rotate.rb +44 -0
  236. data/doc/ex/rotate_f.rb +14 -0
  237. data/doc/ex/roundrect.rb +33 -0
  238. data/doc/ex/rubyname.rb +30 -0
  239. data/doc/ex/rvg_clippath.rb +12 -0
  240. data/doc/ex/rvg_linecap.rb +42 -0
  241. data/doc/ex/rvg_linejoin.rb +40 -0
  242. data/doc/ex/rvg_opacity.rb +18 -0
  243. data/doc/ex/rvg_pattern.rb +26 -0
  244. data/doc/ex/rvg_stroke_dasharray.rb +11 -0
  245. data/doc/ex/segment.rb +11 -0
  246. data/doc/ex/sepiatone.rb +7 -0
  247. data/doc/ex/shade.rb +11 -0
  248. data/doc/ex/shadow.rb +30 -0
  249. data/doc/ex/shave.rb +15 -0
  250. data/doc/ex/shear.rb +10 -0
  251. data/doc/ex/sketch.rb +17 -0
  252. data/doc/ex/skewx.rb +51 -0
  253. data/doc/ex/skewy.rb +47 -0
  254. data/doc/ex/smile.rb +125 -0
  255. data/doc/ex/solarize.rb +11 -0
  256. data/doc/ex/sparse_color.rb +54 -0
  257. data/doc/ex/splice.rb +8 -0
  258. data/doc/ex/spread.rb +11 -0
  259. data/doc/ex/stegano.rb +55 -0
  260. data/doc/ex/stroke_dasharray.rb +42 -0
  261. data/doc/ex/stroke_fill.rb +10 -0
  262. data/doc/ex/stroke_linecap.rb +44 -0
  263. data/doc/ex/stroke_linejoin.rb +48 -0
  264. data/doc/ex/stroke_width.rb +49 -0
  265. data/doc/ex/swirl.rb +17 -0
  266. data/doc/ex/text.rb +37 -0
  267. data/doc/ex/text01.rb +16 -0
  268. data/doc/ex/text_align.rb +36 -0
  269. data/doc/ex/text_antialias.rb +37 -0
  270. data/doc/ex/text_styles.rb +19 -0
  271. data/doc/ex/text_undercolor.rb +28 -0
  272. data/doc/ex/texture_fill_to_border.rb +34 -0
  273. data/doc/ex/texture_floodfill.rb +32 -0
  274. data/doc/ex/texturefill.rb +24 -0
  275. data/doc/ex/threshold.rb +13 -0
  276. data/doc/ex/to_blob.rb +13 -0
  277. data/doc/ex/translate.rb +39 -0
  278. data/doc/ex/transparent.rb +38 -0
  279. data/doc/ex/transpose.rb +9 -0
  280. data/doc/ex/transverse.rb +9 -0
  281. data/doc/ex/tref01.rb +24 -0
  282. data/doc/ex/triangle01.rb +15 -0
  283. data/doc/ex/trim.rb +23 -0
  284. data/doc/ex/tspan01.rb +17 -0
  285. data/doc/ex/tspan02.rb +17 -0
  286. data/doc/ex/tspan03.rb +19 -0
  287. data/doc/ex/unsharp_mask.rb +28 -0
  288. data/doc/ex/viewex.rb +33 -0
  289. data/doc/ex/vignette.rb +12 -0
  290. data/doc/ex/watermark.rb +27 -0
  291. data/doc/ex/wave.rb +9 -0
  292. data/doc/ex/wet_floor.rb +58 -0
  293. data/doc/ex/writing_mode01.rb +26 -0
  294. data/doc/ex/writing_mode02.rb +26 -0
  295. data/doc/ilist.html +2056 -0
  296. data/doc/image1.html +4680 -0
  297. data/doc/image2.html +3665 -0
  298. data/doc/image3.html +4522 -0
  299. data/doc/imageattrs.html +1638 -0
  300. data/doc/imusage.html +514 -0
  301. data/doc/index.html +416 -0
  302. data/doc/info.html +1499 -0
  303. data/doc/magick.html +565 -0
  304. data/doc/optequiv.html +2435 -0
  305. data/doc/rvg.html +975 -0
  306. data/doc/rvgclip.html +248 -0
  307. data/doc/rvggroup.html +305 -0
  308. data/doc/rvgimage.html +289 -0
  309. data/doc/rvgpattern.html +475 -0
  310. data/doc/rvgshape.html +406 -0
  311. data/doc/rvgstyle.html +270 -0
  312. data/doc/rvgtext.html +465 -0
  313. data/doc/rvgtspan.html +238 -0
  314. data/doc/rvgtut.html +530 -0
  315. data/doc/rvguse.html +145 -0
  316. data/doc/rvgxform.html +294 -0
  317. data/doc/scripts/doc.js +22 -0
  318. data/doc/scripts/stripeTables.js +23 -0
  319. data/doc/struct.html +1339 -0
  320. data/doc/usage.html +1621 -0
  321. data/examples/constitute.rb +7 -0
  322. data/examples/crop_with_gravity.rb +42 -0
  323. data/examples/demo.rb +324 -0
  324. data/examples/describe.rb +43 -0
  325. data/examples/find_similar_region.rb +34 -0
  326. data/examples/histogram.rb +321 -0
  327. data/examples/identify.rb +185 -0
  328. data/examples/image_opacity.rb +29 -0
  329. data/examples/import_export.rb +31 -0
  330. data/examples/pattern_fill.rb +38 -0
  331. data/examples/rotating_text.rb +44 -0
  332. data/examples/spinner.rb +49 -0
  333. data/examples/thumbnail.rb +64 -0
  334. data/examples/vignette.rb +78 -0
  335. data/ext/RMagick/extconf.rb +548 -0
  336. data/ext/RMagick/rmagick.c +401 -0
  337. data/ext/RMagick/rmagick.h +1287 -0
  338. data/ext/RMagick/rmdraw.c +2022 -0
  339. data/ext/RMagick/rmenum.c +1235 -0
  340. data/ext/RMagick/rmfill.c +720 -0
  341. data/ext/RMagick/rmilist.c +1270 -0
  342. data/ext/RMagick/rmimage.c +15427 -0
  343. data/ext/RMagick/rminfo.c +2590 -0
  344. data/ext/RMagick/rmmain.c +1741 -0
  345. data/ext/RMagick/rmmontage.c +519 -0
  346. data/ext/RMagick/rmpixel.c +1114 -0
  347. data/ext/RMagick/rmstruct.c +1124 -0
  348. data/ext/RMagick/rmutil.c +1754 -0
  349. data/lib/rmagick.rb +1 -0
  350. data/lib/rmagick/version.rb +6 -0
  351. data/lib/rmagick_internal.rb +1947 -0
  352. data/lib/rvg/clippath.rb +45 -0
  353. data/lib/rvg/container.rb +122 -0
  354. data/lib/rvg/deep_equal.rb +52 -0
  355. data/lib/rvg/describable.rb +47 -0
  356. data/lib/rvg/embellishable.rb +391 -0
  357. data/lib/rvg/misc.rb +723 -0
  358. data/lib/rvg/paint.rb +50 -0
  359. data/lib/rvg/pathdata.rb +126 -0
  360. data/lib/rvg/rvg.rb +283 -0
  361. data/lib/rvg/stretchable.rb +165 -0
  362. data/lib/rvg/stylable.rb +116 -0
  363. data/lib/rvg/text.rb +172 -0
  364. data/lib/rvg/transformable.rb +126 -0
  365. data/lib/rvg/units.rb +63 -0
  366. data/rmagick.gemspec +46 -0
  367. data/spec/rmagick/ImageList1_spec.rb +24 -0
  368. data/spec/rmagick/draw_spec.rb +156 -0
  369. data/spec/rmagick/image/blue_shift_spec.rb +16 -0
  370. data/spec/rmagick/image/composite_spec.rb +140 -0
  371. data/spec/rmagick/image/constitute_spec.rb +15 -0
  372. data/spec/rmagick/image/dispatch_spec.rb +18 -0
  373. data/spec/rmagick/image/from_blob_spec.rb +14 -0
  374. data/spec/rmagick/image/ping_spec.rb +14 -0
  375. data/spec/rmagick/image/properties_spec.rb +29 -0
  376. data/spec/spec_helper.rb +4 -0
  377. data/test/Image1.rb +565 -0
  378. data/test/Image2.rb +1304 -0
  379. data/test/Image3.rb +1030 -0
  380. data/test/ImageList1.rb +806 -0
  381. data/test/ImageList2.rb +385 -0
  382. data/test/Image_attributes.rb +697 -0
  383. data/test/Import_Export.rb +121 -0
  384. data/test/Info.rb +345 -0
  385. data/test/Magick.rb +321 -0
  386. data/test/Pixel.rb +116 -0
  387. data/test/Preview.rb +57 -0
  388. data/test/cmyk.icm +0 -0
  389. data/test/srgb.icm +0 -0
  390. data/test/test_all_basic.rb +38 -0
  391. data/test/tmpnam_test.rb +50 -0
  392. data/wercker.yml +10 -0
  393. metadata +509 -0
@@ -0,0 +1,165 @@
1
+ #--
2
+ # $Id: stretchable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ module Magick
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
+ fail(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
+ if meet_or_slice == 'meet' || meet_or_slice == 'slice'
25
+ @meet_or_slice = meet_or_slice
26
+ else
27
+ fail(ArgumentError, "specifier must be `meet' or `slice' (got #{meet_or_slice})")
28
+ end
29
+ end
30
+ yield(self) if block_given?
31
+ self
32
+ end
33
+ end # module PreserveAspectRatio
34
+
35
+ # The methods in this module describe the user-coordinate space.
36
+ # RVG and Pattern objects are stretchable.
37
+ module Stretchable
38
+ private
39
+
40
+ # Scale to fit
41
+ def set_viewbox_none(width, height)
42
+ sx = 1.0
43
+ sy = 1.0
44
+
45
+ if @vbx_width
46
+ sx = width / @vbx_width
47
+ end
48
+ if @vbx_height
49
+ sy = height / @vbx_height
50
+ end
51
+
52
+ [sx, sy]
53
+ end
54
+
55
+ # Use align attribute to compute x- and y-offset from viewport's upper-left corner.
56
+ def align_to_viewport(width, height, sx, sy)
57
+ tx = case @align
58
+ when /\AxMin/
59
+ 0
60
+ when NilClass, /\AxMid/
61
+ (width - @vbx_width*sx) / 2.0
62
+ when /\AxMax/
63
+ width - @vbx_width*sx
64
+ end
65
+
66
+ ty = case @align
67
+ when /YMin\z/
68
+ 0
69
+ when NilClass, /YMid\z/
70
+ (height - @vbx_height*sy) / 2.0
71
+ when /YMax\z/
72
+ height - @vbx_height*sy
73
+ end
74
+ [tx, ty]
75
+ end
76
+
77
+ # Scale to smaller viewbox dimension
78
+ def set_viewbox_meet(width, height)
79
+ sx = sy = [width / @vbx_width, height / @vbx_height].min
80
+ [sx, sy]
81
+ end
82
+
83
+ # Scale to larger viewbox dimension
84
+ def set_viewbox_slice(width, height)
85
+ sx = sy = [width / @vbx_width, height / @vbx_height].max
86
+ [sx, sy]
87
+ end
88
+
89
+ # Establish the viewbox as necessary
90
+ def add_viewbox_primitives(width, height, gc)
91
+ @vbx_width ||= width
92
+ @vbx_height ||= height
93
+ @vbx_x ||= 0.0
94
+ @vbx_y ||= 0.0
95
+
96
+ if @align == 'none'
97
+ sx, sy = set_viewbox_none(width, height)
98
+ tx = 0
99
+ ty = 0
100
+ elsif @meet_or_slice == 'meet'
101
+ sx, sy = set_viewbox_meet(width, height)
102
+ tx, ty = align_to_viewport(width, height, sx, sy)
103
+ else
104
+ sx, sy = set_viewbox_slice(width, height)
105
+ tx, ty = align_to_viewport(width, height, sx, sy)
106
+ end
107
+
108
+ # Establish clipping path around the current viewport
109
+ name = __id__.to_s
110
+ gc.define_clip_path(name) do
111
+ gc.path("M0,0 l#{width},0 l0,#{height} l-#{width},0 l0,-#{height}z")
112
+ end
113
+
114
+ gc.clip_path(name)
115
+ # Add a non-scaled translation if meet or slice
116
+ gc.translate(tx, ty) if tx.abs > 1.0e-10 || ty.abs > 1.0e-10
117
+ # Scale viewbox as necessary
118
+ gc.scale(sx, sy) if sx != 1.0 || sy != 1.0
119
+ # Add a scaled translation if non-0 origin
120
+ gc.translate(-@vbx_x, -@vbx_y) if @vbx_x.abs != 0.0 || @vbx_y.abs != 0
121
+ end
122
+
123
+ def initialize(*args, &block)
124
+ super()
125
+ @vbx_x, @vbx_y, @vbx_width, @vbx_height = nil
126
+ @meet_or_slice = 'meet'
127
+ @align = nil
128
+ end
129
+
130
+ public
131
+
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
+ fail(ArgumentError, "viewbox width must be > 0 (#{width} given)") unless width >= 0
147
+ fail(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
+ unless defined? @redefined
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
+ end # module Stretchable
164
+ end # class RVG
165
+ end # module Magick
@@ -0,0 +1,116 @@
1
+ #--
2
+ # $Id: stylable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ module Magick
6
+ class RVG
7
+ #:stopdoc:
8
+ STYLES = [:clip_path, :clip_rule, :fill, :fill_opacity, :fill_rule, :font,
9
+ :font_family, :font_size, :font_stretch, :font_style, :font_weight,
10
+ :opacity, :stroke, :stroke_dasharray, :stroke_dashoffset, :stroke_linecap,
11
+ :stroke_linejoin, :stroke_miterlimit, :stroke_opacity, :stroke_width,
12
+ :text_anchor, :text_decoration,
13
+ :glyph_orientation_vertical, :glyph_orientation_horizontal,
14
+ :letter_spacing, :word_spacing, :baseline_shift, :writing_mode]
15
+
16
+ Styles = Struct.new(*STYLES)
17
+
18
+ # Styles is a Struct class with a couple of extra methods
19
+ class Styles
20
+ def set(styles)
21
+ begin
22
+ styles.each_pair do |style, value|
23
+ begin
24
+ self[style] = value
25
+ rescue NoMethodError
26
+ raise ArgumentError, "unknown style `#{style}'"
27
+ end
28
+ end
29
+ rescue NoMethodError
30
+ raise ArgumentError, "style arguments must be in the form `style => value'"
31
+ end
32
+ self
33
+ end
34
+
35
+ # Iterate over the style names. Yield for each style that has a value.
36
+ def each_value
37
+ each_pair do |style, value|
38
+ yield(style, value) if value
39
+ end
40
+ end
41
+
42
+ # The "usual" deep_copy method doesn't copy a Struct correctly.
43
+ def deep_copy(h=nil)
44
+ copy = Styles.new
45
+ each_pair { |style, value| copy[style] = value }
46
+ copy
47
+ end
48
+ end # class Styles
49
+
50
+ #:startdoc:
51
+
52
+ # This module is mixed into classes that can have styles.
53
+ module Stylable
54
+ private
55
+
56
+ # For each style that has a value, add a style primitive to the gc.
57
+ # Use splat to splat out Array arguments such as stroke_dasharray.
58
+ def add_style_primitives(gc)
59
+ @styles.each_value do |style, value|
60
+ if value.respond_to? :add_primitives
61
+ value.add_primitives(gc, style)
62
+ else
63
+ gc.__send__(style, *value)
64
+ end
65
+ end
66
+ end
67
+
68
+ def initialize
69
+ super
70
+ @styles = Styles.new
71
+ end
72
+
73
+ public
74
+
75
+ # This method can be used with any RVG, Group, Use, Text, or
76
+ # shape object. The argument is a hash. The style names are
77
+ # the hash keys. The style names and values are:
78
+ # [:baseline_shift] modify the text baseline
79
+ # [:clip_path] clipping path defined by clip_path
80
+ # [:clip_rule] 'evenodd' or 'nozero'
81
+ # [:fill] color name
82
+ # [:fill_opacity] the fill opacity, 0.0<=N<=1.0
83
+ # [:fill_rule] 'evenodd' or 'nozero'
84
+ # [:font] font name or font file name
85
+ # [:font_family] font family name, ex. 'serif'
86
+ # [:font_size] font size in points
87
+ # [:font_stretch] 'normal','ultra_condensed','extra_condensed',
88
+ # 'condensed','semi_condensed','semi_expanded',
89
+ # 'expanded','extra_expanded','ultra_expanded'
90
+ # [:font_style] 'normal','italic','oblique'
91
+ # [:font_weight] 'normal','bold','bolder','lighter', or
92
+ # a multiple of 100 between 100 and 900.
93
+ # [:glyph_orientation_horizontal] 0, 90, 180, 270
94
+ # [:glyph_orientation_vertical] 0, 90, 180, 270
95
+ # [:letter_spacing] modify the spacing between letters
96
+ # [:opacity] both fill and stroke opacity, 0.0<=N<=1.0
97
+ # [:stroke] color name
98
+ # [:stroke_dasharray] dash pattern (Array)
99
+ # [:stroke_dashoffset] initial distance into dash pattern
100
+ # [:stroke_linecap] 'butt', 'round', 'square'
101
+ # [:stroke_linejoin] 'miter', 'round', 'bevel'
102
+ # [:stroke_miterlimit] miter length constraint
103
+ # [:stroke_opacity] the stroke opacity, 0.0<=N<=1.0
104
+ # [:stroke_width] stroke width
105
+ # [:text_anchor] 'start','middle','end'
106
+ # [:text_decoration] 'none','underline','overline','line_through'
107
+ # [:word_spacing] modify the spacing between words
108
+ # [:writing_mode] 'lr-tb', 'lr', 'rt-tb', 'rl', 'tb-rl', 'tb'
109
+ def styles(styles)
110
+ @styles.set(styles)
111
+ yield(self) if block_given?
112
+ self
113
+ end
114
+ end # module Stylable
115
+ end # class RVG
116
+ end # module Magick
data/lib/rvg/text.rb ADDED
@@ -0,0 +1,172 @@
1
+ #--
2
+ # $Id: text.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ # Text-related classes
6
+ module Magick
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, &block) #:nodoc:
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
+ def add_primitives(gc) #:nodoc:
52
+ if @text || @tspans.length > 0
53
+ gc.push
54
+ x = cx + @dx
55
+ y = cy + @dy
56
+ if @rotation != 0
57
+ gc.translate(x, y)
58
+ gc.rotate(@rotation)
59
+ gc.translate(-x, -y)
60
+ end
61
+ add_style_primitives(gc)
62
+ if @text
63
+ x2, y2 = gc.text(x, y, @text)
64
+ self.cx = x + x2
65
+ self.cy = y + y2
66
+ end
67
+ @tspans.each do |tspan|
68
+ tspan.add_primitives(gc)
69
+ end
70
+ gc.pop
71
+ end
72
+ end
73
+ end # class TextBase
74
+
75
+ # Tspan and Tref shared methods - read/update @cx, @cy in parent Text object.
76
+ module TextLink #:nodoc:
77
+ def add_primitives(gc)
78
+ @parent.cx = @x if @x
79
+ @parent.cy = @y if @y
80
+ super
81
+ end
82
+
83
+ def cx
84
+ @parent.cx
85
+ end
86
+
87
+ def cy
88
+ @parent.cy
89
+ end
90
+
91
+ def cx=(x)
92
+ @parent.cx = x
93
+ end
94
+
95
+ def cy=(y)
96
+ @parent.cy = y
97
+ end
98
+ end # module TextLink
99
+
100
+ class Tref < TextBase #:nodoc:
101
+ include TextLink
102
+
103
+ def initialize(obj, x, y, parent)
104
+ @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
105
+ super(nil)
106
+ @tspans << obj
107
+ @parent = parent
108
+ end
109
+ end # class Tref
110
+
111
+ class Tspan < TextBase #:nodoc:
112
+ include TextLink
113
+
114
+ attr_accessor :parent
115
+
116
+ # Define a text segment starting at (<tt>x</tt>, <tt>y</tt>).
117
+ # If <tt>x</tt> and <tt>y</tt> are omitted the segment starts
118
+ # at the current text position.
119
+ #
120
+ # Tspan objects can contain Tspan objects.
121
+ def initialize(text=nil, x=nil, y=nil, &block)
122
+ @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
123
+ super(text, &block)
124
+ end
125
+ end # class Tspan
126
+
127
+ class Text < TextBase
128
+ attr_accessor :cx, :cy #:nodoc:
129
+
130
+ # Define a text string starting at [<tt>x</tt>, <tt>y</tt>].
131
+ # Use the RVG::TextConstructors#text method to create Text objects in a container.
132
+ #
133
+ # container.text(100, 100, "Simple text").styles(:font=>'Arial')
134
+ #
135
+ # Text objects can contain Tspan objects.
136
+ #
137
+ # container.text(100, 100).styles(:font=>'Arial') do |t|
138
+ # t.tspan("Red text").styles(:fill=>'red')
139
+ # t.tspan("Blue text").styles(:fill=>'blue')
140
+ # end
141
+ def initialize(x=0, y=0, text=nil, &block)
142
+ @cx, @cy = Magick::RVG.convert_to_float(x, y)
143
+ super(text, &block)
144
+ end
145
+
146
+ # Reference a Tspan object. <tt>x</tt> and <tt>y</tt> are just
147
+ # like <tt>x</tt> and <tt>y</tt> in RVG::TextBase#tspan
148
+ def tref(obj, x=nil, y=nil)
149
+ unless obj.is_a?(Tspan)
150
+ fail ArgumentError, "wrong argument type #{obj.class} (expected Tspan)"
151
+ end
152
+ obj = obj.deep_copy
153
+ obj.parent = self
154
+ tref = Tref.new(obj, x, y, self)
155
+ @tspans << tref
156
+ tref
157
+ end
158
+ end # class Text
159
+
160
+ # Methods that construct text objects within a container
161
+ module TextConstructors
162
+ # Draw a text string at (<tt>x</tt>,<tt>y</tt>). The string can
163
+ # be omitted. Optionally, define text chunks within the associated
164
+ # block.
165
+ def text(x=0, y=0, text=nil, &block)
166
+ t = Text.new(x, y, text, &block)
167
+ @content << t
168
+ t
169
+ end
170
+ end # module TextConstructors
171
+ end # class RVG
172
+ end # module Magick