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.

Files changed (238) hide show
  1. checksums.yaml +5 -5
  2. data/.appveyor.yml +19 -0
  3. data/.circleci/config.yml +56 -0
  4. data/.rubocop.yml +8 -335
  5. data/.rubocop_todo.yml +255 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +6 -49
  8. data/CHANGELOG.md +23 -0
  9. data/CONTRIBUTING.md +34 -0
  10. data/Gemfile +0 -6
  11. data/README.textile +11 -3
  12. data/Rakefile +23 -15
  13. data/before_install_linux.sh +12 -15
  14. data/doc/ex/InitialCoords.rb +4 -4
  15. data/doc/ex/NewCoordSys.rb +4 -4
  16. data/doc/ex/OrigCoordSys.rb +2 -2
  17. data/doc/ex/PreserveAspectRatio.rb +34 -34
  18. data/doc/ex/RotateScale.rb +7 -7
  19. data/doc/ex/Skew.rb +7 -7
  20. data/doc/ex/Use01.rb +1 -1
  21. data/doc/ex/Use02.rb +4 -4
  22. data/doc/ex/Use03.rb +2 -2
  23. data/doc/ex/ViewBox.rb +4 -4
  24. data/doc/ex/affine.rb +5 -5
  25. data/doc/ex/affine_transform.rb +3 -3
  26. data/doc/ex/arc.rb +9 -9
  27. data/doc/ex/arcpath.rb +2 -2
  28. data/doc/ex/arcs01.rb +6 -6
  29. data/doc/ex/arcs02.rb +8 -8
  30. data/doc/ex/axes.rb +11 -11
  31. data/doc/ex/baseline_shift01.rb +5 -5
  32. data/doc/ex/bilevel_channel.rb +1 -1
  33. data/doc/ex/blur_image.rb +1 -1
  34. data/doc/ex/border.rb +1 -1
  35. data/doc/ex/bounding_box.rb +11 -11
  36. data/doc/ex/cbezier1.rb +12 -12
  37. data/doc/ex/cbezier2.rb +13 -13
  38. data/doc/ex/cbezier3.rb +13 -13
  39. data/doc/ex/cbezier4.rb +13 -13
  40. data/doc/ex/cbezier5.rb +13 -13
  41. data/doc/ex/cbezier6.rb +19 -19
  42. data/doc/ex/channel.rb +2 -2
  43. data/doc/ex/chop.rb +2 -2
  44. data/doc/ex/circle.rb +7 -7
  45. data/doc/ex/circle01.rb +2 -2
  46. data/doc/ex/clip_path.rb +6 -6
  47. data/doc/ex/coalesce.rb +6 -6
  48. data/doc/ex/color_fill_to_border.rb +8 -8
  49. data/doc/ex/color_floodfill.rb +8 -8
  50. data/doc/ex/color_histogram.rb +2 -2
  51. data/doc/ex/color_reset.rb +2 -2
  52. data/doc/ex/colors.rb +4 -4
  53. data/doc/ex/compose_mask.rb +2 -2
  54. data/doc/ex/composite.rb +39 -39
  55. data/doc/ex/composite_layers.rb +1 -2
  56. data/doc/ex/contrast.rb +3 -3
  57. data/doc/ex/crop.rb +2 -2
  58. data/doc/ex/crop_with_gravity.rb +5 -5
  59. data/doc/ex/cubic01.rb +12 -12
  60. data/doc/ex/cubic02.rb +22 -22
  61. data/doc/ex/cycle_colormap.rb +3 -3
  62. data/doc/ex/dissolve.rb +0 -0
  63. data/doc/ex/drawcomp.rb +8 -9
  64. data/doc/ex/drop_shadow.rb +4 -4
  65. data/doc/ex/ellipse.rb +9 -9
  66. data/doc/ex/ellipse01.rb +3 -3
  67. data/doc/ex/enhance.rb +2 -2
  68. data/doc/ex/evenodd.rb +19 -19
  69. data/doc/ex/fill_pattern.rb +3 -3
  70. data/doc/ex/flatten_images.rb +1 -1
  71. data/doc/ex/font_styles.rb +13 -13
  72. data/doc/ex/fonts.rb +2 -6
  73. data/doc/ex/frame.rb +1 -1
  74. data/doc/ex/get_multiline_type_metrics.rb +3 -3
  75. data/doc/ex/get_pixels.rb +4 -6
  76. data/doc/ex/get_type_metrics.rb +26 -25
  77. data/doc/ex/gradientfill.rb +2 -2
  78. data/doc/ex/grav.rb +12 -12
  79. data/doc/ex/gravity.rb +14 -16
  80. data/doc/ex/group.rb +11 -11
  81. data/doc/ex/hatchfill.rb +2 -2
  82. data/doc/ex/image.rb +9 -9
  83. data/doc/ex/implode.rb +2 -2
  84. data/doc/ex/line.rb +10 -10
  85. data/doc/ex/line01.rb +7 -7
  86. data/doc/ex/mask.rb +0 -0
  87. data/doc/ex/matte_fill_to_border.rb +3 -3
  88. data/doc/ex/matte_floodfill.rb +2 -2
  89. data/doc/ex/matte_replace.rb +3 -3
  90. data/doc/ex/median_filter.rb +2 -2
  91. data/doc/ex/mono.rb +2 -2
  92. data/doc/ex/morph.rb +1 -1
  93. data/doc/ex/mosaic.rb +7 -5
  94. data/doc/ex/motion_blur.rb +1 -1
  95. data/doc/ex/negate_channel.rb +0 -0
  96. data/doc/ex/nested_rvg.rb +2 -2
  97. data/doc/ex/nonzero.rb +19 -19
  98. data/doc/ex/opacity.rb +9 -9
  99. data/doc/ex/path.rb +17 -17
  100. data/doc/ex/pattern1.rb +4 -4
  101. data/doc/ex/pattern2.rb +2 -2
  102. data/doc/ex/polaroid.rb +0 -1
  103. data/doc/ex/polygon.rb +7 -7
  104. data/doc/ex/polygon01.rb +7 -7
  105. data/doc/ex/polyline.rb +7 -7
  106. data/doc/ex/polyline01.rb +8 -8
  107. data/doc/ex/posterize.rb +0 -0
  108. data/doc/ex/qbezierpath.rb +16 -16
  109. data/doc/ex/quad01.rb +6 -6
  110. data/doc/ex/quantize-m.rb +2 -2
  111. data/doc/ex/random_threshold_channel.rb +1 -1
  112. data/doc/ex/rect01.rb +2 -2
  113. data/doc/ex/rect02.rb +3 -3
  114. data/doc/ex/rectangle.rb +6 -6
  115. data/doc/ex/reduce_noise.rb +2 -2
  116. data/doc/ex/remap.rb +0 -0
  117. data/doc/ex/resize_to_fill.rb +0 -0
  118. data/doc/ex/resize_to_fit.rb +0 -0
  119. data/doc/ex/roll.rb +1 -1
  120. data/doc/ex/rotate.rb +8 -8
  121. data/doc/ex/rotate_f.rb +1 -1
  122. data/doc/ex/roundrect.rb +6 -6
  123. data/doc/ex/rubyname.rb +4 -4
  124. data/doc/ex/rvg_clippath.rb +3 -3
  125. data/doc/ex/rvg_linecap.rb +7 -7
  126. data/doc/ex/rvg_linejoin.rb +7 -7
  127. data/doc/ex/rvg_opacity.rb +5 -5
  128. data/doc/ex/rvg_pattern.rb +8 -8
  129. data/doc/ex/rvg_stroke_dasharray.rb +2 -2
  130. data/doc/ex/sepiatone.rb +0 -0
  131. data/doc/ex/shadow.rb +6 -6
  132. data/doc/ex/shear.rb +2 -2
  133. data/doc/ex/skewx.rb +8 -8
  134. data/doc/ex/skewy.rb +9 -9
  135. data/doc/ex/smile.rb +5 -4
  136. data/doc/ex/sparse_color.rb +0 -4
  137. data/doc/ex/splice.rb +1 -1
  138. data/doc/ex/stegano.rb +4 -5
  139. data/doc/ex/stroke_dasharray.rb +10 -10
  140. data/doc/ex/stroke_fill.rb +2 -2
  141. data/doc/ex/stroke_linecap.rb +12 -12
  142. data/doc/ex/stroke_linejoin.rb +12 -12
  143. data/doc/ex/stroke_width.rb +11 -11
  144. data/doc/ex/swirl.rb +2 -2
  145. data/doc/ex/text.rb +6 -6
  146. data/doc/ex/text01.rb +4 -4
  147. data/doc/ex/text_align.rb +5 -5
  148. data/doc/ex/text_antialias.rb +2 -2
  149. data/doc/ex/text_styles.rb +8 -8
  150. data/doc/ex/text_undercolor.rb +4 -4
  151. data/doc/ex/texture_fill_to_border.rb +8 -8
  152. data/doc/ex/texture_floodfill.rb +8 -8
  153. data/doc/ex/texturefill.rb +2 -2
  154. data/doc/ex/threshold.rb +2 -2
  155. data/doc/ex/to_blob.rb +1 -1
  156. data/doc/ex/translate.rb +8 -8
  157. data/doc/ex/transparent.rb +6 -6
  158. data/doc/ex/transpose.rb +0 -0
  159. data/doc/ex/transverse.rb +0 -0
  160. data/doc/ex/tref01.rb +6 -6
  161. data/doc/ex/triangle01.rb +2 -2
  162. data/doc/ex/trim.rb +2 -2
  163. data/doc/ex/tspan01.rb +5 -5
  164. data/doc/ex/tspan02.rb +5 -5
  165. data/doc/ex/tspan03.rb +5 -5
  166. data/doc/ex/unsharp_mask.rb +3 -3
  167. data/doc/ex/viewex.rb +5 -5
  168. data/doc/ex/vignette.rb +0 -0
  169. data/doc/ex/watermark.rb +6 -6
  170. data/doc/ex/wet_floor.rb +2 -2
  171. data/doc/ex/writing_mode01.rb +12 -12
  172. data/doc/ex/writing_mode02.rb +12 -12
  173. data/examples/constitute.rb +1 -1
  174. data/examples/crop_with_gravity.rb +5 -5
  175. data/examples/demo.rb +6 -7
  176. data/examples/describe.rb +8 -10
  177. data/examples/find_similar_region.rb +3 -3
  178. data/examples/histogram.rb +192 -201
  179. data/examples/identify.rb +62 -73
  180. data/examples/image_opacity.rb +0 -1
  181. data/examples/import_export.rb +1 -1
  182. data/examples/pattern_fill.rb +3 -4
  183. data/examples/rotating_text.rb +5 -4
  184. data/examples/spinner.rb +5 -5
  185. data/examples/thumbnail.rb +3 -3
  186. data/examples/vignette.rb +5 -5
  187. data/ext/RMagick/extconf.rb +213 -230
  188. data/ext/RMagick/rmagick.c +1 -0
  189. data/ext/RMagick/rmagick.h +26 -29
  190. data/ext/RMagick/rmdraw.c +3 -38
  191. data/ext/RMagick/rmenum.c +36 -0
  192. data/ext/RMagick/rmimage.c +166 -10
  193. data/ext/RMagick/rminfo.c +7 -2
  194. data/ext/RMagick/rmkinfo.c +247 -0
  195. data/ext/RMagick/rmmain.c +96 -0
  196. data/ext/RMagick/rmutil.c +4 -0
  197. data/lib/rmagick/version.rb +3 -3
  198. data/lib/rmagick_internal.rb +226 -308
  199. data/lib/rvg/clippath.rb +2 -4
  200. data/lib/rvg/container.rb +25 -22
  201. data/lib/rvg/deep_equal.rb +11 -11
  202. data/lib/rvg/describable.rb +2 -2
  203. data/lib/rvg/embellishable.rb +60 -66
  204. data/lib/rvg/misc.rb +122 -128
  205. data/lib/rvg/pathdata.rb +15 -17
  206. data/lib/rvg/rvg.rb +41 -44
  207. data/lib/rvg/stretchable.rb +22 -28
  208. data/lib/rvg/stylable.rb +10 -10
  209. data/lib/rvg/text.rb +164 -165
  210. data/lib/rvg/transformable.rb +15 -15
  211. data/lib/rvg/units.rb +2 -2
  212. data/rmagick.gemspec +9 -33
  213. data/spec/rmagick/draw_spec.rb +5 -6
  214. data/spec/rmagick/image/blue_shift_spec.rb +1 -3
  215. data/spec/rmagick/image/channel_entropy_spec.rb +9 -0
  216. data/spec/rmagick/image/composite_spec.rb +2 -4
  217. data/spec/rmagick/image/constitute_spec.rb +2 -4
  218. data/spec/rmagick/image/dispatch_spec.rb +1 -3
  219. data/spec/rmagick/image/from_blob_spec.rb +1 -3
  220. data/spec/rmagick/image/ping_spec.rb +1 -3
  221. data/spec/rmagick/image/properties_spec.rb +0 -2
  222. data/spec/rmagick/image/read_spec.rb +28 -0
  223. data/spec/spec_helper.rb +7 -1
  224. data/spec/support/issue_200/app.rb +8 -0
  225. data/test/Image1.rb +70 -70
  226. data/test/Image2.rb +369 -361
  227. data/test/Image3.rb +64 -63
  228. data/test/ImageList1.rb +796 -792
  229. data/test/ImageList2.rb +43 -44
  230. data/test/Image_attributes.rb +26 -48
  231. data/test/Import_Export.rb +71 -77
  232. data/test/Info.rb +30 -31
  233. data/test/Magick.rb +47 -46
  234. data/test/Pixel.rb +24 -24
  235. data/test/Preview.rb +7 -6
  236. data/test/test_all_basic.rb +15 -7
  237. data/test/tmpnam_test.rb +3 -3
  238. metadata +57 -18
