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.
- checksums.yaml +7 -0
- data/.editorconfig +14 -0
- data/.gitignore +23 -0
- data/.hound.yml +2 -0
- data/.rspec +1 -0
- data/.rubocop.yml +340 -0
- data/.simplecov +27 -0
- data/.travis.yml +60 -0
- data/CHANGELOG.md +915 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +50 -0
- data/Doxyfile +1514 -0
- data/Gemfile +10 -0
- data/LICENSE +20 -0
- data/README.textile +257 -0
- data/Rakefile +188 -0
- data/before_install_linux.sh +32 -0
- data/before_install_osx.sh +2 -0
- data/deprecated/RMagick.rb +6 -0
- data/doc/.cvsignore +1 -0
- data/doc/comtasks.html +287 -0
- data/doc/constants.html +1581 -0
- data/doc/css/doc.css +299 -0
- data/doc/css/popup.css +34 -0
- data/doc/css/ref.css +67 -0
- data/doc/draw.html +3272 -0
- data/doc/ex/InitialCoords.rb +22 -0
- data/doc/ex/NewCoordSys.rb +30 -0
- data/doc/ex/OrigCoordSys.rb +16 -0
- data/doc/ex/PreserveAspectRatio.rb +204 -0
- data/doc/ex/RotateScale.rb +36 -0
- data/doc/ex/Skew.rb +38 -0
- data/doc/ex/Use01.rb +15 -0
- data/doc/ex/Use02.rb +20 -0
- data/doc/ex/Use03.rb +16 -0
- data/doc/ex/ViewBox.rb +31 -0
- data/doc/ex/adaptive_threshold.rb +9 -0
- data/doc/ex/add_noise.rb +16 -0
- data/doc/ex/affine.rb +48 -0
- data/doc/ex/affine_transform.rb +20 -0
- data/doc/ex/arc.rb +49 -0
- data/doc/ex/arcpath.rb +32 -0
- data/doc/ex/arcs01.rb +28 -0
- data/doc/ex/arcs02.rb +59 -0
- data/doc/ex/average.rb +15 -0
- data/doc/ex/axes.rb +64 -0
- data/doc/ex/baseline_shift01.rb +17 -0
- data/doc/ex/bilevel_channel.rb +8 -0
- data/doc/ex/blur_image.rb +12 -0
- data/doc/ex/border.rb +10 -0
- data/doc/ex/bounding_box.rb +42 -0
- data/doc/ex/cbezier1.rb +41 -0
- data/doc/ex/cbezier2.rb +41 -0
- data/doc/ex/cbezier3.rb +41 -0
- data/doc/ex/cbezier4.rb +42 -0
- data/doc/ex/cbezier5.rb +42 -0
- data/doc/ex/cbezier6.rb +53 -0
- data/doc/ex/channel.rb +25 -0
- data/doc/ex/charcoal.rb +12 -0
- data/doc/ex/chop.rb +29 -0
- data/doc/ex/circle.rb +33 -0
- data/doc/ex/circle01.rb +16 -0
- data/doc/ex/clip_path.rb +60 -0
- data/doc/ex/coalesce.rb +57 -0
- data/doc/ex/color_fill_to_border.rb +29 -0
- data/doc/ex/color_floodfill.rb +28 -0
- data/doc/ex/color_histogram.rb +47 -0
- data/doc/ex/color_reset.rb +11 -0
- data/doc/ex/colorize.rb +16 -0
- data/doc/ex/colors.rb +64 -0
- data/doc/ex/compose_mask.rb +22 -0
- data/doc/ex/composite.rb +133 -0
- data/doc/ex/composite_layers.rb +53 -0
- data/doc/ex/composite_tiled.rb +21 -0
- data/doc/ex/contrast.rb +36 -0
- data/doc/ex/crop.rb +31 -0
- data/doc/ex/crop_with_gravity.rb +42 -0
- data/doc/ex/cubic01.rb +43 -0
- data/doc/ex/cubic02.rb +91 -0
- data/doc/ex/cycle_colormap.rb +21 -0
- data/doc/ex/dissolve.rb +12 -0
- data/doc/ex/drawcomp.rb +42 -0
- data/doc/ex/drop_shadow.rb +60 -0
- data/doc/ex/edge.rb +11 -0
- data/doc/ex/ellipse.rb +45 -0
- data/doc/ex/ellipse01.rb +21 -0
- data/doc/ex/emboss.rb +11 -0
- data/doc/ex/enhance.rb +28 -0
- data/doc/ex/equalize.rb +11 -0
- data/doc/ex/evenodd.rb +42 -0
- data/doc/ex/fill_pattern.rb +23 -0
- data/doc/ex/flatten_images.rb +36 -0
- data/doc/ex/flip.rb +11 -0
- data/doc/ex/flop.rb +11 -0
- data/doc/ex/font_styles.rb +32 -0
- data/doc/ex/fonts.rb +20 -0
- data/doc/ex/frame.rb +12 -0
- data/doc/ex/gaussian_blur.rb +11 -0
- data/doc/ex/get_multiline_type_metrics.rb +41 -0
- data/doc/ex/get_pixels.rb +47 -0
- data/doc/ex/get_type_metrics.rb +141 -0
- data/doc/ex/gradientfill.rb +27 -0
- data/doc/ex/grav.rb +45 -0
- data/doc/ex/gravity.rb +80 -0
- data/doc/ex/group.rb +26 -0
- data/doc/ex/hatchfill.rb +27 -0
- data/doc/ex/image.rb +44 -0
- data/doc/ex/images/Apple.miff +0 -0
- data/doc/ex/images/Ballerina.jpg +0 -0
- data/doc/ex/images/Ballerina3.jpg +0 -0
- data/doc/ex/images/Button_0.gif +0 -0
- data/doc/ex/images/Button_1.gif +0 -0
- data/doc/ex/images/Button_2.gif +0 -0
- data/doc/ex/images/Button_3.gif +0 -0
- data/doc/ex/images/Button_4.gif +0 -0
- data/doc/ex/images/Button_5.gif +0 -0
- data/doc/ex/images/Button_6.gif +0 -0
- data/doc/ex/images/Button_7.gif +0 -0
- data/doc/ex/images/Button_8.gif +0 -0
- data/doc/ex/images/Button_9.gif +0 -0
- data/doc/ex/images/Button_A.gif +0 -0
- data/doc/ex/images/Button_B.gif +0 -0
- data/doc/ex/images/Button_C.gif +0 -0
- data/doc/ex/images/Button_D.gif +0 -0
- data/doc/ex/images/Button_E.gif +0 -0
- data/doc/ex/images/Button_F.gif +0 -0
- data/doc/ex/images/Button_G.gif +0 -0
- data/doc/ex/images/Button_H.gif +0 -0
- data/doc/ex/images/Button_I.gif +0 -0
- data/doc/ex/images/Button_J.gif +0 -0
- data/doc/ex/images/Button_K.gif +0 -0
- data/doc/ex/images/Button_L.gif +0 -0
- data/doc/ex/images/Button_M.gif +0 -0
- data/doc/ex/images/Button_N.gif +0 -0
- data/doc/ex/images/Button_O.gif +0 -0
- data/doc/ex/images/Button_P.gif +0 -0
- data/doc/ex/images/Button_Q.gif +0 -0
- data/doc/ex/images/Button_R.gif +0 -0
- data/doc/ex/images/Button_S.gif +0 -0
- data/doc/ex/images/Button_T.gif +0 -0
- data/doc/ex/images/Button_U.gif +0 -0
- data/doc/ex/images/Button_V.gif +0 -0
- data/doc/ex/images/Button_W.gif +0 -0
- data/doc/ex/images/Button_X.gif +0 -0
- data/doc/ex/images/Button_Y.gif +0 -0
- data/doc/ex/images/Button_Z.gif +0 -0
- data/doc/ex/images/Cheetah.jpg +0 -0
- data/doc/ex/images/Coffee.wmf +0 -0
- data/doc/ex/images/Flower_Hat.jpg +0 -0
- data/doc/ex/images/Gold_Statue.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
- data/doc/ex/images/Leaf.miff +0 -0
- data/doc/ex/images/No.wmf +0 -0
- data/doc/ex/images/Polynesia.jpg +0 -0
- data/doc/ex/images/Red_Rocks.jpg +0 -0
- data/doc/ex/images/Rocks_On_Beach.miff +0 -0
- data/doc/ex/images/Shorts.jpg +0 -0
- data/doc/ex/images/Snake.wmf +0 -0
- data/doc/ex/images/Violin.jpg +0 -0
- data/doc/ex/images/Yellow_Rose.miff +0 -0
- data/doc/ex/images/big-duck.gif +0 -0
- data/doc/ex/images/duck.gif +0 -0
- data/doc/ex/images/duck0.gif +0 -0
- data/doc/ex/images/duck1.gif +0 -0
- data/doc/ex/images/duck10.gif +0 -0
- data/doc/ex/images/duck11.gif +0 -0
- data/doc/ex/images/duck12.gif +0 -0
- data/doc/ex/images/duck13.gif +0 -0
- data/doc/ex/images/duck14.gif +0 -0
- data/doc/ex/images/duck15.gif +0 -0
- data/doc/ex/images/duck2.gif +0 -0
- data/doc/ex/images/duck3.gif +0 -0
- data/doc/ex/images/duck4.gif +0 -0
- data/doc/ex/images/duck5.gif +0 -0
- data/doc/ex/images/duck6.gif +0 -0
- data/doc/ex/images/duck7.gif +0 -0
- data/doc/ex/images/duck8.gif +0 -0
- data/doc/ex/images/duck9.gif +0 -0
- data/doc/ex/images/graydient230x6.gif +0 -0
- data/doc/ex/images/image_with_profile.jpg +0 -0
- data/doc/ex/images/logo400x83.gif +0 -0
- data/doc/ex/images/model.miff +0 -0
- data/doc/ex/images/notimplemented.gif +0 -0
- data/doc/ex/images/smile.miff +0 -0
- data/doc/ex/images/spin.gif +0 -0
- data/doc/ex/implode.rb +34 -0
- data/doc/ex/level.rb +11 -0
- data/doc/ex/level_colors.rb +11 -0
- data/doc/ex/line.rb +41 -0
- data/doc/ex/line01.rb +21 -0
- data/doc/ex/mask.rb +35 -0
- data/doc/ex/matte_fill_to_border.rb +39 -0
- data/doc/ex/matte_floodfill.rb +32 -0
- data/doc/ex/matte_replace.rb +39 -0
- data/doc/ex/median_filter.rb +28 -0
- data/doc/ex/modulate.rb +11 -0
- data/doc/ex/mono.rb +23 -0
- data/doc/ex/morph.rb +25 -0
- data/doc/ex/mosaic.rb +35 -0
- data/doc/ex/motion_blur.rb +11 -0
- data/doc/ex/negate.rb +11 -0
- data/doc/ex/negate_channel.rb +9 -0
- data/doc/ex/nested_rvg.rb +21 -0
- data/doc/ex/nonzero.rb +42 -0
- data/doc/ex/normalize.rb +11 -0
- data/doc/ex/oil_paint.rb +11 -0
- data/doc/ex/opacity.rb +37 -0
- data/doc/ex/ordered_dither.rb +11 -0
- data/doc/ex/path.rb +63 -0
- data/doc/ex/pattern1.rb +25 -0
- data/doc/ex/pattern2.rb +26 -0
- data/doc/ex/polaroid.rb +27 -0
- data/doc/ex/polygon.rb +23 -0
- data/doc/ex/polygon01.rb +21 -0
- data/doc/ex/polyline.rb +22 -0
- data/doc/ex/polyline01.rb +21 -0
- data/doc/ex/posterize.rb +8 -0
- data/doc/ex/preview.rb +8 -0
- data/doc/ex/qbezierpath.rb +52 -0
- data/doc/ex/quad01.rb +34 -0
- data/doc/ex/quantize-m.rb +25 -0
- data/doc/ex/radial_blur.rb +9 -0
- data/doc/ex/raise.rb +8 -0
- data/doc/ex/random_threshold_channel.rb +13 -0
- data/doc/ex/rect01.rb +14 -0
- data/doc/ex/rect02.rb +20 -0
- data/doc/ex/rectangle.rb +34 -0
- data/doc/ex/reduce_noise.rb +28 -0
- data/doc/ex/remap.rb +11 -0
- data/doc/ex/remap_images.rb +19 -0
- data/doc/ex/resize_to_fill.rb +8 -0
- data/doc/ex/resize_to_fit.rb +8 -0
- data/doc/ex/roll.rb +9 -0
- data/doc/ex/rotate.rb +44 -0
- data/doc/ex/rotate_f.rb +14 -0
- data/doc/ex/roundrect.rb +33 -0
- data/doc/ex/rubyname.rb +30 -0
- data/doc/ex/rvg_clippath.rb +12 -0
- data/doc/ex/rvg_linecap.rb +42 -0
- data/doc/ex/rvg_linejoin.rb +40 -0
- data/doc/ex/rvg_opacity.rb +18 -0
- data/doc/ex/rvg_pattern.rb +26 -0
- data/doc/ex/rvg_stroke_dasharray.rb +11 -0
- data/doc/ex/segment.rb +11 -0
- data/doc/ex/sepiatone.rb +7 -0
- data/doc/ex/shade.rb +11 -0
- data/doc/ex/shadow.rb +30 -0
- data/doc/ex/shave.rb +15 -0
- data/doc/ex/shear.rb +10 -0
- data/doc/ex/sketch.rb +17 -0
- data/doc/ex/skewx.rb +51 -0
- data/doc/ex/skewy.rb +47 -0
- data/doc/ex/smile.rb +125 -0
- data/doc/ex/solarize.rb +11 -0
- data/doc/ex/sparse_color.rb +54 -0
- data/doc/ex/splice.rb +8 -0
- data/doc/ex/spread.rb +11 -0
- data/doc/ex/stegano.rb +55 -0
- data/doc/ex/stroke_dasharray.rb +42 -0
- data/doc/ex/stroke_fill.rb +10 -0
- data/doc/ex/stroke_linecap.rb +44 -0
- data/doc/ex/stroke_linejoin.rb +48 -0
- data/doc/ex/stroke_width.rb +49 -0
- data/doc/ex/swirl.rb +17 -0
- data/doc/ex/text.rb +37 -0
- data/doc/ex/text01.rb +16 -0
- data/doc/ex/text_align.rb +36 -0
- data/doc/ex/text_antialias.rb +37 -0
- data/doc/ex/text_styles.rb +19 -0
- data/doc/ex/text_undercolor.rb +28 -0
- data/doc/ex/texture_fill_to_border.rb +34 -0
- data/doc/ex/texture_floodfill.rb +32 -0
- data/doc/ex/texturefill.rb +24 -0
- data/doc/ex/threshold.rb +13 -0
- data/doc/ex/to_blob.rb +13 -0
- data/doc/ex/translate.rb +39 -0
- data/doc/ex/transparent.rb +38 -0
- data/doc/ex/transpose.rb +9 -0
- data/doc/ex/transverse.rb +9 -0
- data/doc/ex/tref01.rb +24 -0
- data/doc/ex/triangle01.rb +15 -0
- data/doc/ex/trim.rb +23 -0
- data/doc/ex/tspan01.rb +17 -0
- data/doc/ex/tspan02.rb +17 -0
- data/doc/ex/tspan03.rb +19 -0
- data/doc/ex/unsharp_mask.rb +28 -0
- data/doc/ex/viewex.rb +33 -0
- data/doc/ex/vignette.rb +12 -0
- data/doc/ex/watermark.rb +27 -0
- data/doc/ex/wave.rb +9 -0
- data/doc/ex/wet_floor.rb +58 -0
- data/doc/ex/writing_mode01.rb +26 -0
- data/doc/ex/writing_mode02.rb +26 -0
- data/doc/ilist.html +2056 -0
- data/doc/image1.html +4680 -0
- data/doc/image2.html +3665 -0
- data/doc/image3.html +4522 -0
- data/doc/imageattrs.html +1638 -0
- data/doc/imusage.html +514 -0
- data/doc/index.html +416 -0
- data/doc/info.html +1499 -0
- data/doc/magick.html +565 -0
- data/doc/optequiv.html +2435 -0
- data/doc/rvg.html +975 -0
- data/doc/rvgclip.html +248 -0
- data/doc/rvggroup.html +305 -0
- data/doc/rvgimage.html +289 -0
- data/doc/rvgpattern.html +475 -0
- data/doc/rvgshape.html +406 -0
- data/doc/rvgstyle.html +270 -0
- data/doc/rvgtext.html +465 -0
- data/doc/rvgtspan.html +238 -0
- data/doc/rvgtut.html +530 -0
- data/doc/rvguse.html +145 -0
- data/doc/rvgxform.html +294 -0
- data/doc/scripts/doc.js +22 -0
- data/doc/scripts/stripeTables.js +23 -0
- data/doc/struct.html +1339 -0
- data/doc/usage.html +1621 -0
- data/examples/constitute.rb +7 -0
- data/examples/crop_with_gravity.rb +42 -0
- data/examples/demo.rb +324 -0
- data/examples/describe.rb +43 -0
- data/examples/find_similar_region.rb +34 -0
- data/examples/histogram.rb +321 -0
- data/examples/identify.rb +185 -0
- data/examples/image_opacity.rb +29 -0
- data/examples/import_export.rb +31 -0
- data/examples/pattern_fill.rb +38 -0
- data/examples/rotating_text.rb +44 -0
- data/examples/spinner.rb +49 -0
- data/examples/thumbnail.rb +64 -0
- data/examples/vignette.rb +78 -0
- data/ext/RMagick/extconf.rb +548 -0
- data/ext/RMagick/rmagick.c +401 -0
- data/ext/RMagick/rmagick.h +1287 -0
- data/ext/RMagick/rmdraw.c +2022 -0
- data/ext/RMagick/rmenum.c +1235 -0
- data/ext/RMagick/rmfill.c +720 -0
- data/ext/RMagick/rmilist.c +1270 -0
- data/ext/RMagick/rmimage.c +15427 -0
- data/ext/RMagick/rminfo.c +2590 -0
- data/ext/RMagick/rmmain.c +1741 -0
- data/ext/RMagick/rmmontage.c +519 -0
- data/ext/RMagick/rmpixel.c +1114 -0
- data/ext/RMagick/rmstruct.c +1124 -0
- data/ext/RMagick/rmutil.c +1754 -0
- data/lib/rmagick.rb +1 -0
- data/lib/rmagick/version.rb +6 -0
- data/lib/rmagick_internal.rb +1947 -0
- data/lib/rvg/clippath.rb +45 -0
- data/lib/rvg/container.rb +122 -0
- data/lib/rvg/deep_equal.rb +52 -0
- data/lib/rvg/describable.rb +47 -0
- data/lib/rvg/embellishable.rb +391 -0
- data/lib/rvg/misc.rb +723 -0
- data/lib/rvg/paint.rb +50 -0
- data/lib/rvg/pathdata.rb +126 -0
- data/lib/rvg/rvg.rb +283 -0
- data/lib/rvg/stretchable.rb +165 -0
- data/lib/rvg/stylable.rb +116 -0
- data/lib/rvg/text.rb +172 -0
- data/lib/rvg/transformable.rb +126 -0
- data/lib/rvg/units.rb +63 -0
- data/rmagick.gemspec +46 -0
- data/spec/rmagick/ImageList1_spec.rb +24 -0
- data/spec/rmagick/draw_spec.rb +156 -0
- data/spec/rmagick/image/blue_shift_spec.rb +16 -0
- data/spec/rmagick/image/composite_spec.rb +140 -0
- data/spec/rmagick/image/constitute_spec.rb +15 -0
- data/spec/rmagick/image/dispatch_spec.rb +18 -0
- data/spec/rmagick/image/from_blob_spec.rb +14 -0
- data/spec/rmagick/image/ping_spec.rb +14 -0
- data/spec/rmagick/image/properties_spec.rb +29 -0
- data/spec/spec_helper.rb +4 -0
- data/test/Image1.rb +565 -0
- data/test/Image2.rb +1304 -0
- data/test/Image3.rb +1030 -0
- data/test/ImageList1.rb +806 -0
- data/test/ImageList2.rb +385 -0
- data/test/Image_attributes.rb +697 -0
- data/test/Import_Export.rb +121 -0
- data/test/Info.rb +345 -0
- data/test/Magick.rb +321 -0
- data/test/Pixel.rb +116 -0
- data/test/Preview.rb +57 -0
- data/test/cmyk.icm +0 -0
- data/test/srgb.icm +0 -0
- data/test/test_all_basic.rb +38 -0
- data/test/tmpnam_test.rb +50 -0
- data/wercker.yml +10 -0
- 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
|
data/lib/rvg/stylable.rb
ADDED
@@ -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
|