rmagick 2.16.0 → 3.0.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/.appveyor.yml +19 -0
- data/.circleci/config.yml +56 -0
- data/.rubocop.yml +8 -335
- data/.rubocop_todo.yml +255 -0
- data/.ruby-version +1 -0
- data/.travis.yml +6 -49
- data/CHANGELOG.md +23 -0
- data/CONTRIBUTING.md +34 -0
- data/Gemfile +0 -6
- data/README.textile +11 -3
- data/Rakefile +23 -15
- data/before_install_linux.sh +12 -15
- data/doc/ex/InitialCoords.rb +4 -4
- data/doc/ex/NewCoordSys.rb +4 -4
- data/doc/ex/OrigCoordSys.rb +2 -2
- data/doc/ex/PreserveAspectRatio.rb +34 -34
- data/doc/ex/RotateScale.rb +7 -7
- data/doc/ex/Skew.rb +7 -7
- data/doc/ex/Use01.rb +1 -1
- data/doc/ex/Use02.rb +4 -4
- data/doc/ex/Use03.rb +2 -2
- data/doc/ex/ViewBox.rb +4 -4
- data/doc/ex/affine.rb +5 -5
- data/doc/ex/affine_transform.rb +3 -3
- data/doc/ex/arc.rb +9 -9
- data/doc/ex/arcpath.rb +2 -2
- data/doc/ex/arcs01.rb +6 -6
- data/doc/ex/arcs02.rb +8 -8
- data/doc/ex/axes.rb +11 -11
- data/doc/ex/baseline_shift01.rb +5 -5
- data/doc/ex/bilevel_channel.rb +1 -1
- data/doc/ex/blur_image.rb +1 -1
- data/doc/ex/border.rb +1 -1
- data/doc/ex/bounding_box.rb +11 -11
- data/doc/ex/cbezier1.rb +12 -12
- data/doc/ex/cbezier2.rb +13 -13
- data/doc/ex/cbezier3.rb +13 -13
- data/doc/ex/cbezier4.rb +13 -13
- data/doc/ex/cbezier5.rb +13 -13
- data/doc/ex/cbezier6.rb +19 -19
- data/doc/ex/channel.rb +2 -2
- data/doc/ex/chop.rb +2 -2
- data/doc/ex/circle.rb +7 -7
- data/doc/ex/circle01.rb +2 -2
- data/doc/ex/clip_path.rb +6 -6
- data/doc/ex/coalesce.rb +6 -6
- data/doc/ex/color_fill_to_border.rb +8 -8
- data/doc/ex/color_floodfill.rb +8 -8
- data/doc/ex/color_histogram.rb +2 -2
- data/doc/ex/color_reset.rb +2 -2
- data/doc/ex/colors.rb +4 -4
- data/doc/ex/compose_mask.rb +2 -2
- data/doc/ex/composite.rb +39 -39
- data/doc/ex/composite_layers.rb +1 -2
- data/doc/ex/contrast.rb +3 -3
- data/doc/ex/crop.rb +2 -2
- data/doc/ex/crop_with_gravity.rb +5 -5
- data/doc/ex/cubic01.rb +12 -12
- data/doc/ex/cubic02.rb +22 -22
- data/doc/ex/cycle_colormap.rb +3 -3
- data/doc/ex/dissolve.rb +0 -0
- data/doc/ex/drawcomp.rb +8 -9
- data/doc/ex/drop_shadow.rb +4 -4
- data/doc/ex/ellipse.rb +9 -9
- data/doc/ex/ellipse01.rb +3 -3
- data/doc/ex/enhance.rb +2 -2
- data/doc/ex/evenodd.rb +19 -19
- data/doc/ex/fill_pattern.rb +3 -3
- data/doc/ex/flatten_images.rb +1 -1
- data/doc/ex/font_styles.rb +13 -13
- data/doc/ex/fonts.rb +2 -6
- data/doc/ex/frame.rb +1 -1
- data/doc/ex/get_multiline_type_metrics.rb +3 -3
- data/doc/ex/get_pixels.rb +4 -6
- data/doc/ex/get_type_metrics.rb +26 -25
- data/doc/ex/gradientfill.rb +2 -2
- data/doc/ex/grav.rb +12 -12
- data/doc/ex/gravity.rb +14 -16
- data/doc/ex/group.rb +11 -11
- data/doc/ex/hatchfill.rb +2 -2
- data/doc/ex/image.rb +9 -9
- data/doc/ex/implode.rb +2 -2
- data/doc/ex/line.rb +10 -10
- data/doc/ex/line01.rb +7 -7
- data/doc/ex/mask.rb +0 -0
- data/doc/ex/matte_fill_to_border.rb +3 -3
- data/doc/ex/matte_floodfill.rb +2 -2
- data/doc/ex/matte_replace.rb +3 -3
- data/doc/ex/median_filter.rb +2 -2
- data/doc/ex/mono.rb +2 -2
- data/doc/ex/morph.rb +1 -1
- data/doc/ex/mosaic.rb +7 -5
- data/doc/ex/motion_blur.rb +1 -1
- data/doc/ex/negate_channel.rb +0 -0
- data/doc/ex/nested_rvg.rb +2 -2
- data/doc/ex/nonzero.rb +19 -19
- data/doc/ex/opacity.rb +9 -9
- data/doc/ex/path.rb +17 -17
- data/doc/ex/pattern1.rb +4 -4
- data/doc/ex/pattern2.rb +2 -2
- data/doc/ex/polaroid.rb +0 -1
- data/doc/ex/polygon.rb +7 -7
- data/doc/ex/polygon01.rb +7 -7
- data/doc/ex/polyline.rb +7 -7
- data/doc/ex/polyline01.rb +8 -8
- data/doc/ex/posterize.rb +0 -0
- data/doc/ex/qbezierpath.rb +16 -16
- data/doc/ex/quad01.rb +6 -6
- data/doc/ex/quantize-m.rb +2 -2
- data/doc/ex/random_threshold_channel.rb +1 -1
- data/doc/ex/rect01.rb +2 -2
- data/doc/ex/rect02.rb +3 -3
- data/doc/ex/rectangle.rb +6 -6
- data/doc/ex/reduce_noise.rb +2 -2
- data/doc/ex/remap.rb +0 -0
- data/doc/ex/resize_to_fill.rb +0 -0
- data/doc/ex/resize_to_fit.rb +0 -0
- data/doc/ex/roll.rb +1 -1
- data/doc/ex/rotate.rb +8 -8
- data/doc/ex/rotate_f.rb +1 -1
- data/doc/ex/roundrect.rb +6 -6
- data/doc/ex/rubyname.rb +4 -4
- data/doc/ex/rvg_clippath.rb +3 -3
- data/doc/ex/rvg_linecap.rb +7 -7
- data/doc/ex/rvg_linejoin.rb +7 -7
- data/doc/ex/rvg_opacity.rb +5 -5
- data/doc/ex/rvg_pattern.rb +8 -8
- data/doc/ex/rvg_stroke_dasharray.rb +2 -2
- data/doc/ex/sepiatone.rb +0 -0
- data/doc/ex/shadow.rb +6 -6
- data/doc/ex/shear.rb +2 -2
- data/doc/ex/skewx.rb +8 -8
- data/doc/ex/skewy.rb +9 -9
- data/doc/ex/smile.rb +5 -4
- data/doc/ex/sparse_color.rb +0 -4
- data/doc/ex/splice.rb +1 -1
- data/doc/ex/stegano.rb +4 -5
- data/doc/ex/stroke_dasharray.rb +10 -10
- data/doc/ex/stroke_fill.rb +2 -2
- data/doc/ex/stroke_linecap.rb +12 -12
- data/doc/ex/stroke_linejoin.rb +12 -12
- data/doc/ex/stroke_width.rb +11 -11
- data/doc/ex/swirl.rb +2 -2
- data/doc/ex/text.rb +6 -6
- data/doc/ex/text01.rb +4 -4
- data/doc/ex/text_align.rb +5 -5
- data/doc/ex/text_antialias.rb +2 -2
- data/doc/ex/text_styles.rb +8 -8
- data/doc/ex/text_undercolor.rb +4 -4
- data/doc/ex/texture_fill_to_border.rb +8 -8
- data/doc/ex/texture_floodfill.rb +8 -8
- data/doc/ex/texturefill.rb +2 -2
- data/doc/ex/threshold.rb +2 -2
- data/doc/ex/to_blob.rb +1 -1
- data/doc/ex/translate.rb +8 -8
- data/doc/ex/transparent.rb +6 -6
- data/doc/ex/transpose.rb +0 -0
- data/doc/ex/transverse.rb +0 -0
- data/doc/ex/tref01.rb +6 -6
- data/doc/ex/triangle01.rb +2 -2
- data/doc/ex/trim.rb +2 -2
- data/doc/ex/tspan01.rb +5 -5
- data/doc/ex/tspan02.rb +5 -5
- data/doc/ex/tspan03.rb +5 -5
- data/doc/ex/unsharp_mask.rb +3 -3
- data/doc/ex/viewex.rb +5 -5
- data/doc/ex/vignette.rb +0 -0
- data/doc/ex/watermark.rb +6 -6
- data/doc/ex/wet_floor.rb +2 -2
- data/doc/ex/writing_mode01.rb +12 -12
- data/doc/ex/writing_mode02.rb +12 -12
- data/examples/constitute.rb +1 -1
- data/examples/crop_with_gravity.rb +5 -5
- data/examples/demo.rb +6 -7
- data/examples/describe.rb +8 -10
- data/examples/find_similar_region.rb +3 -3
- data/examples/histogram.rb +192 -201
- data/examples/identify.rb +62 -73
- data/examples/image_opacity.rb +0 -1
- data/examples/import_export.rb +1 -1
- data/examples/pattern_fill.rb +3 -4
- data/examples/rotating_text.rb +5 -4
- data/examples/spinner.rb +5 -5
- data/examples/thumbnail.rb +3 -3
- data/examples/vignette.rb +5 -5
- data/ext/RMagick/extconf.rb +213 -230
- data/ext/RMagick/rmagick.c +1 -0
- data/ext/RMagick/rmagick.h +26 -29
- data/ext/RMagick/rmdraw.c +3 -38
- data/ext/RMagick/rmenum.c +36 -0
- data/ext/RMagick/rmimage.c +166 -10
- data/ext/RMagick/rminfo.c +7 -2
- data/ext/RMagick/rmkinfo.c +247 -0
- data/ext/RMagick/rmmain.c +96 -0
- data/ext/RMagick/rmutil.c +4 -0
- data/lib/rmagick/version.rb +3 -3
- data/lib/rmagick_internal.rb +226 -308
- data/lib/rvg/clippath.rb +2 -4
- data/lib/rvg/container.rb +25 -22
- data/lib/rvg/deep_equal.rb +11 -11
- data/lib/rvg/describable.rb +2 -2
- data/lib/rvg/embellishable.rb +60 -66
- data/lib/rvg/misc.rb +122 -128
- data/lib/rvg/pathdata.rb +15 -17
- data/lib/rvg/rvg.rb +41 -44
- data/lib/rvg/stretchable.rb +22 -28
- data/lib/rvg/stylable.rb +10 -10
- data/lib/rvg/text.rb +164 -165
- data/lib/rvg/transformable.rb +15 -15
- data/lib/rvg/units.rb +2 -2
- data/rmagick.gemspec +9 -33
- data/spec/rmagick/draw_spec.rb +5 -6
- data/spec/rmagick/image/blue_shift_spec.rb +1 -3
- data/spec/rmagick/image/channel_entropy_spec.rb +9 -0
- data/spec/rmagick/image/composite_spec.rb +2 -4
- data/spec/rmagick/image/constitute_spec.rb +2 -4
- data/spec/rmagick/image/dispatch_spec.rb +1 -3
- data/spec/rmagick/image/from_blob_spec.rb +1 -3
- data/spec/rmagick/image/ping_spec.rb +1 -3
- data/spec/rmagick/image/properties_spec.rb +0 -2
- data/spec/rmagick/image/read_spec.rb +28 -0
- data/spec/spec_helper.rb +7 -1
- data/spec/support/issue_200/app.rb +8 -0
- data/test/Image1.rb +70 -70
- data/test/Image2.rb +369 -361
- data/test/Image3.rb +64 -63
- data/test/ImageList1.rb +796 -792
- data/test/ImageList2.rb +43 -44
- data/test/Image_attributes.rb +26 -48
- data/test/Import_Export.rb +71 -77
- data/test/Info.rb +30 -31
- data/test/Magick.rb +47 -46
- data/test/Pixel.rb +24 -24
- data/test/Preview.rb +7 -6
- data/test/test_all_basic.rb +15 -7
- data/test/tmpnam_test.rb +3 -3
- metadata +57 -18
data/lib/rvg/clippath.rb
CHANGED
@@ -23,16 +23,14 @@ module Magick
|
|
23
23
|
# Attach the clipping path to an object with the :clip_path style.
|
24
24
|
def initialize(clip_path_units = 'userSpaceOnUse')
|
25
25
|
super()
|
26
|
-
unless [
|
27
|
-
fail ArgumentError, "undefined value for clip path units: #{clip_path_units}"
|
28
|
-
end
|
26
|
+
raise ArgumentError, "undefined value for clip path units: #{clip_path_units}" unless %w[userSpaceOnUse objectBoundingBox].include?(clip_path_units)
|
29
27
|
|
30
28
|
@clip_path_units = clip_path_units
|
31
29
|
@content = Content.new
|
32
30
|
yield(self) if block_given?
|
33
31
|
end
|
34
32
|
|
35
|
-
def add_primitives(gc,
|
33
|
+
def add_primitives(gc, _style) #:nodoc:
|
36
34
|
name = __id__.to_s
|
37
35
|
gc.define_clip_path(name) do
|
38
36
|
gc.clip_units(@clip_path_units)
|
data/lib/rvg/container.rb
CHANGED
@@ -6,30 +6,33 @@ module Magick
|
|
6
6
|
class RVG
|
7
7
|
# Content is simply an Array with a deep_copy method.
|
8
8
|
# When unit-testing, it also has a deep_equal method.
|
9
|
-
class Content < Array
|
9
|
+
class Content < Array #:nodoc:
|
10
10
|
def deep_copy(h = {})
|
11
11
|
me = __id__
|
12
12
|
copy = h[me]
|
13
13
|
unless copy
|
14
14
|
copy = self.class.new
|
15
15
|
each do |c|
|
16
|
-
copy <<
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
copy << if c.nil?
|
17
|
+
nil
|
18
|
+
elsif c.respond_to?(:deep_copy)
|
19
|
+
c.deep_copy(h)
|
20
|
+
elsif c.respond_to?(:dup)
|
21
|
+
begin
|
22
|
+
c.dup
|
23
|
+
rescue StandardError
|
24
|
+
c
|
25
|
+
end
|
26
|
+
else
|
27
|
+
c
|
28
|
+
end
|
26
29
|
end
|
27
30
|
copy.freeze if frozen?
|
28
31
|
h[me] = copy
|
29
32
|
end
|
30
33
|
copy
|
31
34
|
end
|
32
|
-
end
|
35
|
+
end # class Content
|
33
36
|
|
34
37
|
# Define a collection of shapes, text, etc. that can be reused.
|
35
38
|
# Group objects are _containers_. That is, styles and transforms defined
|
@@ -49,11 +52,11 @@ module Magick
|
|
49
52
|
# grp.circle(10, 20, 20).styles(:stroke=>'blue')
|
50
53
|
# end
|
51
54
|
class Group
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
include Stylable
|
56
|
+
include Transformable
|
57
|
+
include Embellishable
|
58
|
+
include Describable
|
59
|
+
include Duplicatable
|
57
60
|
|
58
61
|
def initialize
|
59
62
|
super
|
@@ -61,7 +64,7 @@ module Magick
|
|
61
64
|
yield(self) if block_given?
|
62
65
|
end
|
63
66
|
|
64
|
-
def add_primitives(gc)
|
67
|
+
def add_primitives(gc) #:nodoc:
|
65
68
|
gc.push
|
66
69
|
add_transform_primitives(gc)
|
67
70
|
add_style_primitives(gc)
|
@@ -70,16 +73,16 @@ module Magick
|
|
70
73
|
end
|
71
74
|
|
72
75
|
# Translate container according to #use arguments
|
73
|
-
def ref(x, y,
|
76
|
+
def ref(x, y, _width, _height) #:nodoc:
|
74
77
|
translate(x, y) if x != 0 || y != 0
|
75
78
|
end
|
76
79
|
|
77
80
|
# Append an arbitrary object to the group's content. Called
|
78
81
|
# by #use to insert a non-container object into a group.
|
79
|
-
def <<(obj)
|
82
|
+
def <<(obj) #:nodoc:
|
80
83
|
@content << obj
|
81
84
|
end
|
82
|
-
end
|
85
|
+
end # class Group
|
83
86
|
|
84
87
|
# A Use object allows the re-use of RVG and RVG::Group
|
85
88
|
# objects within a container. Create a Use object with the
|
@@ -110,7 +113,7 @@ module Magick
|
|
110
113
|
@element.ref(x, y, width, height)
|
111
114
|
end
|
112
115
|
|
113
|
-
def add_primitives(gc)
|
116
|
+
def add_primitives(gc) #:nodoc:
|
114
117
|
gc.push
|
115
118
|
add_transform_primitives(gc)
|
116
119
|
add_style_primitives(gc)
|
data/lib/rvg/deep_equal.rb
CHANGED
@@ -30,17 +30,17 @@ module Magick
|
|
30
30
|
end
|
31
31
|
else
|
32
32
|
case itv
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
when Float, Symbol, TrueClass, FalseClass, Fixnum, NilClass
|
34
|
+
return false if itv != otv
|
35
|
+
else
|
36
|
+
if itv.equal?(otv)
|
37
|
+
puts "#{iv} is dup-able but self.#{iv} and other.#{iv} are the same object."
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
if itv != otv
|
41
|
+
puts "Not equal.\nself.#{iv}=#{itv.inspect}\nother.#{iv}=#{otv.inspect}"
|
42
|
+
return false
|
43
|
+
end
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
data/lib/rvg/describable.rb
CHANGED
@@ -11,7 +11,7 @@ module Magick
|
|
11
11
|
module Describable
|
12
12
|
private
|
13
13
|
|
14
|
-
def initialize(*args, &block)
|
14
|
+
def initialize(*args, &block) #:nodoc:
|
15
15
|
super
|
16
16
|
@title, @desc, @metadata = nil
|
17
17
|
end
|
@@ -42,6 +42,6 @@ module Magick
|
|
42
42
|
def metadata
|
43
43
|
@metadata.to_s
|
44
44
|
end
|
45
|
-
end
|
45
|
+
end # module Describable
|
46
46
|
end # class RVG
|
47
47
|
end # module Magick
|
data/lib/rvg/embellishable.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
module Magick
|
6
6
|
class RVG
|
7
7
|
# Parent class of Circle, Ellipse, Text, etc.
|
8
|
-
class Shape
|
8
|
+
class Shape #:nodoc:
|
9
9
|
include Stylable
|
10
10
|
include Transformable
|
11
11
|
include Duplicatable
|
@@ -18,7 +18,7 @@ module Magick
|
|
18
18
|
gc.__send__(@primitive, *@args)
|
19
19
|
gc.pop
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end # class Shape
|
22
22
|
|
23
23
|
class Circle < Shape
|
24
24
|
# Define a circle with radius +r+ and centered at [<tt>cx</tt>, <tt>cy</tt>].
|
@@ -26,14 +26,13 @@ module Magick
|
|
26
26
|
def initialize(r, cx = 0, cy = 0)
|
27
27
|
super()
|
28
28
|
r, cx, cy = Magick::RVG.convert_to_float(r, cx, cy)
|
29
|
-
if r < 0
|
30
|
-
|
31
|
-
end
|
29
|
+
raise ArgumentError, "radius must be >= 0 (#{r} given)" if r < 0
|
30
|
+
|
32
31
|
@primitive = :circle
|
33
|
-
@args = [cx, cy, cx+r, cy]
|
32
|
+
@args = [cx, cy, cx + r, cy]
|
34
33
|
self
|
35
34
|
end
|
36
|
-
end
|
35
|
+
end # class Circle
|
37
36
|
|
38
37
|
class Ellipse < Shape
|
39
38
|
# Define an ellipse with a center at [<tt>cx</tt>, <tt>cy</tt>], a horizontal radius +rx+
|
@@ -42,14 +41,13 @@ module Magick
|
|
42
41
|
def initialize(rx, ry, cx = 0, cy = 0)
|
43
42
|
super()
|
44
43
|
rx, ry, cx, cy = Magick::RVG.convert_to_float(rx, ry, cx, cy)
|
45
|
-
if rx < 0 || ry < 0
|
46
|
-
|
47
|
-
end
|
44
|
+
raise ArgumentError, "radii must be >= 0 (#{rx}, #{ry} given)" if rx < 0 || ry < 0
|
45
|
+
|
48
46
|
@primitive = :ellipse
|
49
47
|
# Ellipses are always complete.
|
50
48
|
@args = [cx, cy, rx, ry, 0, 360]
|
51
49
|
end
|
52
|
-
end
|
50
|
+
end # class Ellipse
|
53
51
|
|
54
52
|
class Line < Shape
|
55
53
|
# Define a line from [<tt>x1</tt>, <tt>y1</tt>] to [<tt>x2</tt>, <tt>y2</tt>].
|
@@ -59,7 +57,7 @@ module Magick
|
|
59
57
|
@primitive = :line
|
60
58
|
@args = [x1, y1, x2, y2]
|
61
59
|
end
|
62
|
-
end
|
60
|
+
end # class Line
|
63
61
|
|
64
62
|
class Path < Shape
|
65
63
|
# Define an SVG path. The argument can be either a path string
|
@@ -70,7 +68,7 @@ module Magick
|
|
70
68
|
@primitive = :path
|
71
69
|
@args = [path.to_s]
|
72
70
|
end
|
73
|
-
end
|
71
|
+
end # class Path
|
74
72
|
|
75
73
|
class Rect < Shape
|
76
74
|
# Define a width x height rectangle. The upper-left corner is at [<tt>x</tt>, <tt>y</tt>].
|
@@ -79,10 +77,9 @@ module Magick
|
|
79
77
|
def initialize(width, height, x = 0, y = 0)
|
80
78
|
super()
|
81
79
|
width, height, x, y = Magick::RVG.convert_to_float(width, height, x, y)
|
82
|
-
if width < 0 || height < 0
|
83
|
-
|
84
|
-
|
85
|
-
@args = [x, y, x+width, y+height]
|
80
|
+
raise ArgumentError, "width, height must be >= 0 (#{width}, #{height} given)" if width < 0 || height < 0
|
81
|
+
|
82
|
+
@args = [x, y, x + width, y + height]
|
86
83
|
@primitive = :rectangle
|
87
84
|
end
|
88
85
|
|
@@ -90,9 +87,8 @@ module Magick
|
|
90
87
|
# are the x- and y-axis radii. If y is omitted it defaults to x.
|
91
88
|
def round(rx, ry = nil)
|
92
89
|
rx, ry = Magick::RVG.convert_to_float(rx, ry || rx)
|
93
|
-
if rx < 0 || ry < 0
|
94
|
-
|
95
|
-
end
|
90
|
+
raise ArgumentError, "rx, ry must be >= 0 (#{rx}, #{ry} given)" if rx < 0 || ry < 0
|
91
|
+
|
96
92
|
@args << rx << ry
|
97
93
|
@primitive = :roundrectangle
|
98
94
|
self
|
@@ -102,24 +98,22 @@ module Magick
|
|
102
98
|
class PolyShape < Shape
|
103
99
|
def polypoints(points)
|
104
100
|
case points.length
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
points = x_coords.zip(y_coords).flatten
|
101
|
+
when 1
|
102
|
+
points = Array(points[0])
|
103
|
+
when 2
|
104
|
+
x_coords = Array(points[0])
|
105
|
+
y_coords = Array(points[1])
|
106
|
+
raise ArgumentError, 'array arguments must contain at least one point' unless !x_coords.empty? && !y_coords.empty?
|
107
|
+
|
108
|
+
n = x_coords.length - y_coords.length
|
109
|
+
short = n > 0 ? y_coords : x_coords
|
110
|
+
olen = short.length
|
111
|
+
n.abs.times { |x| short << short[x % olen] }
|
112
|
+
points = x_coords.zip(y_coords).flatten
|
118
113
|
end
|
119
114
|
n = points.length
|
120
|
-
if n < 4 || n.odd?
|
121
|
-
|
122
|
-
end
|
115
|
+
raise ArgumentError, "insufficient/odd number of points specified: #{n}" if n < 4 || n.odd?
|
116
|
+
|
123
117
|
Magick::RVG.convert_to_float(*points)
|
124
118
|
end
|
125
119
|
end # class PolyShape
|
@@ -136,7 +130,7 @@ module Magick
|
|
136
130
|
@primitive = :polygon
|
137
131
|
@args = polypoints(points)
|
138
132
|
end
|
139
|
-
end
|
133
|
+
end # class Polygon
|
140
134
|
|
141
135
|
class Polyline < PolyShape
|
142
136
|
# Draws a polyline. The arguments are [<tt>x</tt>, <tt>y</tt>] pairs that
|
@@ -149,7 +143,7 @@ module Magick
|
|
149
143
|
@primitive = :polyline
|
150
144
|
@args = Magick::RVG.convert_to_float(*points)
|
151
145
|
end
|
152
|
-
end
|
146
|
+
end # class Polyline
|
153
147
|
|
154
148
|
class Image
|
155
149
|
include Stylable
|
@@ -162,22 +156,22 @@ module Magick
|
|
162
156
|
|
163
157
|
def align_to_viewport(scale)
|
164
158
|
tx = case @align
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
159
|
+
when 'none', /\AxMin/
|
160
|
+
0
|
161
|
+
when NilClass, /\AxMid/
|
162
|
+
(@width - @image.columns * scale) / 2.0
|
163
|
+
when /\AxMax/
|
164
|
+
@width - @image.columns * scale
|
165
|
+
end
|
172
166
|
|
173
167
|
ty = case @align
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
168
|
+
when 'none', /YMin\z/
|
169
|
+
0
|
170
|
+
when NilClass, /YMid\z/
|
171
|
+
(@height - @image.rows * scale) / 2.0
|
172
|
+
when /YMax\z/
|
173
|
+
@height - @image.rows * scale
|
174
|
+
end
|
181
175
|
[tx, ty]
|
182
176
|
end
|
183
177
|
|
@@ -188,7 +182,7 @@ module Magick
|
|
188
182
|
width = @width
|
189
183
|
height = @height
|
190
184
|
elsif @meet_or_slice == 'meet'
|
191
|
-
scale = [@width
|
185
|
+
scale = [@width / @image.columns, @height / @image.rows].min
|
192
186
|
width = @image.columns
|
193
187
|
height = @image.rows
|
194
188
|
else
|
@@ -199,12 +193,12 @@ module Magick
|
|
199
193
|
end
|
200
194
|
|
201
195
|
gc.clip_path(name)
|
202
|
-
scale = [@width
|
196
|
+
scale = [@width / @image.columns, @height / @image.rows].max
|
203
197
|
width = @image.columns
|
204
198
|
height = @image.rows
|
205
199
|
end
|
206
200
|
tx, ty = align_to_viewport(scale)
|
207
|
-
gc.composite(@x+tx, @y+ty, width*scale, height*scale, @image)
|
201
|
+
gc.composite(@x + tx, @y + ty, width * scale, height * scale, @image)
|
208
202
|
end
|
209
203
|
|
210
204
|
def init_viewbox
|
@@ -223,22 +217,22 @@ module Magick
|
|
223
217
|
super() # run module initializers
|
224
218
|
@image = image.copy # use a copy of the image in case app. re-uses the argument
|
225
219
|
@x, @y, @width, @height = Magick::RVG.convert_to_float(x, y, width || @image.columns, height || @image.rows)
|
226
|
-
if @width < 0 || @height < 0
|
227
|
-
|
228
|
-
end
|
220
|
+
raise ArgumentError, 'width, height must be >= 0' if @width < 0 || @height < 0
|
221
|
+
|
229
222
|
init_viewbox
|
230
223
|
end
|
231
224
|
|
232
225
|
def add_primitives(gc) #:nodoc:
|
233
226
|
# Do not render if width or height is 0
|
234
|
-
return if @width
|
227
|
+
return if @width.zero? || @height.zero?
|
228
|
+
|
235
229
|
gc.push
|
236
230
|
add_transform_primitives(gc)
|
237
231
|
add_style_primitives(gc)
|
238
232
|
add_composite_primitive(gc)
|
239
233
|
gc.pop
|
240
234
|
end
|
241
|
-
end
|
235
|
+
end # class Image
|
242
236
|
|
243
237
|
# Methods that construct basic shapes within a container
|
244
238
|
module ShapeConstructors
|
@@ -307,7 +301,7 @@ module Magick
|
|
307
301
|
@content << polyline
|
308
302
|
polyline
|
309
303
|
end
|
310
|
-
end
|
304
|
+
end # module ShapeContent
|
311
305
|
|
312
306
|
# Methods that reference ("use") other drawable objects within a container
|
313
307
|
module UseConstructors
|
@@ -321,7 +315,7 @@ module Magick
|
|
321
315
|
@content << use
|
322
316
|
use
|
323
317
|
end
|
324
|
-
end
|
318
|
+
end # module UseConstructors
|
325
319
|
|
326
320
|
# Methods that construct container objects within a container
|
327
321
|
module StructureConstructors
|
@@ -338,7 +332,7 @@ module Magick
|
|
338
332
|
y = Float(y)
|
339
333
|
rescue ArgumentError
|
340
334
|
args = [cols, rows, x, y]
|
341
|
-
raise ArgumentError, "at least one argument is not convertable to Float (got #{args.collect
|
335
|
+
raise ArgumentError, "at least one argument is not convertable to Float (got #{args.collect(&:class).join(', ')})"
|
342
336
|
end
|
343
337
|
rvg.corner(x, y)
|
344
338
|
@content << rvg
|
@@ -359,7 +353,7 @@ module Magick
|
|
359
353
|
@content << group
|
360
354
|
group
|
361
355
|
end
|
362
|
-
end
|
356
|
+
end # module StructureConstructors
|
363
357
|
|
364
358
|
# Methods that construct raster image objects within a container
|
365
359
|
module ImageConstructors
|
@@ -375,7 +369,7 @@ module Magick
|
|
375
369
|
@content << img
|
376
370
|
img
|
377
371
|
end
|
378
|
-
end
|
372
|
+
end # module ImageConstructors
|
379
373
|
|
380
374
|
# Methods that create shapes, text, and other drawable objects
|
381
375
|
# within container objects such as ::Magick::RVG and
|
@@ -386,6 +380,6 @@ module Magick
|
|
386
380
|
include TextConstructors
|
387
381
|
include UseConstructors
|
388
382
|
include ImageConstructors
|
389
|
-
end
|
383
|
+
end # module Embellishable
|
390
384
|
end # class RVG
|
391
385
|
end # module Magick
|