rmagick 2.13.2 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rmagick might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.codeclimate.yml +63 -0
- data/.editorconfig +17 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/workflows/ci.yml +107 -0
- data/.gitignore +25 -0
- data/.rspec +2 -0
- data/.rubocop.yml +37 -0
- data/.rubocop_todo.yml +449 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +1277 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/CONTRIBUTING.md +81 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +324 -0
- data/Rakefile +190 -0
- data/before_install_linux.sh +69 -0
- data/before_install_osx.sh +57 -0
- data/deprecated/RMagick.rb +6 -0
- data/ext/RMagick/extconf.rb +334 -333
- data/ext/RMagick/rmagick.c +129 -127
- data/ext/RMagick/rmagick.h +221 -320
- data/ext/RMagick/rmdraw.c +458 -767
- data/ext/RMagick/rmenum.c +305 -752
- data/ext/RMagick/rmfill.c +231 -199
- data/ext/RMagick/rmilist.c +437 -478
- data/ext/RMagick/rmimage.c +6130 -5342
- data/ext/RMagick/rminfo.c +695 -833
- data/ext/RMagick/rmkinfo.c +198 -0
- data/ext/RMagick/rmmain.c +752 -506
- data/ext/RMagick/rmmontage.c +94 -152
- data/ext/RMagick/rmpixel.c +619 -425
- data/ext/RMagick/rmstruct.c +206 -309
- data/ext/RMagick/rmutil.c +514 -344
- data/lib/rmagick/version.rb +5 -0
- data/lib/rmagick.rb +1 -0
- data/lib/rmagick_internal.rb +1922 -0
- data/lib/rvg/clippath.rb +35 -39
- data/lib/rvg/container.rb +123 -124
- data/lib/rvg/deep_equal.rb +45 -49
- data/lib/rvg/describable.rb +41 -47
- data/lib/rvg/embellishable.rb +380 -411
- data/lib/rvg/misc.rb +691 -711
- data/lib/rvg/paint.rb +43 -47
- data/lib/rvg/pathdata.rb +119 -125
- data/lib/rvg/rvg.rb +214 -213
- data/lib/rvg/stretchable.rb +153 -162
- data/lib/rvg/stylable.rb +111 -117
- data/lib/rvg/text.rb +169 -180
- data/lib/rvg/transformable.rb +121 -127
- data/lib/rvg/units.rb +58 -61
- data/rmagick.gemspec +36 -16
- metadata +188 -365
- data/ChangeLog +0 -773
- data/Doxyfile +0 -1514
- data/README-Mac-OSX.txt +0 -1
- data/README.html +0 -10
- data/build_tarball.rake +0 -215
- data/doc/comtasks.html +0 -287
- data/doc/constants.html +0 -1581
- data/doc/css/doc.css +0 -299
- data/doc/css/popup.css +0 -34
- data/doc/css/ref.css +0 -67
- data/doc/draw.html +0 -3269
- data/doc/ex/InitialCoords.rb +0 -23
- data/doc/ex/NewCoordSys.rb +0 -32
- data/doc/ex/OrigCoordSys.rb +0 -18
- data/doc/ex/PreserveAspectRatio.rb +0 -205
- data/doc/ex/RotateScale.rb +0 -37
- data/doc/ex/Skew.rb +0 -38
- data/doc/ex/Use01.rb +0 -16
- data/doc/ex/Use02.rb +0 -21
- data/doc/ex/Use03.rb +0 -16
- data/doc/ex/ViewBox.rb +0 -33
- data/doc/ex/adaptive_threshold.rb +0 -10
- data/doc/ex/add_noise.rb +0 -17
- data/doc/ex/affine.rb +0 -48
- data/doc/ex/affine_transform.rb +0 -20
- data/doc/ex/arc.rb +0 -49
- data/doc/ex/arcpath.rb +0 -33
- data/doc/ex/arcs01.rb +0 -28
- data/doc/ex/arcs02.rb +0 -61
- data/doc/ex/average.rb +0 -15
- data/doc/ex/axes.rb +0 -64
- data/doc/ex/baseline_shift01.rb +0 -18
- data/doc/ex/bilevel_channel.rb +0 -9
- data/doc/ex/blur_image.rb +0 -12
- data/doc/ex/border.rb +0 -10
- data/doc/ex/bounding_box.rb +0 -44
- data/doc/ex/cbezier1.rb +0 -42
- data/doc/ex/cbezier2.rb +0 -42
- data/doc/ex/cbezier3.rb +0 -42
- data/doc/ex/cbezier4.rb +0 -43
- data/doc/ex/cbezier5.rb +0 -43
- data/doc/ex/cbezier6.rb +0 -53
- data/doc/ex/channel.rb +0 -26
- data/doc/ex/charcoal.rb +0 -12
- data/doc/ex/chop.rb +0 -29
- data/doc/ex/circle.rb +0 -33
- data/doc/ex/circle01.rb +0 -17
- data/doc/ex/clip_path.rb +0 -60
- data/doc/ex/coalesce.rb +0 -60
- data/doc/ex/color_fill_to_border.rb +0 -29
- data/doc/ex/color_floodfill.rb +0 -28
- data/doc/ex/color_histogram.rb +0 -48
- data/doc/ex/color_reset.rb +0 -11
- data/doc/ex/colorize.rb +0 -16
- data/doc/ex/colors.rb +0 -64
- data/doc/ex/compose_mask.rb +0 -23
- data/doc/ex/composite.rb +0 -135
- data/doc/ex/composite_layers.rb +0 -53
- data/doc/ex/composite_tiled.rb +0 -23
- data/doc/ex/contrast.rb +0 -36
- data/doc/ex/crop.rb +0 -31
- data/doc/ex/crop_with_gravity.rb +0 -46
- data/doc/ex/cubic01.rb +0 -45
- data/doc/ex/cubic02.rb +0 -94
- data/doc/ex/cycle_colormap.rb +0 -21
- data/doc/ex/dissolve.rb +0 -13
- data/doc/ex/drawcomp.rb +0 -42
- data/doc/ex/drop_shadow.rb +0 -60
- data/doc/ex/edge.rb +0 -11
- data/doc/ex/ellipse.rb +0 -45
- data/doc/ex/ellipse01.rb +0 -22
- data/doc/ex/emboss.rb +0 -11
- data/doc/ex/enhance.rb +0 -28
- data/doc/ex/equalize.rb +0 -11
- data/doc/ex/evenodd.rb +0 -43
- data/doc/ex/fill_pattern.rb +0 -26
- data/doc/ex/flatten_images.rb +0 -36
- data/doc/ex/flip.rb +0 -11
- data/doc/ex/flop.rb +0 -11
- data/doc/ex/font_styles.rb +0 -34
- data/doc/ex/fonts.rb +0 -20
- data/doc/ex/frame.rb +0 -12
- data/doc/ex/gaussian_blur.rb +0 -11
- data/doc/ex/get_multiline_type_metrics.rb +0 -42
- data/doc/ex/get_pixels.rb +0 -48
- data/doc/ex/get_type_metrics.rb +0 -146
- data/doc/ex/gradientfill.rb +0 -27
- data/doc/ex/grav.rb +0 -46
- data/doc/ex/gravity.rb +0 -79
- data/doc/ex/group.rb +0 -26
- data/doc/ex/hatchfill.rb +0 -27
- data/doc/ex/image.rb +0 -46
- 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/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 +0 -34
- data/doc/ex/level.rb +0 -11
- data/doc/ex/level_colors.rb +0 -11
- data/doc/ex/line.rb +0 -42
- data/doc/ex/line01.rb +0 -23
- data/doc/ex/mask.rb +0 -36
- data/doc/ex/matte_fill_to_border.rb +0 -40
- data/doc/ex/matte_floodfill.rb +0 -33
- data/doc/ex/matte_replace.rb +0 -40
- data/doc/ex/median_filter.rb +0 -28
- data/doc/ex/modulate.rb +0 -11
- data/doc/ex/mono.rb +0 -23
- data/doc/ex/morph.rb +0 -26
- data/doc/ex/mosaic.rb +0 -35
- data/doc/ex/motion_blur.rb +0 -11
- data/doc/ex/negate.rb +0 -11
- data/doc/ex/negate_channel.rb +0 -9
- data/doc/ex/nested_rvg.rb +0 -21
- data/doc/ex/nonzero.rb +0 -43
- data/doc/ex/normalize.rb +0 -11
- data/doc/ex/oil_paint.rb +0 -11
- data/doc/ex/opacity.rb +0 -37
- data/doc/ex/ordered_dither.rb +0 -11
- data/doc/ex/path.rb +0 -64
- data/doc/ex/pattern1.rb +0 -25
- data/doc/ex/pattern2.rb +0 -26
- data/doc/ex/polaroid.rb +0 -28
- data/doc/ex/polygon.rb +0 -24
- data/doc/ex/polygon01.rb +0 -23
- data/doc/ex/polyline.rb +0 -23
- data/doc/ex/polyline01.rb +0 -23
- data/doc/ex/posterize.rb +0 -8
- data/doc/ex/preview.rb +0 -9
- data/doc/ex/qbezierpath.rb +0 -52
- data/doc/ex/quad01.rb +0 -36
- data/doc/ex/quantize-m.rb +0 -25
- data/doc/ex/radial_blur.rb +0 -9
- data/doc/ex/raise.rb +0 -8
- data/doc/ex/random_threshold_channel.rb +0 -13
- data/doc/ex/rect01.rb +0 -15
- data/doc/ex/rect02.rb +0 -22
- data/doc/ex/rectangle.rb +0 -35
- data/doc/ex/reduce_noise.rb +0 -28
- data/doc/ex/remap.rb +0 -12
- data/doc/ex/remap_images.rb +0 -21
- data/doc/ex/resize_to_fill.rb +0 -10
- data/doc/ex/resize_to_fit.rb +0 -10
- data/doc/ex/roll.rb +0 -9
- data/doc/ex/rotate.rb +0 -45
- data/doc/ex/rotate_f.rb +0 -14
- data/doc/ex/roundrect.rb +0 -34
- data/doc/ex/rubyname.rb +0 -30
- data/doc/ex/rvg_clippath.rb +0 -14
- data/doc/ex/rvg_linecap.rb +0 -43
- data/doc/ex/rvg_linejoin.rb +0 -41
- data/doc/ex/rvg_opacity.rb +0 -19
- data/doc/ex/rvg_pattern.rb +0 -26
- data/doc/ex/rvg_stroke_dasharray.rb +0 -12
- data/doc/ex/segment.rb +0 -11
- data/doc/ex/sepiatone.rb +0 -8
- data/doc/ex/shade.rb +0 -11
- data/doc/ex/shadow.rb +0 -31
- data/doc/ex/shave.rb +0 -15
- data/doc/ex/shear.rb +0 -10
- data/doc/ex/sketch.rb +0 -18
- data/doc/ex/skewx.rb +0 -52
- data/doc/ex/skewy.rb +0 -47
- data/doc/ex/smile.rb +0 -125
- data/doc/ex/solarize.rb +0 -11
- data/doc/ex/sparse_color.rb +0 -55
- data/doc/ex/splice.rb +0 -9
- data/doc/ex/spread.rb +0 -11
- data/doc/ex/stegano.rb +0 -55
- data/doc/ex/stroke_dasharray.rb +0 -43
- data/doc/ex/stroke_fill.rb +0 -11
- data/doc/ex/stroke_linecap.rb +0 -44
- data/doc/ex/stroke_linejoin.rb +0 -48
- data/doc/ex/stroke_width.rb +0 -49
- data/doc/ex/swirl.rb +0 -17
- data/doc/ex/text.rb +0 -37
- data/doc/ex/text01.rb +0 -17
- data/doc/ex/text_align.rb +0 -36
- data/doc/ex/text_antialias.rb +0 -38
- data/doc/ex/text_styles.rb +0 -21
- data/doc/ex/text_undercolor.rb +0 -28
- data/doc/ex/texture_fill_to_border.rb +0 -34
- data/doc/ex/texture_floodfill.rb +0 -32
- data/doc/ex/texturefill.rb +0 -25
- data/doc/ex/threshold.rb +0 -13
- data/doc/ex/to_blob.rb +0 -14
- data/doc/ex/translate.rb +0 -39
- data/doc/ex/transparent.rb +0 -38
- data/doc/ex/transpose.rb +0 -9
- data/doc/ex/transverse.rb +0 -9
- data/doc/ex/tref01.rb +0 -25
- data/doc/ex/triangle01.rb +0 -16
- data/doc/ex/trim.rb +0 -24
- data/doc/ex/tspan01.rb +0 -18
- data/doc/ex/tspan02.rb +0 -19
- data/doc/ex/tspan03.rb +0 -21
- data/doc/ex/unsharp_mask.rb +0 -28
- data/doc/ex/viewex.rb +0 -35
- data/doc/ex/vignette.rb +0 -12
- data/doc/ex/watermark.rb +0 -28
- data/doc/ex/wave.rb +0 -9
- data/doc/ex/wet_floor.rb +0 -59
- data/doc/ex/writing_mode01.rb +0 -27
- data/doc/ex/writing_mode02.rb +0 -26
- data/doc/ilist.html +0 -2056
- data/doc/image1.html +0 -4680
- data/doc/image2.html +0 -3665
- data/doc/image3.html +0 -4522
- data/doc/imageattrs.html +0 -1638
- data/doc/imusage.html +0 -514
- data/doc/index.html +0 -416
- data/doc/info.html +0 -1499
- data/doc/magick.html +0 -565
- data/doc/optequiv.html +0 -2435
- data/doc/rvg.html +0 -975
- data/doc/rvgclip.html +0 -248
- data/doc/rvggroup.html +0 -305
- data/doc/rvgimage.html +0 -289
- data/doc/rvgpattern.html +0 -475
- data/doc/rvgshape.html +0 -406
- data/doc/rvgstyle.html +0 -270
- data/doc/rvgtext.html +0 -465
- data/doc/rvgtspan.html +0 -238
- data/doc/rvgtut.html +0 -530
- data/doc/rvguse.html +0 -145
- data/doc/rvgxform.html +0 -294
- data/doc/scripts/doc.js +0 -22
- data/doc/scripts/stripeTables.js +0 -23
- data/doc/struct.html +0 -1339
- data/doc/usage.html +0 -1621
- data/examples/constitute.rb +0 -7
- data/examples/crop_with_gravity.rb +0 -46
- data/examples/demo.rb +0 -324
- data/examples/describe.rb +0 -44
- data/examples/find_similar_region.rb +0 -34
- data/examples/histogram.rb +0 -325
- data/examples/identify.rb +0 -187
- data/examples/image_opacity.rb +0 -29
- data/examples/import_export.rb +0 -31
- data/examples/pattern_fill.rb +0 -38
- data/examples/rotating_text.rb +0 -45
- data/examples/spinner.rb +0 -50
- data/examples/thumbnail.rb +0 -65
- data/examples/vignette.rb +0 -79
- data/ext/RMagick/MANIFEST +0 -358
- data/lib/RMagick.rb +0 -1962
- data/metaconfig +0 -7
- data/post-clean.rb +0 -12
- data/post-install.rb +0 -50
- data/post-setup.rb +0 -254
- data/setup.rb +0 -1585
- data/uninstall.rb +0 -76
data/lib/rvg/text.rb
CHANGED
@@ -3,185 +3,174 @@
|
|
3
3
|
# Copyright (C) 2009 Timothy P. Hunter
|
4
4
|
#++
|
5
5
|
# Text-related classes
|
6
|
-
|
7
6
|
module Magick
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
# block.
|
178
|
-
def text(x=0, y=0, text=nil, &block)
|
179
|
-
t = Text.new(x, y, text, &block)
|
180
|
-
@content << t
|
181
|
-
return t
|
182
|
-
end
|
183
|
-
|
184
|
-
end # module TextConstructors
|
185
|
-
|
186
|
-
end # class RVG
|
7
|
+
class RVG
|
8
|
+
# Base class for Tspan, Tref and Text.
|
9
|
+
class TextBase
|
10
|
+
include Stylable
|
11
|
+
include Duplicatable
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def initialize(text)
|
16
|
+
super()
|
17
|
+
@text = text.to_s if text
|
18
|
+
@dx = @dy = 0
|
19
|
+
@rotation = 0
|
20
|
+
@tspans = Content.new
|
21
|
+
yield(self) if block_given?
|
22
|
+
end
|
23
|
+
|
24
|
+
public
|
25
|
+
|
26
|
+
# Create a new text chunk. Each chunk can have its own initial position and styles.
|
27
|
+
# If <tt>x</tt> and <tt>y</tt> are omitted the text starts at the current text
|
28
|
+
# position.
|
29
|
+
def tspan(text, x = nil, y = nil)
|
30
|
+
tspan = Tspan.new(text, x, y)
|
31
|
+
tspan.parent = self
|
32
|
+
@tspans << tspan
|
33
|
+
tspan
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add <tt>x</tt> and <tt>y</tt> to the current text position.
|
37
|
+
def d(x, y = 0)
|
38
|
+
@dx, @dy = Magick::RVG.convert_to_float(x, y)
|
39
|
+
yield(self) if block_given?
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
# Rotate the text about the current text position.
|
44
|
+
def rotate(degrees)
|
45
|
+
@rotation = Magick::RVG.convert_to_float(degrees)[0]
|
46
|
+
yield(self) if block_given?
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
# We do our own transformations.
|
51
|
+
# @private
|
52
|
+
def add_primitives(gc)
|
53
|
+
return if !@text && @tspans.empty?
|
54
|
+
|
55
|
+
gc.push
|
56
|
+
x = cx + @dx
|
57
|
+
y = cy + @dy
|
58
|
+
if @rotation != 0
|
59
|
+
gc.translate(x, y)
|
60
|
+
gc.rotate(@rotation)
|
61
|
+
gc.translate(-x, -y)
|
62
|
+
end
|
63
|
+
add_style_primitives(gc)
|
64
|
+
if @text
|
65
|
+
x2, y2 = gc.text(x, y, @text)
|
66
|
+
self.cx = x + x2
|
67
|
+
self.cy = y + y2
|
68
|
+
end
|
69
|
+
@tspans.each do |tspan|
|
70
|
+
tspan.add_primitives(gc)
|
71
|
+
end
|
72
|
+
gc.pop
|
73
|
+
end
|
74
|
+
end # class TextBase
|
75
|
+
|
76
|
+
# Tspan and Tref shared methods - read/update @cx, @cy in parent Text object.
|
77
|
+
# @private
|
78
|
+
module TextLink
|
79
|
+
def add_primitives(gc)
|
80
|
+
@parent.cx = @x if @x
|
81
|
+
@parent.cy = @y if @y
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
def cx
|
86
|
+
@parent.cx
|
87
|
+
end
|
88
|
+
|
89
|
+
def cy
|
90
|
+
@parent.cy
|
91
|
+
end
|
92
|
+
|
93
|
+
def cx=(x)
|
94
|
+
@parent.cx = x
|
95
|
+
end
|
96
|
+
|
97
|
+
def cy=(y)
|
98
|
+
@parent.cy = y
|
99
|
+
end
|
100
|
+
end # module TextLink
|
101
|
+
|
102
|
+
# @private
|
103
|
+
class Tref < TextBase
|
104
|
+
include TextLink
|
105
|
+
|
106
|
+
def initialize(obj, x, y, parent)
|
107
|
+
@x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
|
108
|
+
super(nil)
|
109
|
+
@tspans << obj
|
110
|
+
@parent = parent
|
111
|
+
end
|
112
|
+
end # class Tref
|
113
|
+
|
114
|
+
# @private
|
115
|
+
class Tspan < TextBase
|
116
|
+
include TextLink
|
117
|
+
|
118
|
+
attr_accessor :parent
|
119
|
+
|
120
|
+
# Define a text segment starting at (<tt>x</tt>, <tt>y</tt>).
|
121
|
+
# If <tt>x</tt> and <tt>y</tt> are omitted the segment starts
|
122
|
+
# at the current text position.
|
123
|
+
#
|
124
|
+
# Tspan objects can contain Tspan objects.
|
125
|
+
def initialize(text = nil, x = nil, y = nil, &block)
|
126
|
+
@x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil)
|
127
|
+
super(text, &block)
|
128
|
+
end
|
129
|
+
end # class Tspan
|
130
|
+
|
131
|
+
class Text < TextBase
|
132
|
+
# @private
|
133
|
+
attr_accessor :cx, :cy
|
134
|
+
|
135
|
+
# Define a text string starting at [<tt>x</tt>, <tt>y</tt>].
|
136
|
+
# Use the RVG::TextConstructors#text method to create Text objects in a container.
|
137
|
+
#
|
138
|
+
# container.text(100, 100, "Simple text").styles(:font=>'Arial')
|
139
|
+
#
|
140
|
+
# Text objects can contain Tspan objects.
|
141
|
+
#
|
142
|
+
# container.text(100, 100).styles(:font=>'Arial') do |t|
|
143
|
+
# t.tspan("Red text").styles(:fill=>'red')
|
144
|
+
# t.tspan("Blue text").styles(:fill=>'blue')
|
145
|
+
# end
|
146
|
+
def initialize(x = 0, y = 0, text = nil, &block)
|
147
|
+
@cx, @cy = Magick::RVG.convert_to_float(x, y)
|
148
|
+
super(text, &block)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Reference a Tspan object. <tt>x</tt> and <tt>y</tt> are just
|
152
|
+
# like <tt>x</tt> and <tt>y</tt> in RVG::TextBase#tspan
|
153
|
+
def tref(obj, x = nil, y = nil)
|
154
|
+
raise ArgumentError, "wrong argument type #{obj.class} (expected Tspan)" unless obj.is_a?(Tspan)
|
155
|
+
|
156
|
+
obj = obj.deep_copy
|
157
|
+
obj.parent = self
|
158
|
+
tref = Tref.new(obj, x, y, self)
|
159
|
+
@tspans << tref
|
160
|
+
tref
|
161
|
+
end
|
162
|
+
end # class Text
|
163
|
+
|
164
|
+
# Methods that construct text objects within a container
|
165
|
+
module TextConstructors
|
166
|
+
# Draw a text string at (<tt>x</tt>,<tt>y</tt>). The string can
|
167
|
+
# be omitted. Optionally, define text chunks within the associated
|
168
|
+
# block.
|
169
|
+
def text(x = 0, y = 0, text = nil, &block)
|
170
|
+
t = Text.new(x, y, text, &block)
|
171
|
+
@content << t
|
172
|
+
t
|
173
|
+
end
|
174
|
+
end # module TextConstructors
|
175
|
+
end # class RVG
|
187
176
|
end # module Magick
|
data/lib/rvg/transformable.rb
CHANGED
@@ -2,132 +2,126 @@
|
|
2
2
|
# $Id: transformable.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
|
3
3
|
# Copyright (C) 2009 Timothy P. Hunter
|
4
4
|
#++
|
5
|
-
|
6
5
|
module Magick
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
end # module Transformable
|
130
|
-
|
131
|
-
end # class RVG
|
6
|
+
class RVG
|
7
|
+
# Transforms is an Array with a deep_copy method.
|
8
|
+
# During unit-testing it also has a deep_equal method.
|
9
|
+
# @private
|
10
|
+
class Transforms < Array
|
11
|
+
def deep_copy(_h = nil)
|
12
|
+
copy = self.class.new
|
13
|
+
each { |transform| copy << [transform[0], transform[1].dup] }
|
14
|
+
copy
|
15
|
+
end
|
16
|
+
end # class Transform
|
17
|
+
|
18
|
+
# Transformations are operations on the coordinate system.
|
19
|
+
# All the transformations defined within a container (an RVG object
|
20
|
+
# or a group) are applied before drawing any shapes or text.
|
21
|
+
# All transformations are applied in the order they were
|
22
|
+
# defined. <em>Note:</em> This means that
|
23
|
+
# g.translate(10,20).scale(2)
|
24
|
+
# is not the same as
|
25
|
+
# g.scale(2).translate(10,20)
|
26
|
+
module Transformable
|
27
|
+
private
|
28
|
+
|
29
|
+
# Apply transforms in the same order they were specified!
|
30
|
+
def add_transform_primitives(gc)
|
31
|
+
@transforms.each { |transform| gc.__send__(transform[0], *transform[1]) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(*_args)
|
35
|
+
super()
|
36
|
+
@transforms = Transforms.new
|
37
|
+
end
|
38
|
+
|
39
|
+
public
|
40
|
+
|
41
|
+
# Applies the transformation matrix [sx, rx, ry, sy, tx, ty]
|
42
|
+
def matrix(sx, rx, ry, sy, tx, ty)
|
43
|
+
begin
|
44
|
+
@transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]]
|
45
|
+
rescue ArgumentError
|
46
|
+
raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})"
|
47
|
+
end
|
48
|
+
yield(self) if block_given?
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Add <tt>tx</tt> to all x-coordinates and <tt>ty</tt>
|
53
|
+
# to all y-coordinates. If <tt>ty</tt> is omitted it defaults
|
54
|
+
# to <tt>tx</tt>.
|
55
|
+
def translate(tx, ty = nil)
|
56
|
+
ty ||= tx
|
57
|
+
begin
|
58
|
+
@transforms << [:translate, [Float(tx), Float(ty)]]
|
59
|
+
rescue ArgumentError
|
60
|
+
raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})"
|
61
|
+
end
|
62
|
+
yield(self) if block_given?
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# Multiply the x-coordinates by <tt>sx</tt> and the y-coordinates
|
67
|
+
# by <tt>sy</tt>. If <tt>sy</tt> is omitted it defaults to <tt>sx</tt>.
|
68
|
+
def scale(sx, sy = nil)
|
69
|
+
sy ||= sx
|
70
|
+
begin
|
71
|
+
@transforms << [:scale, [Float(sx), Float(sy)]]
|
72
|
+
rescue ArgumentError
|
73
|
+
raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})"
|
74
|
+
end
|
75
|
+
yield(self) if block_given?
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# This method can take either of two argument lists:
|
80
|
+
# [rotate(angle)] rotate by <tt>angle</tt> degrees
|
81
|
+
# [rotate(angle, cx, cy)] rotate by <tt>angle</tt> degrees about
|
82
|
+
# the point [<tt>cx</tt>, <tt>cy</tt>].
|
83
|
+
def rotate(angle, *args)
|
84
|
+
begin
|
85
|
+
case args.length
|
86
|
+
when 0
|
87
|
+
@transforms << [:rotate, [Float(angle)]]
|
88
|
+
when 2
|
89
|
+
cx = Float(args[0])
|
90
|
+
cy = Float(args[1])
|
91
|
+
@transforms << [:translate, [cx, cy]]
|
92
|
+
@transforms << [:rotate, [angle]]
|
93
|
+
@transforms << [:translate, [-cx, -cy]]
|
94
|
+
else
|
95
|
+
raise ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
|
96
|
+
end
|
97
|
+
rescue ArgumentError
|
98
|
+
raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].map(&:class).join(', ')})"
|
99
|
+
end
|
100
|
+
yield(self) if block_given?
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
# Skew the X-axis by <tt>angle</tt> degrees.
|
105
|
+
def skewX(angle)
|
106
|
+
begin
|
107
|
+
@transforms << [:skewx, [Float(angle)]]
|
108
|
+
rescue ArgumentError
|
109
|
+
raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
|
110
|
+
end
|
111
|
+
yield(self) if block_given?
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
# Skew the Y-axis by <tt>angle</tt> degrees.
|
116
|
+
def skewY(angle)
|
117
|
+
begin
|
118
|
+
@transforms << [:skewy, [Float(angle)]]
|
119
|
+
rescue ArgumentError
|
120
|
+
raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
|
121
|
+
end
|
122
|
+
yield(self) if block_given?
|
123
|
+
self
|
124
|
+
end
|
125
|
+
end # module Transformable
|
126
|
+
end # class RVG
|
132
127
|
end # module Magick
|
133
|
-
|