rmagick 3.0.0 → 3.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.

Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.appveyor.yml +32 -6
  3. data/.circleci/config.yml +1 -1
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +9 -9
  6. data/.rubocop_todo.yml +351 -17
  7. data/.travis.yml +14 -1
  8. data/CHANGELOG.md +55 -0
  9. data/CONTRIBUTING.md +11 -18
  10. data/README.textile +2 -2
  11. data/Rakefile +1 -1
  12. data/before_install_linux.sh +56 -19
  13. data/doc/ex/sparse_color.rb +5 -0
  14. data/doc/magick.html +9 -4
  15. data/doc/rvg.html +2 -2
  16. data/doc/rvgtut.html +1 -1
  17. data/examples/histogram.rb +1 -1
  18. data/ext/RMagick/extconf.rb +90 -264
  19. data/ext/RMagick/rmagick.c +28 -6
  20. data/ext/RMagick/rmagick.h +53 -199
  21. data/ext/RMagick/rmdraw.c +52 -70
  22. data/ext/RMagick/rmenum.c +332 -274
  23. data/ext/RMagick/rmfill.c +62 -112
  24. data/ext/RMagick/rmilist.c +27 -62
  25. data/ext/RMagick/rmimage.c +424 -634
  26. data/ext/RMagick/rminfo.c +46 -37
  27. data/ext/RMagick/rmkinfo.c +47 -42
  28. data/ext/RMagick/rmmain.c +125 -180
  29. data/ext/RMagick/rmmontage.c +5 -5
  30. data/ext/RMagick/rmpixel.c +133 -62
  31. data/ext/RMagick/rmstruct.c +14 -181
  32. data/ext/RMagick/rmutil.c +195 -111
  33. data/lib/rmagick/version.rb +2 -3
  34. data/lib/rvg/deep_equal.rb +1 -1
  35. data/lib/rvg/misc.rb +4 -4
  36. data/lib/rvg/units.rb +2 -2
  37. data/rmagick.gemspec +2 -2
  38. data/spec/rmagick/ImageList1_spec.rb +2 -2
  39. data/spec/rmagick/draw_spec.rb +4 -4
  40. data/spec/rmagick/image/composite_spec.rb +6 -1
  41. data/spec/rmagick/image/properties_spec.rb +8 -8
  42. data/test/Draw.rb +414 -0
  43. data/test/Enum.rb +76 -0
  44. data/test/Fill.rb +93 -0
  45. data/test/Image1.rb +9 -1
  46. data/test/Image2.rb +14 -4
  47. data/test/Image3.rb +73 -3
  48. data/test/ImageList1.rb +22 -9
  49. data/test/ImageList2.rb +41 -9
  50. data/test/Image_attributes.rb +45 -8
  51. data/test/Info.rb +102 -6
  52. data/test/Magick.rb +8 -1
  53. data/test/PolaroidOptions.rb +23 -0
  54. data/test/test_all_basic.rb +4 -0
  55. metadata +28 -8
  56. data/.hound.yml +0 -2
  57. data/wercker.yml +0 -10
@@ -1,6 +1,5 @@
1
1
  module Magick
2
- VERSION = '3.0.0'
2
+ VERSION = '3.1.0'
3
3
  MIN_RUBY_VERSION = '2.3.0'
4
- MIN_IM_VERSION = '6.8.9'
5
- MIN_WAND_VERSION = '6.9.0'
4
+ MIN_IM_VERSION = '6.7.7'
6
5
  end
@@ -30,7 +30,7 @@ module Magick
30
30
  end
31
31
  else
32
32
  case itv
33
- when Float, Symbol, TrueClass, FalseClass, Fixnum, NilClass
33
+ when Float, Symbol, TrueClass, FalseClass, Integer, NilClass
34
34
  return false if itv != otv
35
35
  else
36
36
  if itv.equal?(otv)
@@ -14,7 +14,7 @@ module Magick
14
14
  ivars = instance_variables
15
15
  ivars.each do |ivar|