@@ -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 ['userSpaceOnUse', 'objectBoundingBox'].include?(clip_path_units)
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, style) #:nodoc:
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)
@@ -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 #:nodoc:
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 << case
17
- when c.nil?
18
- nil
19
- when c.respond_to?(:deep_copy)
20
- c.deep_copy(h)
21
- when c.respond_to?(:dup)
22
- c.dup rescue c
23
- else
24
- c
25
- end
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 # class Content
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
- include Stylable
53
- include Transformable
54
- include Embellishable
55
- include Describable
56
- include Duplicatable
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) #:nodoc:
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, width, height) #:nodoc:
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) #:nodoc:
82
+ def <<(obj) #:nodoc:
80
83
  @content << obj
81
84
  end
82
- end # class Group
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) #:nodoc:
116
+ def add_primitives(gc) #:nodoc:
114
117
  gc.push
115
118
  add_transform_primitives(gc)
116
119
  add_style_primitives(gc)
@@ -30,17 +30,17 @@ module Magick
30
30
  end
31
31
  else
32
32
  case itv
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
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
@@ -11,7 +11,7 @@ module Magick
11
11
  module Describable
12
12
  private
13
13
 
14
- def initialize(*args, &block) #:nodoc:
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 # module Describable
45
+ end # module Describable
46
46
  end # class RVG
