rmagick 2.16.0 → 5.1.0
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 +5 -5
- data/.codeclimate.yml +63 -0
- data/.devcontainer/Dockerfile +14 -0
- data/.devcontainer/ImageMagick6/devcontainer.json +11 -0
- data/.devcontainer/devcontainer.json +11 -0
- data/.devcontainer/setup-repo.sh +10 -0
- data/.devcontainer/setup-user.sh +45 -0
- data/.editorconfig +3 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/workflows/ci.yml +79 -0
- data/.gitignore +5 -1
- data/.rspec +1 -0
- data/.rubocop.yml +37 -340
- data/.rubocop_todo.yml +448 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +435 -0
- data/CODE_OF_CONDUCT.md +122 -7
- data/CONTRIBUTING.md +37 -6
- data/Gemfile +0 -6
- data/README.md +317 -0
- data/Rakefile +37 -35
- data/before_install_linux.sh +65 -28
- data/before_install_osx.sh +58 -2
- data/ext/RMagick/extconf.rb +286 -393
- data/ext/RMagick/rmagick.c +106 -111
- data/ext/RMagick/rmagick.h +235 -331
- data/ext/RMagick/rmagick_gvl.h +224 -0
- data/ext/RMagick/rmdraw.c +484 -842
- data/ext/RMagick/rmenum.c +316 -755
- data/ext/RMagick/rmfill.c +281 -191
- data/ext/RMagick/rmilist.c +450 -455
- data/ext/RMagick/rmimage.c +6247 -5289
- data/ext/RMagick/rminfo.c +721 -894
- data/ext/RMagick/rmkinfo.c +228 -0
- data/ext/RMagick/rmmain.c +727 -519
- data/ext/RMagick/rmmontage.c +127 -172
- data/ext/RMagick/rmpixel.c +638 -431
- data/ext/RMagick/rmstruct.c +102 -282
- data/ext/RMagick/rmutil.c +450 -363
- data/lib/rmagick/version.rb +5 -4
- data/lib/rmagick.rb +2 -0
- data/lib/rmagick_internal.rb +349 -413
- data/lib/rvg/clippath.rb +3 -4
- data/lib/rvg/container.rb +30 -22
- data/lib/rvg/deep_equal.rb +11 -11
- data/lib/rvg/describable.rb +2 -2
- data/lib/rvg/embellishable.rb +63 -68
- data/lib/rvg/misc.rb +136 -139
- data/lib/rvg/paint.rb +2 -1
- data/lib/rvg/pathdata.rb +7 -8
- data/lib/rvg/rvg.rb +47 -46
- data/lib/rvg/stretchable.rb +22 -28
- data/lib/rvg/stylable.rb +12 -10
- data/lib/rvg/text.rb +169 -165
- data/lib/rvg/transformable.rb +17 -16
- data/lib/rvg/units.rb +5 -5
- data/rmagick.gemspec +16 -39
- metadata +118 -395
- data/.hound.yml +0 -2
- data/.simplecov +0 -27
- data/.travis.yml +0 -74
- data/Doxyfile +0 -1514
- data/README.textile +0 -251
- data/deprecated/RMagick.rb +0 -6
- data/doc/.cvsignore +0 -1
- 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 -3272
- data/doc/ex/InitialCoords.rb +0 -22
- data/doc/ex/NewCoordSys.rb +0 -30
- data/doc/ex/OrigCoordSys.rb +0 -16
- data/doc/ex/PreserveAspectRatio.rb +0 -204
- data/doc/ex/RotateScale.rb +0 -36
- data/doc/ex/Skew.rb +0 -38
- data/doc/ex/Use01.rb +0 -15
- data/doc/ex/Use02.rb +0 -20
- data/doc/ex/Use03.rb +0 -16
- data/doc/ex/ViewBox.rb +0 -31
- data/doc/ex/adaptive_threshold.rb +0 -9
- data/doc/ex/add_noise.rb +0 -16
- 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 -32
- data/doc/ex/arcs01.rb +0 -28
- data/doc/ex/arcs02.rb +0 -59
- data/doc/ex/average.rb +0 -15
- data/doc/ex/axes.rb +0 -64
- data/doc/ex/baseline_shift01.rb +0 -17
- data/doc/ex/bilevel_channel.rb +0 -8
- data/doc/ex/blur_image.rb +0 -12
- data/doc/ex/border.rb +0 -10
- data/doc/ex/bounding_box.rb +0 -42
- data/doc/ex/cbezier1.rb +0 -41
- data/doc/ex/cbezier2.rb +0 -41
- data/doc/ex/cbezier3.rb +0 -41
- data/doc/ex/cbezier4.rb +0 -42
- data/doc/ex/cbezier5.rb +0 -42
- data/doc/ex/cbezier6.rb +0 -53
- data/doc/ex/channel.rb +0 -25
- 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 -16
- data/doc/ex/clip_path.rb +0 -60
- data/doc/ex/coalesce.rb +0 -57
- 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 -47
- 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 -22
- data/doc/ex/composite.rb +0 -133
- data/doc/ex/composite_layers.rb +0 -53
- data/doc/ex/composite_tiled.rb +0 -21
- data/doc/ex/contrast.rb +0 -36
- data/doc/ex/crop.rb +0 -31
- data/doc/ex/crop_with_gravity.rb +0 -42
- data/doc/ex/cubic01.rb +0 -43
- data/doc/ex/cubic02.rb +0 -91
- data/doc/ex/cycle_colormap.rb +0 -21
- data/doc/ex/dissolve.rb +0 -12
- 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 -21
- 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 -42
- data/doc/ex/fill_pattern.rb +0 -23
- 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 -32
- 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 -41
- data/doc/ex/get_pixels.rb +0 -47
- data/doc/ex/get_type_metrics.rb +0 -141
- data/doc/ex/gradientfill.rb +0 -27
- data/doc/ex/grav.rb +0 -45
- data/doc/ex/gravity.rb +0 -80
- data/doc/ex/group.rb +0 -26
- data/doc/ex/hatchfill.rb +0 -27
- data/doc/ex/image.rb +0 -44
- 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 +0 -34
- data/doc/ex/level.rb +0 -11
- data/doc/ex/level_colors.rb +0 -11
- data/doc/ex/line.rb +0 -41
- data/doc/ex/line01.rb +0 -21
- data/doc/ex/mask.rb +0 -35
- data/doc/ex/matte_fill_to_border.rb +0 -39
- data/doc/ex/matte_floodfill.rb +0 -32
- data/doc/ex/matte_replace.rb +0 -39
- 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 -25
- 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 -42
- 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 -63
- data/doc/ex/pattern1.rb +0 -25
- data/doc/ex/pattern2.rb +0 -26
- data/doc/ex/polaroid.rb +0 -27
- data/doc/ex/polygon.rb +0 -23
- data/doc/ex/polygon01.rb +0 -21
- data/doc/ex/polyline.rb +0 -22
- data/doc/ex/polyline01.rb +0 -21
- data/doc/ex/posterize.rb +0 -8
- data/doc/ex/preview.rb +0 -8
- data/doc/ex/qbezierpath.rb +0 -52
- data/doc/ex/quad01.rb +0 -34
- 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 -14
- data/doc/ex/rect02.rb +0 -20
- data/doc/ex/rectangle.rb +0 -34
- data/doc/ex/reduce_noise.rb +0 -28
- data/doc/ex/remap.rb +0 -11
- data/doc/ex/remap_images.rb +0 -19
- data/doc/ex/resize_to_fill.rb +0 -8
- data/doc/ex/resize_to_fit.rb +0 -8
- data/doc/ex/roll.rb +0 -9
- data/doc/ex/rotate.rb +0 -44
- data/doc/ex/rotate_f.rb +0 -14
- data/doc/ex/roundrect.rb +0 -33
- data/doc/ex/rubyname.rb +0 -30
- data/doc/ex/rvg_clippath.rb +0 -12
- data/doc/ex/rvg_linecap.rb +0 -42
- data/doc/ex/rvg_linejoin.rb +0 -40
- data/doc/ex/rvg_opacity.rb +0 -18
- data/doc/ex/rvg_pattern.rb +0 -26
- data/doc/ex/rvg_stroke_dasharray.rb +0 -11
- data/doc/ex/segment.rb +0 -11
- data/doc/ex/sepiatone.rb +0 -7
- data/doc/ex/shade.rb +0 -11
- data/doc/ex/shadow.rb +0 -30
- data/doc/ex/shave.rb +0 -15
- data/doc/ex/shear.rb +0 -10
- data/doc/ex/sketch.rb +0 -17
- data/doc/ex/skewx.rb +0 -51
- 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 -54
- data/doc/ex/splice.rb +0 -8
- data/doc/ex/spread.rb +0 -11
- data/doc/ex/stegano.rb +0 -55
- data/doc/ex/stroke_dasharray.rb +0 -42
- data/doc/ex/stroke_fill.rb +0 -10
- 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 -16
- data/doc/ex/text_align.rb +0 -36
- data/doc/ex/text_antialias.rb +0 -37
- data/doc/ex/text_styles.rb +0 -19
- 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 -24
- data/doc/ex/threshold.rb +0 -13
- data/doc/ex/to_blob.rb +0 -13
- 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 -24
- data/doc/ex/triangle01.rb +0 -15
- data/doc/ex/trim.rb +0 -23
- data/doc/ex/tspan01.rb +0 -17
- data/doc/ex/tspan02.rb +0 -17
- data/doc/ex/tspan03.rb +0 -19
- data/doc/ex/unsharp_mask.rb +0 -28
- data/doc/ex/viewex.rb +0 -33
- data/doc/ex/vignette.rb +0 -12
- data/doc/ex/watermark.rb +0 -27
- data/doc/ex/wave.rb +0 -9
- data/doc/ex/wet_floor.rb +0 -58
- data/doc/ex/writing_mode01.rb +0 -26
- 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 -42
- data/examples/demo.rb +0 -324
- data/examples/describe.rb +0 -43
- data/examples/find_similar_region.rb +0 -34
- data/examples/histogram.rb +0 -321
- data/examples/identify.rb +0 -185
- 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 -44
- data/examples/spinner.rb +0 -49
- data/examples/thumbnail.rb +0 -64
- data/examples/vignette.rb +0 -78
- data/spec/rmagick/ImageList1_spec.rb +0 -24
- data/spec/rmagick/draw_spec.rb +0 -156
- data/spec/rmagick/image/blue_shift_spec.rb +0 -16
- data/spec/rmagick/image/composite_spec.rb +0 -140
- data/spec/rmagick/image/constitute_spec.rb +0 -15
- data/spec/rmagick/image/dispatch_spec.rb +0 -18
- data/spec/rmagick/image/from_blob_spec.rb +0 -14
- data/spec/rmagick/image/ping_spec.rb +0 -14
- data/spec/rmagick/image/properties_spec.rb +0 -29
- data/spec/spec_helper.rb +0 -4
- data/test/Image1.rb +0 -565
- data/test/Image2.rb +0 -1304
- data/test/Image3.rb +0 -1030
- data/test/ImageList1.rb +0 -806
- data/test/ImageList2.rb +0 -385
- data/test/Image_attributes.rb +0 -697
- data/test/Import_Export.rb +0 -121
- data/test/Info.rb +0 -345
- data/test/Magick.rb +0 -321
- data/test/Pixel.rb +0 -116
- data/test/Preview.rb +0 -57
- data/test/cmyk.icm +0 -0
- data/test/srgb.icm +0 -0
- data/test/test_all_basic.rb +0 -38
- data/test/tmpnam_test.rb +0 -50
- data/wercker.yml +0 -10
data/lib/rvg/misc.rb
CHANGED
@@ -14,29 +14,27 @@ module Magick
|
|
14
14
|
ivars = instance_variables
|
15
15
|
ivars.each do |ivar|
|
16
16
|
ivalue = instance_variable_get(ivar)
|
17
|
-
cvalue =
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
ivalue
|
27
|
-
end
|
17
|
+
cvalue = if ivalue.is_a?(NilClass) || ivalue.is_a?(Symbol) || ivalue.is_a?(Float) || ivalue.is_a?(Integer) || ivalue.is_a?(FalseClass) || ivalue.is_a?(TrueClass)
|
18
|
+
ivalue
|
19
|
+
elsif ivalue.respond_to?(:deep_copy)
|
20
|
+
ivalue.deep_copy(h)
|
21
|
+
elsif ivalue.respond_to?(:dup)
|
22
|
+
ivalue.dup
|
23
|
+
else
|
24
|
+
ivalue
|
25
|
+
end
|
28
26
|
copy.instance_variable_set(ivar, cvalue)
|
29
27
|
end
|
30
28
|
copy.freeze if frozen?
|
31
29
|
end
|
32
30
|
copy
|
33
31
|
end
|
34
|
-
end
|
32
|
+
end # module Duplicatable
|
35
33
|
|
36
34
|
# Convert an array of method arguments to Float objects. If any
|
37
35
|
# cannot be converted, raise ArgumentError and issue a message.
|
38
36
|
def self.fmsg(*args)
|
39
|
-
"at least one argument cannot be converted to Float (got #{args.
|
37
|
+
"at least one argument cannot be converted to Float (got #{args.map(&:class).join(', ')})"
|
40
38
|
end
|
41
39
|
|
42
40
|
def self.convert_to_float(*args)
|
@@ -46,7 +44,7 @@ module Magick
|
|
46
44
|
args.pop
|
47
45
|
end
|
48
46
|
begin
|
49
|
-
fargs = args.
|
47
|
+
fargs = args.map { |a| allow_nil && a.nil? ? a : Float(a) }
|
50
48
|
rescue ArgumentError, TypeError
|
51
49
|
raise ArgumentError, fmsg(*args)
|
52
50
|
end
|
@@ -74,16 +72,16 @@ module Magick
|
|
74
72
|
end
|
75
73
|
|
76
74
|
def enquote(text)
|
77
|
-
if text.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(text)
|
78
|
-
|
79
|
-
|
80
|
-
text = '\''+text+'\''
|
75
|
+
return text if text.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(text)
|
76
|
+
|
77
|
+
if !text['\'']
|
78
|
+
text = '\'' + text + '\''
|
81
79
|
return text
|
82
80
|
elsif !text['"']
|
83
|
-
text = '"'+text+'"'
|
81
|
+
text = '"' + text + '"'
|
84
82
|
return text
|
85
83
|
elsif !(text['{'] || text['}'])
|
86
|
-
text = '{'+text+'}'
|
84
|
+
text = '{' + text + '}'
|
87
85
|
return text
|
88
86
|
end
|
89
87
|
|
@@ -97,7 +95,7 @@ module Magick
|
|
97
95
|
gm2 = @ctx.shadow.get_type_metrics('aa')
|
98
96
|
h = (gm.ascent - gm.descent + 0.5).to_i
|
99
97
|
w = gm.width - gm2.width
|
100
|
-
if glyph_orientation
|
98
|
+
if glyph_orientation.zero? || glyph_orientation == 180
|
101
99
|
[w, h]
|
102
100
|
else
|
103
101
|
[h, w]
|
@@ -127,29 +125,29 @@ module Magick
|
|
127
125
|
|
128
126
|
def shift_baseline(glyph_orientation, glyph)
|
129
127
|
glyph_dimensions = @ctx.shadow.get_type_metrics(glyph)
|
130
|
-
if glyph_orientation
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
128
|
+
x = if glyph_orientation.zero? || glyph_orientation == 180
|
129
|
+
glyph_dimensions.width
|
130
|
+
else
|
131
|
+
glyph_dimensions.ascent - glyph_dimensions.descent
|
132
|
+
end
|
135
133
|
case @ctx.text_attrs.baseline_shift
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
134
|
+
when :baseline
|
135
|
+
x = 0
|
136
|
+
when :sub
|
137
|
+
|
138
|
+
when :super
|
139
|
+
x = -x
|
140
|
+
when /[-+]?(\d+)%/
|
141
|
+
m = Regexp.last_match(1) == '-' ? -1.0 : 1.0
|
142
|
+
x = (m * x * Regexp.last_match(1).to_f / 100.0)
|
143
|
+
else
|
144
|
+
x = -@ctx.text_attrs.baseline_shift
|
147
145
|
end
|
148
146
|
x
|
149
147
|
end
|
150
148
|
|
151
149
|
def render_glyph(glyph_orientation, x, y, glyph)
|
152
|
-
if glyph_orientation
|
150
|
+
if glyph_orientation.zero?
|
153
151
|
@ctx.gc.text(x, y, enquote(glyph))
|
154
152
|
else
|
155
153
|
@ctx.gc.push
|
@@ -160,7 +158,7 @@ module Magick
|
|
160
158
|
@ctx.gc.pop
|
161
159
|
end
|
162
160
|
end
|
163
|
-
end
|
161
|
+
end # class TextStrategy
|
164
162
|
|
165
163
|
class LRTextStrategy < TextStrategy
|
166
164
|
def get_word_spacing
|
@@ -170,12 +168,12 @@ module Magick
|
|
170
168
|
|
171
169
|
def get_letter_spacing(glyph)
|
172
170
|
gx, gy = glyph_metrics(@ctx.text_attrs.glyph_orientation_horizontal, glyph)
|
173
|
-
[gx
|
171
|
+
[gx + @ctx.text_attrs.letter_spacing, gy]
|
174
172
|
end
|
175
173
|
|
176
174
|
def render(x, y, text)
|
177
175
|
x_rel_coords, y_rel_coords = text_rel_coords(text)
|
178
|
-
dx = x_rel_coords.
|
176
|
+
dx = x_rel_coords.reduce(0) { |sum, a| sum + a }
|
179
177
|
dy = y_rel_coords.max
|
180
178
|
|
181
179
|
# We're handling the anchoring.
|
@@ -189,25 +187,21 @@ module Magick
|
|
189
187
|
|
190
188
|
# Align the first glyph
|
191
189
|
case @ctx.text_attrs.glyph_orientation_horizontal
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
when 270
|
201
|
-
x += x_rel_coords[0]
|
190
|
+
when 90
|
191
|
+
y -= dy
|
192
|
+
when 180
|
193
|
+
x += x_rel_coords.shift
|
194
|
+
x_rel_coords << 0
|
195
|
+
y -= dy
|
196
|
+
when 270
|
197
|
+
x += x_rel_coords[0]
|
202
198
|
end
|
203
199
|
|
204
|
-
y += shift_baseline(@ctx.text_attrs.glyph_orientation_horizontal, text[0,1])
|
200
|
+
y += shift_baseline(@ctx.text_attrs.glyph_orientation_horizontal, text[0, 1])
|
205
201
|
|
206
202
|
first_word = true
|
207
203
|
text.split(::Magick::RVG::WORD_SEP).each do |word|
|
208
|
-
unless first_word
|
209
|
-
x += x_rel_coords.shift
|
210
|
-
end
|
204
|
+
x += x_rel_coords.shift unless first_word
|
211
205
|
first_word = false
|
212
206
|
word.split('').each do |glyph|
|
213
207
|
render_glyph(@ctx.text_attrs.glyph_orientation_horizontal, x, y, glyph)
|
@@ -221,8 +215,8 @@ module Magick
|
|
221
215
|
end # class LRTextStrategy
|
222
216
|
|
223
217
|
class RLTextStrategy < TextStrategy
|
224
|
-
def render(
|
225
|
-
|
218
|
+
def render(_x, _y, _text)
|
219
|
+
raise NotImplementedError
|
226
220
|
end
|
227
221
|
end # class RLTextStrategy
|
228
222
|
|
@@ -234,13 +228,13 @@ module Magick
|
|
234
228
|
|
235
229
|
def get_letter_spacing(glyph)
|
236
230
|
gx, gy = glyph_metrics(@ctx.text_attrs.glyph_orientation_vertical, glyph)
|
237
|
-
[gx, gy
|
231
|
+
[gx, gy + @ctx.text_attrs.letter_spacing]
|
238
232
|
end
|
239
233
|
|
240
234
|
def render(x, y, text)
|
241
235
|
x_rel_coords, y_rel_coords = text_rel_coords(text)
|
242
236
|
dx = x_rel_coords.max
|
243
|
-
dy = y_rel_coords.
|
237
|
+
dy = y_rel_coords.reduce(0) { |sum, a| sum + a }
|
244
238
|
|
245
239
|
# We're handling the anchoring.
|
246
240
|
@ctx.gc.push
|
@@ -255,20 +249,20 @@ module Magick
|
|
255
249
|
# is aligned on x and its top is aligned on y.
|
256
250
|
|
257
251
|
case @ctx.text_attrs.glyph_orientation_vertical
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
252
|
+
when 0
|
253
|
+
x -= x_rel_coords.max / 2
|
254
|
+
y += y_rel_coords[0]
|
255
|
+
when 90
|
256
|
+
x -= x_rel_coords.max / 2
|
257
|
+
when 180
|
258
|
+
x += x_rel_coords.max / 2
|
259
|
+
when 270
|
260
|
+
x += x_rel_coords.max / 2
|
261
|
+
y += y_rel_coords.shift
|
262
|
+
y_rel_coords << 0 # since we used an element we need to add a dummy
|
269
263
|
end
|
270
264
|
|
271
|
-
x -= shift_baseline(@ctx.text_attrs.glyph_orientation_vertical, text[0,1])
|
265
|
+
x -= shift_baseline(@ctx.text_attrs.glyph_orientation_vertical, text[0, 1])
|
272
266
|
|
273
267
|
first_word = true
|
274
268
|
text.split(::Magick::RVG::WORD_SEP).each do |word|
|
@@ -279,13 +273,13 @@ module Magick
|
|
279
273
|
first_word = false
|
280
274
|
word.split('').each do |glyph|
|
281
275
|
case @ctx.text_attrs.glyph_orientation_vertical.to_i
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
276
|
+
when 0, 90, 270
|
277
|
+
x_shift = (dx - x_rel_coords.shift) / 2
|
278
|
+
when 180
|
279
|
+
x_shift = -(dx - x_rel_coords.shift) / 2
|
286
280
|
end
|
287
281
|
|
288
|
-
render_glyph(@ctx.text_attrs.glyph_orientation_vertical, x+x_shift, y, glyph)
|
282
|
+
render_glyph(@ctx.text_attrs.glyph_orientation_vertical, x + x_shift, y, glyph)
|
289
283
|
y += y_rel_coords.shift
|
290
284
|
end
|
291
285
|
end
|
@@ -293,7 +287,7 @@ module Magick
|
|
293
287
|
@ctx.gc.pop
|
294
288
|
[0, dy]
|
295
289
|
end
|
296
|
-
end
|
290
|
+
end # class TBTextStrategy
|
297
291
|
|
298
292
|
# Handle "easy" text
|
299
293
|
class DefaultTextStrategy < TextStrategy
|
@@ -301,16 +295,16 @@ module Magick
|
|
301
295
|
@ctx.gc.text(x, y, enquote(text))
|
302
296
|
tm = @ctx.shadow.get_type_metrics(text)
|
303
297
|
dx = case @ctx.text_attrs.text_anchor
|
304
|
-
|
298
|
+
when :start
|
305
299
|
tm.width
|
306
|
-
|
300
|
+
when :middle
|
307
301
|
tm.width / 2
|
308
|
-
|
302
|
+
when :end
|
309
303
|
0
|
310
|
-
|
304
|
+
end
|
311
305
|
[dx, 0]
|
312
306
|
end
|
313
|
-
end
|
307
|
+
end # class NormalTextStrategy
|
314
308
|
end # class Utility
|
315
309
|
end # class RVG
|
316
310
|
end # module Magick
|
@@ -319,9 +313,7 @@ module Magick
|
|
319
313
|
class RVG
|
320
314
|
class Utility
|
321
315
|
class TextAttributes
|
322
|
-
|
323
|
-
|
324
|
-
WRITING_MODE = %w{lr-tb lr rl-tb rl tb-rl tb}
|
316
|
+
WRITING_MODE = %w[lr-tb lr rl-tb rl tb-rl tb]
|
325
317
|
|
326
318
|
def initialize
|
327
319
|
@affine = []
|
@@ -419,8 +411,8 @@ module Magick
|
|
419
411
|
|
420
412
|
def non_default?
|
421
413
|
@baseline_shift[-1] != :baseline || @letter_spacing[-1] != 0 ||
|
422
|
-
|
423
|
-
|
414
|
+
@word_spacing[-1] != 0 || @writing_mode[-1][/\Alr/].nil? ||
|
415
|
+
@glyph_orientation_horizontal[-1] != 0
|
424
416
|
end
|
425
417
|
|
426
418
|
def word_spacing
|
@@ -438,56 +430,60 @@ module Magick
|
|
438
430
|
def writing_mode=(mode)
|
439
431
|
@writing_mode[-1] = WRITING_MODE.include?(mode) ? mode : 'lr-tb'
|
440
432
|
end
|
441
|
-
end
|
433
|
+
end # class TextAttributes
|
442
434
|
|
443
435
|
class GraphicContext
|
444
436
|
FONT_STRETCH = {
|
445
|
-
:
|
446
|
-
:
|
447
|
-
:
|
448
|
-
:
|
449
|
-
:
|
450
|
-
:
|
451
|
-
:
|
452
|
-
:
|
453
|
-
:
|
437
|
+
normal: Magick::NormalStretch,
|
438
|
+
ultra_condensed: Magick::UltraCondensedStretch,
|
439
|
+
extra_condensed: Magick::ExtraCondensedStretch,
|
440
|
+
condensed: Magick::CondensedStretch,
|
441
|
+
semi_condensed: Magick::SemiCondensedStretch,
|
442
|
+
semi_expanded: Magick::SemiExpandedStretch,
|
443
|
+
expanded: Magick::ExpandedStretch,
|
444
|
+
extra_expanded: Magick::ExtraExpandedStretch,
|
445
|
+
ultra_expanded: Magick::UltraExpandedStretch
|
454
446
|
}
|
455
447
|
|
456
448
|
FONT_STYLE = {
|
457
|
-
:
|
458
|
-
:
|
459
|
-
:
|
449
|
+
normal: Magick::NormalStyle,
|
450
|
+
italic: Magick::ItalicStyle,
|
451
|
+
oblique: Magick::ObliqueStyle
|
460
452
|
}
|
461
453
|
|
462
454
|
FONT_WEIGHT = {
|
463
|
-
'normal'
|
464
|
-
'bold'
|
465
|
-
'bolder'
|
455
|
+
'normal' => Magick::NormalWeight,
|
456
|
+
'bold' => Magick::BoldWeight,
|
457
|
+
'bolder' => Magick::BolderWeight,
|
466
458
|
'lighter' => Magick::LighterWeight
|
467
459
|
}
|
468
460
|
|
469
461
|
TEXT_ANCHOR = {
|
470
|
-
:
|
471
|
-
:
|
472
|
-
:
|
462
|
+
start: Magick::StartAnchor,
|
463
|
+
middle: Magick::MiddleAnchor,
|
464
|
+
end: Magick::EndAnchor
|
473
465
|
}
|
474
466
|
|
475
467
|
ANCHOR_TO_ALIGN = {
|
476
|
-
:
|
477
|
-
:
|
478
|
-
:
|
468
|
+
start: Magick::LeftAlign,
|
469
|
+
middle: Magick::CenterAlign,
|
470
|
+
end: Magick::RightAlign
|
479
471
|
}
|
480
472
|
|
481
473
|
TEXT_DECORATION = {
|
482
|
-
:
|
483
|
-
:
|
484
|
-
:
|
485
|
-
:
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
'
|
490
|
-
'
|
474
|
+
none: Magick::NoDecoration,
|
475
|
+
underline: Magick::UnderlineDecoration,
|
476
|
+
overline: Magick::OverlineDecoration,
|
477
|
+
line_through: Magick::LineThroughDecoration
|
478
|
+
}
|
479
|
+
|
480
|
+
TEXT_STRATEGIES = {
|
481
|
+
'lr-tb' => LRTextStrategy,
|
482
|
+
'lr' => LRTextStrategy,
|
483
|
+
'rt-tb' => RLTextStrategy,
|
484
|
+
'rl' => RLTextStrategy,
|
485
|
+
'tb-rl' => TBTextStrategy,
|
486
|
+
'tb' => TBTextStrategy
|
491
487
|
}
|
492
488
|
|
493
489
|
def self.degrees_to_radians(deg)
|
@@ -526,8 +522,8 @@ module Magick
|
|
526
522
|
init_matrix
|
527
523
|
end
|
528
524
|
|
529
|
-
def method_missing(
|
530
|
-
@gc.__send__(
|
525
|
+
def method_missing(meth_id, *args, &block)
|
526
|
+
@gc.__send__(meth_id, *args, &block)
|
531
527
|
end
|
532
528
|
|
533
529
|
def affine(sx, rx, ry, sy, tx, ty)
|
@@ -539,13 +535,13 @@ module Magick
|
|
539
535
|
|
540
536
|
def baseline_shift(value)
|
541
537
|
@text_attrs.baseline_shift = case value
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
538
|
+
when 'baseline', 'sub', 'super'
|
539
|
+
value.to_sym
|
540
|
+
when /[-+]?\d+%/, Numeric
|
541
|
+
value
|
542
|
+
else
|
543
|
+
:baseline
|
544
|
+
end
|
549
545
|
nil
|
550
546
|
end
|
551
547
|
|
@@ -568,14 +564,14 @@ module Magick
|
|
568
564
|
end
|
569
565
|
|
570
566
|
def font_stretch(stretch)
|
571
|
-
stretch = FONT_STRETCH.fetch(stretch.
|
567
|
+
stretch = FONT_STRETCH.fetch(stretch.to_sym, Magick::NormalStretch)
|
572
568
|
@gc.font_stretch(stretch)
|
573
569
|
@shadow[-1].font_stretch = stretch
|
574
570
|
nil
|
575
571
|
end
|
576
572
|
|
577
573
|
def font_style(style)
|
578
|
-
style = FONT_STYLE.fetch(style.
|
574
|
+
style = FONT_STYLE.fetch(style.to_sym, Magick::NormalStyle)
|
579
575
|
@gc.font_style(style)
|
580
576
|
@shadow[-1].font_style = style
|
581
577
|
nil
|
@@ -583,7 +579,7 @@ module Magick
|
|
583
579
|
|
584
580
|
def font_weight(weight)
|
585
581
|
# If the arg is not in the hash use it directly. Handles numeric values.
|
586
|
-
weight = FONT_WEIGHT.fetch(weight) {|key| key}
|
582
|
+
weight = FONT_WEIGHT.fetch(weight) { |key| key }
|
587
583
|
@gc.font_weight(weight)
|
588
584
|
@shadow[-1].font_weight = weight
|
589
585
|
nil
|
@@ -672,18 +668,19 @@ module Magick
|
|
672
668
|
end
|
673
669
|
|
674
670
|
def text(x, y, text)
|
675
|
-
return if text.length
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
671
|
+
return if text.length.zero?
|
672
|
+
|
673
|
+
text_renderer = if @text_attrs.non_default?
|
674
|
+
TEXT_STRATEGIES[@text_attrs.writing_mode].new(self)
|
675
|
+
else
|
676
|
+
DefaultTextStrategy.new(self)
|
677
|
+
end
|
681
678
|
|
682
679
|
text_renderer.render(x, y, text)
|
683
680
|
end
|
684
681
|
|
685
682
|
def text_anchor(anchor)
|
686
|
-
anchor = anchor.
|
683
|
+
anchor = anchor.to_sym
|
687
684
|
anchor_enum = TEXT_ANCHOR.fetch(anchor, Magick::StartAnchor)
|
688
685
|
@gc.text_anchor(anchor_enum)
|
689
686
|
align = ANCHOR_TO_ALIGN.fetch(anchor, Magick::LeftAlign)
|
@@ -693,7 +690,7 @@ module Magick
|
|
693
690
|
end
|
694
691
|
|
695
692
|
def text_decoration(decoration)
|
696
|
-
decoration = TEXT_DECORATION.fetch(decoration.
|
693
|
+
decoration = TEXT_DECORATION.fetch(decoration.to_sym, Magick::NoDecoration)
|
697
694
|
@gc.decorate(decoration)
|
698
695
|
@shadow[-1].decorate = decoration
|
699
696
|
nil
|
@@ -717,7 +714,7 @@ module Magick
|
|
717
714
|
@text_attrs.writing_mode = mode
|
718
715
|
nil
|
719
716
|
end
|
720
|
-
end
|
717
|
+
end # class GraphicContext
|
721
718
|
end # class Utility
|
722
719
|
end # class RVG
|
723
720
|
end # module Magick
|
data/lib/rvg/paint.rb
CHANGED
@@ -37,7 +37,8 @@ module Magick
|
|
37
37
|
yield(self) if block_given?
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
# @private
|
41
|
+
def add_primitives(gc, style)
|
41
42
|
name = __id__.to_s
|
42
43
|
gc.pattern(name, @x, @y, @width, @height) do
|
43
44
|
add_viewbox_primitives(@width, @height, gc)
|
data/lib/rvg/pathdata.rb
CHANGED
@@ -12,12 +12,10 @@ module Magick
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def add_points(req, *coords)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
coords.each {|c| @path << ('%g' % c)}
|
20
|
-
end
|
15
|
+
return unless coords
|
16
|
+
raise ArgumentError, "wrong number of coordinates specified. A multiple of #{req} required, #{req + coords.length} given." if coords.length % req != 0
|
17
|
+
|
18
|
+
coords.each { |c| @path << sprintf('%g', c) }
|
21
19
|
end
|
22
20
|
|
23
21
|
public
|
@@ -32,7 +30,8 @@ module Magick
|
|
32
30
|
@path
|
33
31
|
end
|
34
32
|
|
35
|
-
|
33
|
+
# @private
|
34
|
+
def deep_copy(_h = nil)
|
36
35
|
@path.dup
|
37
36
|
end
|
38
37
|
|
@@ -47,7 +46,7 @@ module Magick
|
|
47
46
|
|
48
47
|
# Add a <tt>closepath</tt> command. The <tt>abs</tt> argument
|
49
48
|
# is ignored.
|
50
|
-
def closepath(
|
49
|
+
def closepath(_abs = true)
|
51
50
|
@path << 'Z' # ignore `abs'
|
52
51
|
end
|
53
52
|
|