16
16
  ivalue = instance_variable_get(ivar)
17
- cvalue = if ivalue.is_a?(NilClass) || ivalue.is_a?(Symbol) || ivalue.is_a?(Float) || ivalue.is_a?(Fixnum) || ivalue.is_a?(FalseClass) || ivalue.is_a?(TrueClass)
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
18
  ivalue
19
19
  elsif ivalue.respond_to?(:deep_copy)
20
20
  ivalue.deep_copy(h)
@@ -452,9 +452,9 @@ module Magick
452
452
  }
453
453
 
454
454
  FONT_WEIGHT = {
455
- 'normal' => Magick::NormalWeight,
456
- 'bold' => Magick::BoldWeight,
457
- 'bolder' => Magick::BolderWeight,
455
+ 'normal' => Magick::NormalWeight,
456
+ 'bold' => Magick::BoldWeight,
457
+ 'bolder' => Magick::BolderWeight,
458
458
  'lighter' => Magick::LighterWeight
459
459
  }
460
460
 
@@ -2,12 +2,12 @@
2
2
  # Copyright (C) 2009 Timothy P. Hunter
3
3
  module Magick
4
4
  class RVG
5
- # Define RVG.dpi and RVG.dpi=. Add conversions to Fixnum and Float classes
5
+ # Define RVG.dpi and RVG.dpi=. Add conversions to Integer and Float classes
6
6
  class << self
7
7
  attr_reader :dpi
8
8
  def dpi=(n)
9
9
  unless defined?(@dpi)
10
- [Float, Fixnum].each do |c|
10
+ [Float, Integer].each do |c|
11
11
  c.class_eval <<-END_DEFS
12
12
  # the default measurement - 1px is 1 pixel
13
13
  def px
@@ -26,14 +26,14 @@ Gem::Specification.new do |s|
26
26
 
27
27
  s.rubyforge_project = 'rmagick'
28
28
  s.extensions = %w[ext/RMagick/extconf.rb]
29
- s.has_rdoc = false
30
29
  s.required_ruby_version = ">= #{Magick::MIN_RUBY_VERSION}"
31
30
  s.requirements << "ImageMagick #{Magick::MIN_IM_VERSION} or later"
32
31
 
33
32
  s.add_development_dependency 'rake-compiler', '~> 1.0'
34
33
  s.add_development_dependency 'rspec', '~> 3.8'
35
34
  s.add_development_dependency 'rspec_junit_formatter', '~> 0.4.1'
36
- s.add_development_dependency 'rubocop', '0.64.0'
35
+ s.add_development_dependency 'rubocop', '~> 0.64.0'
36
+ s.add_development_dependency 'rubocop-rspec', '~> 1.32.0'
37
37
  s.add_development_dependency 'simplecov', '~> 0.16.1'
38
38
  s.add_development_dependency 'test-unit', '~> 2.5'
39
39
  end
@@ -3,7 +3,7 @@ RSpec.describe Magick::ImageList do
3
3
  it 'works with identical instances' do
4
4
  expect do
5
5
  img = Magick::Image.new(1, 1)
6
- list = Magick::ImageList.new
6
+ list = described_class.new
7
7
  list << img << img
8
8
  res = list.append(false)
9
9
  expect(res.columns).to eq(2)
@@ -13,7 +13,7 @@ RSpec.describe Magick::ImageList do
13
13
  expect do
14
14
  img = Magick::Image.new(1, 1)
15
15
  img2 = Magick::Image.new(3, 3)
16
- list = Magick::ImageList.new
16
+ list = described_class.new
17
17
  list.concat([img, img2, img, img2, img])
18
18
  res = list.append(false)
19
19
  expect(res.columns).to eq(9)
@@ -5,24 +5,24 @@ class Magick::Draw
5
5
  end
6
6
 
7
7
  RSpec.describe Magick::Draw do
8
- let(:draw) { Magick::Draw.new }
8
+ let(:draw) { described_class.new }
9
9
 
10
10
  describe '._dummy_img_' do