47
47
  end # module Magick
@@ -5,7 +5,7 @@
5
5
  module Magick
6
6
  class RVG
7
7
  # Parent class of Circle, Ellipse, Text, etc.
8
- class Shape #:nodoc:
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 # class Shape
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
- fail ArgumentError, "radius must be >= 0 (#{r} given)"
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 # class Circle
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
- fail ArgumentError, "radii must be >= 0 (#{rx}, #{ry} given)"
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 # class Ellipse
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 # class Line
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 # class Path
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
- fail ArgumentError, "width, height must be >= 0 (#{width}, #{height} given)"
84
- end
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
- fail ArgumentError, "rx, ry must be >= 0 (#{rx}, #{ry} given)"
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
- when 1
106
- points = Array(points[0])
107
- when 2
108
- x_coords = Array(points[0])
109
- y_coords = Array(points[1])
110
- unless x_coords.length > 0 && y_coords.length > 0
111
- fail ArgumentError, 'array arguments must contain at least one point'
112
- end
113
- n = x_coords.length - y_coords.length
114
- short = n > 0 ? y_coords : x_coords
115
- olen = short.length
116
- n.abs.times {|x| short << short[x % olen]}
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
- fail ArgumentError, "insufficient/odd number of points specified: #{n}"
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 # class Polygon
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 # class Polyline
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
- when 'none', /\AxMin/
166
- 0
167
- when NilClass, /\AxMid/
168
- (@width - @image.columns*scale) / 2.0
169
- when /\AxMax/
170
- @width - @image.columns*scale
171
- end
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
- when 'none', /YMin\z/
175
- 0
176
- when NilClass, /YMid\z/
177
- (@height - @image.rows*scale) / 2.0
178
- when /YMax\z/
179
- @height - @image.rows*scale
180
- end
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/@image.columns, @height/@image.rows].min
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/@image.columns, @height/@image.rows].max
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
- fail ArgumentError, 'width, height must be >= 0'
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 == 0 || @height == 0
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 # class Image
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 # module ShapeContent
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 # module UseConstructors
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 {|a| a.class}.join(', ')})"
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 # module StructureConstructors
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 # module ImageConstructors
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 # module Embellishable
383
+ end # module Embellishable
390
384
  end # class RVG
391
385
  end # module Magick