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
data/lib/rvg/paint.rb ADDED
@@ -0,0 +1,50 @@
1
+ #--
2
+ # $Id: paint.rb,v 1.6 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ # Defines paint server classes.
6
+ # Eventually this will include gradients.
7
+ module Magick
8
+ class RVG
9
+ class Pattern
10
+ include StructureConstructors
11
+ include UseConstructors
12
+ include ShapeConstructors
13
+ include TextConstructors
14
+ include ImageConstructors
15
+ include Stretchable
16
+ include Duplicatable
17
+ include Stylable
18
+
19
+ # Return upper-left corner, width, height of viewport in user coordinates.
20
+ # Usually these are the values specified when the Pattern object is
21
+ # created, but they can be changed by a call to the viewbox method.
22
+ attr_reader :x, :y, :width, :height
23
+
24
+ # Create a pattern that can be used with the :fill or :stroke styles.
25
+ # The +width+ and +height+ arguments define the viewport.
26
+ # The pattern will be repeated at <tt>x+m*width</tt> and <tt>y+n*height</tt>
27
+ # offsets.
28
+ #
29
+ # Define the pattern in the block.
30
+ # The pattern can be composed of shapes (rectangle, circles, etc.), text,
31
+ # raster images and container objects. You can include graphic objects by
32
+ # referring to them with #use.
33
+ def initialize(width = 0, height = 0, x = 0, y = 0)
34
+ super()
35
+ @width, @height, @x, @y = Magick::RVG.convert_to_float(width, height, x, y)
36
+ @content = Content.new
37
+ yield(self) if block_given?
38
+ end
39
+
40
+ def add_primitives(gc, style) #:nodoc:
41
+ name = __id__.to_s
42
+ gc.pattern(name, @x, @y, @width, @height) do
43
+ add_viewbox_primitives(@width, @height, gc)
44
+ @content.each { |element| element.add_primitives(gc) }
45
+ end
46
+ gc.__send__(style, name)
47
+ end
48
+ end # class Pattern
49
+ end # class RVG
50
+ end # module Magick
@@ -0,0 +1,126 @@
1
+ #--
2
+ # $Id: pathdata.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
3
+ # Copyright (C) 2009 Timothy P. Hunter
4
+ #++
5
+ module Magick
6
+ class RVG
7
+ # The PathData class provides an object-oriented way to produce an SVG
8
+ # path. Each of the methods corresponds to a path command. Construct a
9
+ # path by calling one or more methods. The path object can be passed
10
+ # as an argument to the RVG::ShapeConstructors#path method.
11
+ class PathData
12
+ private
13
+
14
+ def add_points(req, *coords)
15
+ if coords
16
+ if coords.length % req != 0
17
+ fail ArgumentError, "wrong number of coordinates specified. A multiple of #{req} required, #{req+coords.length} given."
18
+ end
19
+ coords.each {|c| @path << ('%g' % c)}
20
+ end
21
+ end
22
+
23
+ public
24
+
25
+ # Construct an empty path
26
+ def initialize
27
+ @path = ''
28
+ end
29
+
30
+ # Convert the path to its string equivalent.
31
+ def to_s
32
+ @path
33
+ end
34
+
35
+ def deep_copy(h = nil) #:nodoc:
36
+ @path.dup
37
+ end
38
+
39
+ # Add a <tt>moveto</tt> command. If <tt>abs</tt> is
40
+ # <tt>true</tt> the coordinates are absolute, otherwise
41
+ # the coordinates are relative.
42
+ def moveto(abs, x, y, *coords)
43
+ @path << sprintf('%s%g,%g ', (abs ? 'M' : 'm'), x, y)
44
+ # "subsequent pairs are treated as implicit lineto commands"
45
+ add_points(2, *coords)
46
+ end
47
+
48
+ # Add a <tt>closepath</tt> command. The <tt>abs</tt> argument
49
+ # is ignored.
50
+ def closepath(abs = true)
51
+ @path << 'Z' # ignore `abs'
52
+ end
53
+
54
+ # Add a <tt>lineto</tt> command. Any number of x,y coordinate
55
+ # pairs may be specified. If <tt>abs</tt> is
56
+ # <tt>true</tt> the coordinates are absolute, otherwise
57
+ # the coordinates are relative.
58
+ def lineto(abs, x, y, *coords)
59
+ @path << sprintf('%s%g,%g ', (abs ? 'L' : 'l'), x, y)
60
+ # "a number of coordinate pairs may be specified to draw a polyline"
61
+ add_points(2, *coords)
62
+ end
63
+
64
+ # Add a <tt>horizontal lineto</tt> command. If <tt>abs</tt> is
65
+ # <tt>true</tt> the coordinates are absolute, otherwise
66
+ # the coordinates are relative.
67
+ def hlineto(abs, x)
68
+ @path << sprintf('%s%g ', (abs ? 'H' : 'h'), x)
69
+ end
70
+
71
+ # Add a <tt>vertical lineto</tt> command. If <tt>abs</tt> is
72
+ # <tt>true</tt> the coordinates are absolute, otherwise
73
+ # the coordinates are relative.
74
+ def vlineto(abs, y)
75
+ @path << sprintf('%s%g ', (abs ? 'V' : 'v'), y)
76
+ end
77
+
78
+ # Add a <tt>curveto</tt> (<em>cubic Bezier</em>) command.
79
+ # If <tt>abs</tt> is
80
+ # <tt>true</tt> the coordinates are absolute, otherwise
81
+ # the coordinates are relative.
82
+ def curveto(abs, x1, y1, x2, y2, x, y, *coords)
83
+ @path << sprintf('%s%g,%g %g,%g %g,%g ', (abs ? 'C' : 'c'), x1, y1, x2, y2, x, y)
84
+ # "multiple sets of coordinates may be specified to draw a polybezier"
85
+ add_points(6, *coords)
86
+ end
87
+
88
+ # Add a <tt>smooth curveto</tt> (<em>cubic Bezier</em>) command.
89
+ # If <tt>abs</tt> is
90
+ # <tt>true</tt> the coordinates are absolute, otherwise
91
+ # the coordinates are relative.
92
+ def smooth_curveto(abs, x2, y2, x, y, *coords)
93
+ @path << sprintf('%s%g,%g %g,%g ', (abs ? 'S' : 's'), x2, y2, x, y)
94
+ # "multiple sets of coordinates may be specified to draw a polybezier"
95
+ add_points(4, *coords)
96
+ end
97
+
98
+ # Add a <tt>quadratic Bezier curveto</tt> command.
99
+ # If <tt>abs</tt> is
100
+ # <tt>true</tt> the coordinates are absolute, otherwise
101
+ # the coordinates are relative.
102
+ def quadratic_curveto(abs, x1, y1, x, y, *coords)
103
+ @path << sprintf('%s%g,%g %g,%g ', (abs ? 'Q' : 'q'), x1, y1, x, y)
104
+ add_points(4, *coords)
105
+ end
106
+
107
+ # Add a <tt>smooth quadratic Bezier curveto</tt> command.
108
+ # If <tt>abs</tt> is
109
+ # <tt>true</tt> the coordinates are absolute, otherwise
110
+ # the coordinates are relative.
111
+ def smooth_quadratic_curveto(abs, x, y, *coords)
112
+ @path << sprintf('%s%g,%g ', (abs ? 'T' : 't'), x, y)
113
+ add_points(2, *coords)
114
+ end
115
+
116
+ # Add an <tt>arc</tt> command.
117
+ # If <tt>abs</tt> is
118
+ # <tt>true</tt> the coordinates are absolute, otherwise
119
+ # the coordinates are relative.
120
+
121
+ def arc(abs, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y)
122
+ @path << sprintf('%s%g,%g %g %d %d %g,%g ', (abs ? 'A' : 'a'), rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y)
123
+ end
124
+ end # class PathData
125
+ end # class RVG
126
+ end # module Magick
data/lib/rvg/rvg.rb ADDED
@@ -0,0 +1,283 @@
1
+ #--############################################################################
2
+ # $Id: rvg.rb,v 1.10 2009/02/28 23:52:28 rmagick Exp $
3
+ #
4
+ # Copyright (C) 2009 by Timothy P. Hunter
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a
7
+ # copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included
15
+ # in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #
25
+ #
26
+ # This software is OSI Certified Open Source Software.
27
+ # OSI Certified is a certification mark of the Open Source Initiative.
28
+ #
29
+ #++############################################################################
30
+ require 'rmagick'
31
+ require 'rvg/misc'
32
+ require 'rvg/describable'
33
+ require 'rvg/stylable'
34
+ require 'rvg/transformable'
35
+ require 'rvg/stretchable'
36
+ require 'rvg/text'
37
+ require 'rvg/embellishable'
38
+ require 'rvg/container'
39
+ require 'rvg/pathdata'
40
+ require 'rvg/clippath'
41
+ require 'rvg/paint'
42
+ require 'rvg/units'
43
+
44
+ require 'pp' if ENV['debug_rvg']
45
+
46
+ # RVG is the main class in this library. All graphic elements
47
+ # must be contained within an RVG object.
48
+ module Magick
49
+ class RVG
50
+ include Stylable
51
+ include Transformable
52
+ include Stretchable
53
+ include Embellishable
54
+ include Describable
55
+ include Duplicatable
56
+
57
+ private
58
+
59
+ # background_fill defaults to 'none'. If background_fill has been set to something
60
+ # else, combine it with the background_fill_opacity.
61
+ def bgfill
62
+ if @background_fill.nil?
63
+ color = Magick::Pixel.new(0,0,0,Magick::TransparentOpacity)
64
+ else
65
+ color = @background_fill
66
+ color.opacity = (1.0 - @background_fill_opacity) * Magick::TransparentOpacity
67
+ end
68
+ color
69
+ end
70
+
71
+ def new_canvas
72
+ if @background_pattern
73
+ canvas = Magick::Image.new(@width, @height, @background_pattern)
74
+ elsif @background_image
75
+ if @width != @background_image.columns || @height != @background_image.rows
76
+ canvas = case @background_position
77
+ when :scaled
78
+ @background_image.resize(@width, @height)
79
+ when :tiled
80
+ Magick::Image.new(@width, @height, Magick::TextureFill.new(@background_image))
81
+ when :fit
82
+ width = @width
83
+ height = @height
84
+ bgcolor = bgfill
85
+ @background_image.change_geometry(Magick::Geometry.new(width, height)) do |new_cols, new_rows|
86
+ bg_image = @background_image.resize(new_cols, new_rows)
87
+ if bg_image.columns != width || bg_image.rows != height
88
+ bg = Magick::Image.new(width, height) { self.background_color = bgcolor }
89
+ bg_image = bg.composite!(bg_image, Magick::CenterGravity, Magick::OverCompositeOp)
90
+ end
91
+ bg_image
92
+ end
93
+ end
94
+ else
95
+ canvas = @background_image.copy
96
+ end
97
+ else
98
+ bgcolor = bgfill
99
+ canvas = Magick::Image.new(Integer(@width), Integer(@height)) { self.background_color = bgcolor }
100
+ end
101
+ canvas[:desc] = @desc if @desc
102
+ canvas[:title] = @title if @title
103
+ canvas[:metadata] = @metadata if @metadata
104
+ canvas
105
+ end
106
+
107
+ if ENV['debug_prim']
108
+ def print_gc(gc)
109
+ primitives = gc.inspect.split(/\n/)
110
+ indent = 0
111
+ primitives.each do |cmd|
112
+ indent -= 1 if cmd['pop ']
113
+ print((' '*indent), cmd, "\n")
114
+ indent += 1 if cmd['push ']
115
+ end
116
+ end
117
+ end
118
+
119
+ public
120
+
121
+ WORD_SEP = / / # Regexp to separate words
122
+
123
+ # The background image specified by background_image=
124
+ attr_reader :background_image
125
+ # The background image layout specified by background_position=
126
+ attr_reader :background_position
127
+ # The background fill color specified by background_fill=
128
+ attr_reader :background_fill
129
+ # The background fill color opacity specified by background_fill_opacity=
130
+ attr_reader :background_fill_opacity
131
+ # The image after drawing has completed
132
+ attr_reader :canvas
133
+ # For embedded RVG objects, the x-axis coordinate of the upper-left corner
134
+ attr_reader :x
135
+ # For embedded RVG objects, the x-axis coordinate of the upper-left corner
136
+ attr_reader :y
137
+ attr_reader :width, :height
138
+
139
+ # Sets an image to use as the canvas background. See background_position= for layout options.
140
+ def background_image=(bg_image)
141
+ warn 'background_image= has no effect in nested RVG objects' if @nested
142
+ if bg_image && !bg_image.is_a?(Magick::Image)
143
+ fail ArgumentError, "background image must be an Image (got #{bg_image.class})"
144
+ end
145
+ @background_image = bg_image
146
+ end
147
+
148
+ # Sets an object to use to fill the canvas background.
149
+ # The object must have a <tt>fill</tt> method. See the <b>Fill Classes</b>
150
+ # section in the RMagick doc for more information.
151
+ def background_pattern=(filler)
152
+ warn 'background_pattern= has no effect in nested RVG objects' if @nested
153
+ @background_pattern = filler
154
+ end
155
+
156
+ # How to position the background image on the canvas. One of the following symbols:
157
+ # [:scaled] Scale the image to the canvas width and height.
158
+ # [:tiled] Tile the image across the canvas.
159
+ # [:fit] Scale the image to fit within the canvas while retaining the
160
+ # image proportions. Center the image on the canvas. Color any part of
161
+ # the canvas not covered by the image with the background color.
162
+ def background_position=(pos)
163
+ warn 'background_position= has no effect in nested RVG objects' if @nested
164
+ bg_pos = pos.to_s.downcase
165
+ unless ['scaled', 'tiled', 'fit'].include?(bg_pos)
166
+ fail ArgumentError, "background position must be `scaled', `tiled', or `fit' (#{pos} given)"
167
+ end
168
+ @background_position = bg_pos.to_sym
169
+ end
170
+
171
+ # Sets the canvas background color. Either a Magick::Pixel or a color name.
172
+ # The default fill is "none", that is, transparent black.
173
+ def background_fill=(color)
174
+ warn 'background_fill= has no effect in nested RVG objects' if @nested
175
+ if !color.is_a?(Magick::Pixel)
176
+ begin
177
+ @background_fill = Magick::Pixel.from_color(color)
178
+ rescue Magick::ImageMagickError
179
+ raise ArgumentError, "unknown color `#{color}'"
180
+ rescue TypeError
181
+ raise TypeError, "cannot convert #{color.class} into Pixel"
182
+ rescue
183
+ raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})"
184
+ end
185
+ else
186
+ @background_fill = color
187
+ end
188
+ end
189
+
190
+ # Opacity of the background fill color, a number between 0.0 (transparent) and
191
+ # 1.0 (opaque). The default is 1.0 when the background_fill= attribute has been set.
192
+ def background_fill_opacity=(opacity)
193
+ warn 'background_fill_opacity= has no effect in nested RVG objects' if @nested
194
+ begin
195
+ @background_fill_opacity = Float(opacity)
196
+ rescue ArgumentError
197
+ raise ArgumentError, "background_fill_opacity must be a number between 0 and 1 (#{opacity} given)"
198
+ end
199
+ end
200
+
201
+ # Draw a +width+ x +height+ image. The image is specified by calling
202
+ # one or more drawing methods on the RVG object.
203
+ # You can group the drawing method calls in the optional associated block.
204
+ # The +x+ and +y+ arguments have no meaning for the outermost RVG object.
205
+ # On nested RVG objects [+x+, +y+] is the coordinate of the upper-left
206
+ # corner in the containing canvas on which the nested RVG object is placed.
207
+ #
208
+ # Drawing occurs on a +canvas+ created by the #draw method. By default the
209
+ # canvas is transparent. You can specify a different canvas with the
210
+ # #background_fill= or #background_image= methods.
211
+ #
212
+ # RVG objects are _containers_. That is, styles and transforms defined
213
+ # on the object are used by contained objects such as shapes, text, and
214
+ # groups unless overridden by an inner container or the object itself.
215
+ def initialize(width = nil, height = nil)
216
+ super
217
+ @width = width
218
+ @height = height
219
+ @content = Content.new
220
+ @canvas = nil
221
+ @background_fill = nil
222
+ @background_fill_opacity = 1.0 # applies only if background_fill= is used
223
+ @background_position = :scaled
224
+ @background_pattern, @background_image, @desc, @title, @metadata = nil
225
+ @x = 0.0
226
+ @y = 0.0
227
+ @nested = false
228
+ yield(self) if block_given?
229
+ end
230
+
231
+ # Construct a canvas or reuse an existing canvas.
232
+ # Execute drawing commands. Return the canvas.
233
+ def draw
234
+ fail StandardError, 'draw not permitted in nested RVG objects' if @nested
235
+ @canvas ||= new_canvas # allow drawing over existing canvas
236
+ gc = Utility::GraphicContext.new
237
+ add_outermost_primitives(gc)
238
+ pp(self) if ENV['debug_rvg']
239
+ print_gc(gc) if ENV['debug_prim']
240
+ gc.draw(@canvas)
241
+ @canvas
242
+ end
243
+
244
+ # Accept #use arguments. Use (x,y) to generate an additional translate.
245
+ # Override @width and @height if new values are supplied.
246
+ def ref(x, y, rw, rh) #:nodoc:
247
+ translate(x, y) if x != 0 || y != 0
248
+ @width = rw if rw
249
+ @height = rh if rh
250
+ end
251
+
252
+ # Used by Magick::Embellishable.rvg to set non-0 x- and y-coordinates
253
+ def corner(x, y) #:nodoc:
254
+ @nested = true
255
+ @x = Float(x)
256
+ @y = Float(y)
257
+ translate(@x, @y) if @x != 0.0 || @y != 0.0
258
+ end
259
+
260
+ # Primitives for the outermost RVG object
261
+ def add_outermost_primitives(gc) #:nodoc:
262
+ add_transform_primitives(gc)
263
+ gc.push
264
+ add_viewbox_primitives(@width, @height, gc)
265
+ add_style_primitives(gc)
266
+ @content.each { |element| element.add_primitives(gc) }
267
+ gc.pop
268
+ self
269
+ end
270
+
271
+ # Primitives for nested RVG objects
272
+ def add_primitives(gc) #:nodoc:
273
+ if @width.nil? || @height.nil?
274
+ fail ArgumentError, 'RVG width or height undefined'
275
+ elsif @width == 0 || @height == 0
276
+ return self
277
+ end
278
+ gc.push
279
+ add_outermost_primitives(gc)
280
+ gc.pop
281
+ end
282
+ end # end class RVG
283
+ end # end module Magick