11
11
  it 'works' do
12
12
  # initially this variable is not defined.
13
- expect { Magick::Draw._dummy_img_ }.to raise_error(NameError)
13
+ expect { described_class._dummy_img_ }.to raise_error(NameError)
14
14
 
15
15
  # cause it to become defined. save the object id.
16
16
  draw.get_type_metrics('ABCDEF')
17
17
  dummy = nil
18
- expect { dummy = Magick::Draw._dummy_img_ }.not_to raise_error
18
+ expect { dummy = described_class._dummy_img_ }.not_to raise_error
19
19
 
20
20
  expect(dummy).to be_instance_of(Magick::Image)
21
21
 
22
22
  # ensure that it is always the same object
23
23
  draw.get_type_metrics('ABCDEF')
24
24
  dummy2 = nil
25
- expect { dummy2 = Magick::Draw._dummy_img_ }.not_to raise_error
25
+ expect { dummy2 = described_class._dummy_img_ }.not_to raise_error
26
26
  expect(dummy).to eq dummy2
27
27
  end
28
28
  end
@@ -55,7 +55,12 @@ RSpec.describe Magick::Image, '#composite' do
55
55
  Magick::ColorDodgeCompositeOp,
56
56
  Magick::ExclusionCompositeOp,
57
57
  Magick::HardLightCompositeOp,
58
- Magick::SoftLightCompositeOp
58
+ Magick::SoftLightCompositeOp,
59
+ Magick::MathematicsCompositeOp,
60
+ Magick::DivideSrcCompositeOp,
61
+ Magick::MinusSrcCompositeOp,
62
+ Magick::DarkenIntensityCompositeOp,
63
+ Magick::LightenIntensityCompositeOp
59
64
  ]
60
65
  end
61
66
  let(:gravity) do
@@ -3,25 +3,25 @@ RSpec.describe Magick::Image, '#properties' do
3
3
  let(:freeze_error) { RUBY_VERSION[/^1\.9|^2/] ? RuntimeError : TypeError }
4
4
 
5
5
  before(:each) do
6
- img['a'] = 'str_1'
7
- img['b'] = 'str_2'
8
- img['c'] = 'str_3'
6
+ img['comment'] = 'str_1'
7
+ img['label'] = 'str_2'
8
+ img['jpeg:sampling-factor'] = '2x1,1x1,1x1'
9
9
  end
10
10
 
11
11
  it 'allows assignment of arbitrary properties' do
12
- expect(img['a']).to eq 'str_1'
13
- expect(img['b']).to eq 'str_2'
14
- expect(img['c']).to eq 'str_3'
12
+ expect(img['comment']).to eq 'str_1'
13
+ expect(img['label']).to eq 'str_2'
14
+ expect(img['jpeg:sampling-factor']).to eq '2x1,1x1,1x1'
15
15
  expect(img['d']).to be nil
16
16
  end
17
17
 
18
18
  it 'returns a hash of assigned properties' do
19
- expected_properties = { 'a' => 'str_1', 'b' => 'str_2', 'c' => 'str_3' }
19
+ expected_properties = { 'comment' => 'str_1', 'label' => 'str_2', 'jpeg:sampling-factor' => '2x1,1x1,1x1' }
20
20
  expect(img.properties).to eq(expected_properties)
21
21
  end
22
22
 
23
23
  it 'raises an error when trying to assign properties to a frozen image' do
24
24
  img.freeze
25
- expect { img['d'] = 'str_4' }.to raise_error(freeze_error)
25
+ expect { img['comment'] = 'str_4' }.to raise_error(freeze_error)
26
26
  end
27
27
  end
@@ -0,0 +1,414 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require 'rmagick'
4
+ require 'test/unit'
5
+ require 'test/unit/ui/console/testrunner' unless RUBY_VERSION[/^1\.9|^2/]
6
+
7
+ class DrawUT < Test::Unit::TestCase
8
+ def setup
9
+ @draw = Magick::Draw.new
10
+ end
11
+
12
+ def test_affine
13
+ assert_nothing_raised do
14
+ @draw.affine = Magick::AffineMatrix.new(1, 2, 3, 4, 5, 6)
15
+ end
16
+ assert_raise(TypeError) { @draw.affine = [1, 2, 3, 4, 5, 6] }
17
+ end
18
+
19
+ def test_align
20
+ assert_nothing_raised { @draw.align = Magick::UndefinedAlign }
21
+ assert_nothing_raised { @draw.align = Magick::LeftAlign }
22
+ assert_nothing_raised { @draw.align = Magick::CenterAlign }
23
+ assert_nothing_raised { @draw.align = Magick::RightAlign }
24
+ end
25
+
26
+ def test_decorate
27
+ assert_nothing_raised { @draw.decorate = Magick::NoDecoration }
28
+ assert_nothing_raised { @draw.decorate = Magick::UnderlineDecoration }
29
+ assert_nothing_raised { @draw.decorate = Magick::OverlineDecoration }
30
+ assert_nothing_raised { @draw.decorate = Magick::LineThroughDecoration }
31
+ end
32
+
33
+ def test_density
34
+ assert_nothing_raised { @draw.density = '90x90' }
35
+ assert_nothing_raised { @draw.density = 'x90' }
36
+ assert_nothing_raised { @draw.density = '90' }
37
+ assert_raise(TypeError) { @draw.density = 2 }
38
+ end
39
+
40
+ def test_encoding
41
+ assert_nothing_raised { @draw.encoding = 'AdobeCustom' }
42
+ assert_raise(TypeError) { @draw.encoding = 2 }
43
+ end
44
+
45
+ def test_fill
46
+ assert_nothing_raised { @draw.fill = 'white' }
47
+ assert_nothing_raised { @draw.fill = Magick::Pixel.from_color('white') }
48
+ assert_raise(TypeError) { @draw.fill = 2 }
49
+ end
50
+
51
+ def test_fill_pattern
52
+ assert_nothing_raised { @draw.fill_pattern = nil }
53
+ assert_nothing_raised do
54
+ img1 = Magick::Image.new(10, 10)
55
+ img2 = Magick::Image.new(20, 20)
56
+
57
+ @draw.fill_pattern = img1
58
+ @draw.fill_pattern = img2
59
+ end
60
+
61
+ assert_raise(NoMethodError) { @draw.fill_pattern = 'x' }
62
+ end
63
+
64
+ def test_font
65
+ assert_nothing_raised { @draw.font = 'Arial-Bold' }
66
+ assert_raise(TypeError) { @draw.font = 2 }
67
+ end
68
+
69
+ def test_font_family
70
+ assert_nothing_raised { @draw.font_family = 'Arial' }
71
+ assert_raise(TypeError) { @draw.font_family = 2 }
72
+ end
73
+
74
+ def test_font_stretch
75
+ assert_nothing_raised { @draw.font_stretch = Magick::NormalStretch }
76
+ assert_nothing_raised { @draw.font_stretch = Magick::UltraCondensedStretch }
77
+ assert_nothing_raised { @draw.font_stretch = Magick::ExtraCondensedStretch }
78
+ assert_nothing_raised { @draw.font_stretch = Magick::CondensedStretch }
79
+ assert_nothing_raised { @draw.font_stretch = Magick::SemiCondensedStretch }
80
+ assert_nothing_raised { @draw.font_stretch = Magick::SemiExpandedStretch }
81
+ assert_nothing_raised { @draw.font_stretch = Magick::ExpandedStretch }
82
+ assert_nothing_raised { @draw.font_stretch = Magick::ExtraExpandedStretch }
83
+ assert_nothing_raised { @draw.font_stretch = Magick::UltraExpandedStretch }
84
+ assert_nothing_raised { @draw.font_stretch = Magick::AnyStretch }
85
+
86
+ assert_raise(TypeError) { @draw.font_stretch = 2 }
87
+ end
88
+
89
+ def test_font_style
90
+ assert_nothing_raised { @draw.font_style = Magick::NormalStyle }
91
+ assert_nothing_raised { @draw.font_style = Magick::ItalicStyle }
92
+ assert_nothing_raised { @draw.font_style = Magick::ObliqueStyle }
93
+ assert_nothing_raised { @draw.font_style = Magick::AnyStyle }
94
+
95
+ assert_raise(TypeError) { @draw.font_style = 2 }
96
+ end
97
+
98
+ def test_font_weight
99
+ assert_nothing_raised { @draw.font_weight = Magick::AnyWeight }
100
+ assert_nothing_raised { @draw.font_weight = Magick::NormalWeight }
101
+ assert_nothing_raised { @draw.font_weight = Magick::BoldWeight }
102
+ assert_nothing_raised { @draw.font_weight = Magick::BolderWeight }
103
+ assert_nothing_raised { @draw.font_weight = Magick::LighterWeight }
104
+ assert_nothing_raised { @draw.font_weight = 200 }
105
+
106
+ assert_raise(ArgumentError) { @draw.font_weight = 99 }
107
+ assert_raise(ArgumentError) { @draw.font_weight = 901 }
108
+ end
109
+
110
+ def test_gravity
111
+ assert_nothing_raised { @draw.gravity = Magick::UndefinedGravity }
112
+ assert_nothing_raised { @draw.gravity = Magick::ForgetGravity }
113
+ assert_nothing_raised { @draw.gravity = Magick::NorthWestGravity }
114
+ assert_nothing_raised { @draw.gravity = Magick::NorthGravity }
115
+ assert_nothing_raised { @draw.gravity = Magick::NorthEastGravity }
116
+ assert_nothing_raised { @draw.gravity = Magick::WestGravity }
117
+ assert_nothing_raised { @draw.gravity = Magick::CenterGravity }
118
+ assert_nothing_raised { @draw.gravity = Magick::EastGravity }
119
+ assert_nothing_raised { @draw.gravity = Magick::SouthWestGravity }
120
+ assert_nothing_raised { @draw.gravity = Magick::SouthGravity }
121
+ assert_nothing_raised { @draw.gravity = Magick::SouthEastGravity }
122
+ assert_nothing_raised { @draw.gravity = Magick::StaticGravity }
123
+
124
+ assert_raise(TypeError) { @draw.gravity = 2 }
125
+ end
126
+
127
+ def test_interline_spacing
128
+ assert_nothing_raised { @draw.interline_spacing = 2 }
129
+ assert_raise(TypeError) { @draw.interline_spacing = 'x' }
130
+ end
131
+
132
+ def test_interword_spacing
133
+ assert_nothing_raised { @draw.interword_spacing = 2 }
134
+ assert_raise(TypeError) { @draw.interword_spacing = 'x' }
135
+ end
136
+
137
+ def test_kerning
138
+ assert_nothing_raised { @draw.kerning = 2 }
139
+ assert_raise(TypeError) { @draw.kerning = 'x' }
140
+ end
141
+
142
+ def test_pointsize
143
+ assert_nothing_raised { @draw.pointsize = 2 }
144
+ assert_raise(TypeError) { @draw.pointsize = 'x' }
145
+ end
146
+
147
+ def test_rotation
148
+ assert_nothing_raised { @draw.rotation = 15 }
149
+ assert_raise(TypeError) { @draw.rotation = 'x' }
150
+ end
151
+
152
+ def test_stroke
153
+ assert_nothing_raised { @draw.stroke = Magick::Pixel.from_color('white') }
154
+ assert_nothing_raised { @draw.stroke = 'white' }
155
+ assert_raise(TypeError) { @draw.stroke = 2 }
156
+ end
157
+
158
+ def test_stroke_pattern
159
+ assert_nothing_raised { @draw.stroke_pattern = nil }
160
+ assert_nothing_raised do
161
+ img1 = Magick::Image.new(10, 10)
162
+ img2 = Magick::Image.new(20, 20)
163
+
164
+ @draw.stroke_pattern = img1
165
+ @draw.stroke_pattern = img2
166
+ end
167
+
168
+ assert_raise(NoMethodError) { @draw.stroke_pattern = 'x' }
169
+ end
170
+
171
+ def test_stroke_width
172
+ assert_nothing_raised { @draw.stroke_width = 15 }
173
+ assert_raise(TypeError) { @draw.stroke_width = 'x' }
174
+ end
175
+
176
+ def test_text_antialias
177
+ assert_nothing_raised { @draw.text_antialias = true }
178
+ assert_nothing_raised { @draw.text_antialias = false }
179
+ end
180
+
181
+ def test_tile
182
+ assert_nothing_raised { @draw.tile = nil }
183
+ assert_nothing_raised do
184
+ img1 = Magick::Image.new(10, 10)
185
+ img2 = Magick::Image.new(20, 20)
186
+
187
+ @draw.tile = img1
188
+ @draw.tile = img2
189
+ end
190
+ end
191
+
192
+ def test_undercolor
193
+ assert_nothing_raised { @draw.undercolor = Magick::Pixel.from_color('white') }
194
+ assert_nothing_raised { @draw.undercolor = 'white' }
195
+ assert_raise(TypeError) { @draw.undercolor = 2 }
196
+ end
197
+
198
+ def test_annotate
199
+ assert_nothing_raised do
200
+ img = Magick::Image.new(10, 10)
201
+ @draw.annotate(img, 0, 0, 0, 20, 'Hello world')
202
+
203
+ yield_obj = nil
204
+ @draw.annotate(img, 100, 100, 20, 20, 'Hello world 2') do |draw|
205
+ yield_obj = draw
206
+ end
207
+ assert_instance_of(Magick::Draw, yield_obj)
208
+ end
209
+
210
+ assert_raise(TypeError) do
211
+ img = Magick::Image.new(10, 10)
212
+ @draw.annotate(img, 0, 0, 0, 20, nil)
213
+ end
214
+
215
+ assert_raise(NoMethodError) { @draw.annotate('x', 0, 0, 0, 20, 'Hello world') }
216
+ end
217
+
218
+ def test_dup
219
+ @draw.path('M110,100 h-75 a75,75 0 1,0 75,-75 z')
220
+ @draw.taint
221
+ @draw.freeze
222
+ dup = @draw.dup
223
+ assert_instance_of(Magick::Draw, dup)
224
+ end
225
+
226
+ def test_clone
227
+ @draw.taint
228
+ @draw.freeze
229
+ clone = @draw.clone
230
+ assert_instance_of(Magick::Draw, clone)
231
+ end
232
+
233
+ def test_composite
234
+ composite_operators = [
235
+ Magick::AddCompositeOp,
236
+ Magick::AtopCompositeOp,
237
+ Magick::BlendCompositeOp,
238
+ Magick::BlurCompositeOp,
239
+ Magick::BumpmapCompositeOp,
240
+ Magick::ChangeMaskCompositeOp,
241
+ Magick::ClearCompositeOp,
242
+ Magick::ColorBurnCompositeOp,
243
+ Magick::ColorDodgeCompositeOp,
244
+ Magick::ColorizeCompositeOp,
245
+ Magick::CopyBlackCompositeOp,
246
+ Magick::CopyBlueCompositeOp,
247
+ Magick::CopyCompositeOp,
248
+ Magick::CopyCyanCompositeOp,
249
+ Magick::CopyGreenCompositeOp,
250
+ Magick::CopyMagentaCompositeOp,
251
+ Magick::CopyOpacityCompositeOp,
252
+ Magick::CopyRedCompositeOp,
253
+ Magick::CopyYellowCompositeOp,
254
+ Magick::DarkenCompositeOp,
255
+ Magick::DarkenIntensityCompositeOp,
256
+ Magick::DistortCompositeOp,
257
+ Magick::DivideCompositeOp,
258
+ Magick::DivideSrcCompositeOp,
259
+ Magick::DstAtopCompositeOp,
260
+ Magick::DstCompositeOp,
261
+ Magick::DstInCompositeOp,
262
+ Magick::DstOutCompositeOp,
263
+ Magick::DstOverCompositeOp,
264
+ Magick::DifferenceCompositeOp,
265
+ Magick::DisplaceCompositeOp,
266
+ Magick::DissolveCompositeOp,
267
+ Magick::ExclusionCompositeOp,
268
+ Magick::HardLightCompositeOp,
269
+ Magick::HueCompositeOp,
270
+ Magick::InCompositeOp,
271
+ Magick::LightenCompositeOp,
272
+ Magick::LightenIntensityCompositeOp,
273
+ Magick::LinearBurnCompositeOp,
274
+ Magick::LinearDodgeCompositeOp,
275
+ Magick::LinearLightCompositeOp,
276
+ Magick::LuminizeCompositeOp,
277
+ Magick::MathematicsCompositeOp,
278
+ Magick::MinusCompositeOp,
279
+ Magick::MinusSrcCompositeOp,
280
+ Magick::ModulateCompositeOp,
281
+ Magick::MultiplyCompositeOp,
282
+ Magick::NoCompositeOp,
283
+ Magick::OutCompositeOp,
284
+ Magick::OverCompositeOp,
285
+ Magick::OverlayCompositeOp,
286
+ Magick::PegtopLightCompositeOp,
287
+ Magick::PinLightCompositeOp,
288
+ Magick::PlusCompositeOp,
289
+ Magick::ReplaceCompositeOp,
290
+ Magick::SaturateCompositeOp,
291
+ Magick::ScreenCompositeOp,
292
+ Magick::SoftLightCompositeOp,
293
+ Magick::SrcAtopCompositeOp,
294
+ Magick::SrcCompositeOp,
295
+ Magick::SrcInCompositeOp,
296
+ Magick::SrcOutCompositeOp,
297
+ Magick::SrcOverCompositeOp,
298
+ Magick::SubtractCompositeOp,
299
+ Magick::ThresholdCompositeOp,
300
+ Magick::UndefinedCompositeOp,
301
+ Magick::VividLightCompositeOp,
302
+ Magick::XorCompositeOp
303
+ ]
304
+ composite_operators << Magick::HardMixCompositeOp if Gem::Version.new('6.8.9') <= Gem::Version.new(IM_VERSION)
305
+
306
+ img = Magick::Image.new(10, 10)
307
+ assert_nothing_raised { @draw.composite(0, 0, 10, 10, img) }
308
+
309
+ composite_operators.each do |op|
310
+ assert_nothing_raised { @draw.composite(0, 0, 10, 10, img, op) }
311
+ end
312
+
313
+ assert_raise(TypeError) { @draw.composite('x', 0, 10, 10, img) }
314
+ assert_raise(TypeError) { @draw.composite(0, 'y', 10, 10, img) }
315
+ assert_raise(TypeError) { @draw.composite(0, 0, 'w', 10, img) }
316
+ assert_raise(TypeError) { @draw.composite(0, 0, 10, 'h', img) }
317
+ assert_raise(TypeError) { @draw.composite(0, 0, 10, 10, img, Magick::CenterAlign) }
318
+ assert_raise(NoMethodError) { @draw.composite(0, 0, 10, 10, 'image') }
319
+ assert_raise(ArgumentError) { @draw.composite(0, 0, 10, 10) }
320
+ assert_raise(ArgumentError) { @draw.composite(0, 0, 10, 10, img, Magick::AddCompositeOp, 'x') }
321
+ end
322
+
323
+ def test_draw
324
+ draw = @draw.dup
325
+
326
+ img = Magick::Image.new(10, 10)
327
+ @draw.path('M110,100 h-75 a75,75 0 1,0 75,-75 z')
328
+ assert_nothing_raised { @draw.draw(img) }
329
+
330
+ assert_raise(ArgumentError) { draw.draw(img) }
331
+ assert_raise(NoMethodError) { draw.draw('x') }
332
+ end
333
+
334
+ def test_get_type_metrics
335
+ img = Magick::Image.new(10, 10)
336
+ assert_nothing_raised { @draw.get_type_metrics('ABCDEF') }
337
+ assert_nothing_raised { @draw.get_type_metrics(img, 'ABCDEF') }
338
+
339
+ assert_raise(ArgumentError) { @draw.get_type_metrics }
340
+ assert_raise(ArgumentError) { @draw.get_type_metrics(img, 'ABCDEF', 20) }
341
+ assert_raise(ArgumentError) { @draw.get_type_metrics(img, '') }
342
+ assert_raise(NoMethodError) { @draw.get_type_metrics('x', 'ABCDEF') }
343
+ end
344
+
345
+ def test_get_multiline_type_metrics
346
+ img = Magick::Image.new(10, 10)
347
+ assert_nothing_raised { @draw.get_multiline_type_metrics('ABCDEF') }
348
+ assert_nothing_raised { @draw.get_multiline_type_metrics(img, 'ABCDEF') }
349
+
350
+ assert_raise(ArgumentError) { @draw.get_multiline_type_metrics }
351
+ assert_raise(ArgumentError) { @draw.get_multiline_type_metrics(img, 'ABCDEF', 20) }
352
+ assert_raise(ArgumentError) { @draw.get_multiline_type_metrics(img, '') }
353
+ end
354
+
355
+ def test_inspect
356
+ assert_equal('(no primitives defined)', @draw.inspect)
357
+
358
+ @draw.path('M110,100 h-75 a75,75 0 1,0 75,-75 z')
359
+ @draw.fill('yellow')
360
+ assert_equal("path 'M110,100 h-75 a75,75 0 1,0 75,-75 z'\nfill \"yellow\"", @draw.inspect)
361
+ end
362
+
363
+ def test_marshal
364
+ draw = @draw.dup
365
+ draw.affine = Magick::AffineMatrix.new(1, 2, 3, 4, 5, 6)
366
+ draw.decorate = Magick::LineThroughDecoration
367
+ draw.encoding = 'AdobeCustom'
368
+ draw.gravity = Magick::CenterGravity
369
+ draw.fill = Magick::Pixel.from_color('red')
370
+ draw.fill_pattern = Magick::Image.new(10, 10) { self.format = 'miff' }
371
+ draw.stroke = Magick::Pixel.from_color('blue')
372
+ draw.stroke_width = 5
373
+ draw.text_antialias = true
374
+ draw.font = 'Arial-Bold'
375
+ draw.font_family = 'arial'
376
+ draw.font_style = Magick::ItalicStyle
377
+ draw.font_stretch = Magick::CondensedStretch
378
+ draw.font_weight = Magick::BoldWeight
379
+ draw.pointsize = 12
380
+ draw.density = '72x72'
381
+ draw.align = Magick::CenterAlign
382
+ draw.undercolor = Magick::Pixel.from_color('green')
383
+ draw.kerning = 10.5
384
+ draw.interword_spacing = 3.75
385
+
386
+ draw.circle(20, 25, 20, 28)
387
+
388
+ dumped = nil
389
+ assert_nothing_raised { dumped = draw.marshal_dump }
390
+
391
+ draw2 = @draw.dup
392
+ assert_nothing_raised do
393
+ draw2.marshal_load(dumped)
394
+ end
395
+ assert_equal(draw.inspect, draw2.inspect)
396
+ end
397
+
398
+ def test_primitive
399
+ assert_nothing_raised { @draw.primitive('ABCDEF') }
400
+ assert_nothing_raised { @draw.primitive('12345') }
401
+ assert_raise(TypeError) { @draw.primitive(nil) }
402
+ end
403
+
404
+ def test_draw_options
405
+ assert_nothing_raised do
406
+ yield_obj = nil
407
+
408
+ Magick::Draw.new do |option|
409
+ yield_obj = option
410
+ end
411
+ assert_instance_of(Magick::Image::DrawOptions, yield_obj)
412
+ end
413
+ end
414
+ end