magickwand 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- # $Id: magickwand.rb 128 2009-05-31 13:12:51Z rmagick $
1
+ # $Id: magickwand.rb 271 2009-08-11 22:47:26Z rmagick $
2
2
  # Copyright (C) 2009 Timothy P. Hunter
3
3
 
4
4
  require 'magickwand.so'
@@ -24,5 +24,92 @@ module MagickWand
24
24
  end
25
25
 
26
26
  end
27
+
28
+ class Drawing
29
+
30
+ def define_element(container, name, options=nil, &block)
31
+ begin
32
+ push("defs")
33
+ push(container, name.to_s, options)
34
+ push
35
+ block.call unless block.nil?
36
+ ensure
37
+ pop
38
+ pop(container)
39
+ pop("defs")
40
+ end
41
+ end
42
+
43
+ private :define_element
44
+
45
+ # drawing.define_pattern(name, :x=>0, :y=>0, :width=>0, :height=>0) do ... end
46
+ def define_pattern(name, options=nil, &block)
47
+ define_element("pattern", name, options, &block)
48
+ end
49
+
50
+ # drawing.define_clip_path(name) do ... end
51
+ def define_clip_path(name, &block)
52
+ define_element("clip_path", name, &block)
53
+ end
54
+
55
+ # add an SVG path to the drawing
56
+ def add_path()
57
+ begin
58
+ start_path
59
+ yield self if block_given?
60
+ ensure
61
+ finish_path
62
+ end
63
+ end
64
+
65
+ # push new context, add styles, yield to block. Does not actually
66
+ # require a block but it's not very useful otherwise.
67
+ def with(styles)
68
+ begin
69
+ push
70
+ unless styles.nil?
71
+ # The :fill_opacity and :stroke_opacity styles must succeed
72
+ # the :fill and :stroke styles, otherwise the opacity specified
73
+ # by the :fill or :stroke color will override that specified by
74
+ # the :xxx_opacity style. Therefore we make two passes over the
75
+ # options hash. The first pass handles all options except
76
+ # :fill_opacity and :stroke_opacity. Then 2nd pass handles only
77
+ # those two options.
78
+ styles.each do |style, value|
79
+ next if style == :fill_opacity || style == :stroke_opacity
80
+ begin
81
+ __send__("with_"+style.to_s, *value)
82
+ rescue NoMethodError
83
+ raise ArgumentError, "unknown style `:#{style}'"
84
+ end
85
+ end
86
+
87
+ styles.each do |style, value|
88
+ next unless style == :fill_opacity || style == :stroke_opacity
89
+ begin
90
+ __send__("with_"+style.to_s, *value)
91
+ rescue NoMethodError
92
+ raise ArgumentError, "unknown style `:#{style}'"
93
+ end
94
+ end
95
+ end
96
+ yield if block_given?
97
+ ensure
98
+ pop
99
+ end
100
+ end
101
+
102
+ # yield to block in new (temporary) drawing context. Accepts no
103
+ # arguments but requires a block.
104
+ def wrap()
105
+ begin
106
+ push
107
+ yield
108
+ ensure
109
+ pop
110
+ end
111
+ end
112
+
113
+ end
27
114
  end
28
115
 
@@ -0,0 +1,12 @@
1
+
2
+
3
+ # Determine what exception is raised when you try to modify a frozen object
4
+ begin
5
+ f = "string"
6
+ f.freeze
7
+ f[0] = "x"
8
+ rescue Exception => e
9
+ FreezeError = e.class
10
+ end
11
+
12
+
@@ -0,0 +1,672 @@
1
+ require 'test/unit'
2
+ require 'magickwand'
3
+ require File.dirname(__FILE__) + '/freezer'
4
+
5
+
6
+
7
+ class TestDrawing < Test::Unit::TestCase
8
+
9
+ def test_annotation
10
+ drawing = MagickWand::Drawing.new
11
+ assert_nothing_raised { drawing.annotation "Hello" }
12
+ assert_match(/text 0,0 'Hello'/, drawing.inspect)
13
+
14
+ drawing = MagickWand::Drawing.new
15
+ assert_nothing_raised { drawing.annotation "Hello", :x=>20 }
16
+ assert_match(/text 20,0 'Hello'/, drawing.inspect)
17
+
18
+ drawing = MagickWand::Drawing.new
19
+ assert_nothing_raised { drawing.annotation "Hello", :x=>20, :y=>20 }
20
+ assert_match(/text 20,20 'Hello'/, drawing.inspect)
21
+
22
+ drawing.freeze
23
+ assert_raise(FreezeError) { drawing.annotation "Hello" }
24
+ end
25
+
26
+ def test_arc
27
+ drawing = MagickWand::Drawing.new
28
+ assert_nothing_raised { drawing.arc 30, 50, 45, 270 }
29
+ assert_match(/arc 0,0 30,50 45,270/, drawing.inspect)
30
+
31
+ drawing = MagickWand::Drawing.new
32
+ assert_nothing_raised { drawing.arc 30, 50, 45, 270, :x=>10 }
33
+ assert_match(/arc 10,0 40,50 45,270/, drawing.inspect)
34
+
35
+ drawing = MagickWand::Drawing.new
36
+ assert_nothing_raised { drawing.arc 30, 50, 45, 270, :x=>15, :y=>20 }
37
+ assert_match(/arc 15,20 45,70 45,270/, drawing.inspect)
38
+
39
+ drawing.freeze
40
+ assert_raise(FreezeError) { drawing.arc 30, 50, 45, 270 }
41
+ end
42
+
43
+ def test_bezier
44
+ drawing = MagickWand::Drawing.new
45
+ assert_nothing_raised { drawing.bezier 100,150, 25,50, 475,50, 400,150 }
46
+ assert_match(/bezier 100,150 25,50 475,50 400,150/, drawing.inspect)
47
+
48
+ drawing.freeze
49
+ assert_raise(FreezeError) { drawing.bezier 100,150, 25,50, 475,50, 400,150 }
50
+ end
51
+
52
+ def test_circle
53
+ drawing = MagickWand::Drawing.new
54
+ assert_nothing_raised { drawing.circle 20 }
55
+ assert_match(/circle 0,0 20,0/, drawing.inspect)
56
+
57
+ drawing = MagickWand::Drawing.new
58
+ assert_nothing_raised { drawing.circle 20, :x=>10 }
59
+ assert_match(/circle 10,0 30,0/, drawing.inspect)
60
+
61
+ drawing = MagickWand::Drawing.new
62
+ assert_nothing_raised { drawing.circle 20, :x=>10, :y=>10 }
63
+ assert_match(/circle 10,10 30,10/, drawing.inspect)
64
+
65
+ drawing.freeze
66
+ assert_raise(FreezeError) { drawing.circle 20 }
67
+ end
68
+
69
+ def test_color
70
+ drawing = MagickWand::Drawing.new
71
+ assert_nothing_raised { drawing.color 20, 30 }
72
+ assert_match(/color 20,30 'Point'/, drawing.inspect)
73
+
74
+ drawing = MagickWand::Drawing.new
75
+ assert_nothing_raised { drawing.color 25, 35, :method=>"replace" }
76
+ assert_match(/color 25,35 'Replace'/, drawing.inspect)
77
+
78
+ drawing = MagickWand::Drawing.new
79
+ assert_nothing_raised { drawing.color 25, 35, :method=>"floodfill" }
80
+ assert_match(/color 25,35 'Floodfill'/, drawing.inspect)
81
+
82
+ drawing = MagickWand::Drawing.new
83
+ assert_nothing_raised { drawing.color 25, 35, :method=>"filltoborder", :bordercolor=>"green" }
84
+ assert_match(/color 25,35 'FillToBorder'/, drawing.inspect)
85
+
86
+ drawing = MagickWand::Drawing.new
87
+ assert_nothing_raised { drawing.color 25, 35, :method=>"reset" }
88
+ assert_match(/color 25,35 'Reset'/, drawing.inspect)
89
+
90
+ drawing.freeze
91
+ assert_raise(FreezeError) { drawing.color 20, 30 }
92
+ end
93
+
94
+ def test_composite
95
+ drawing = MagickWand::Drawing.new
96
+ img = MagickWand::Wand.new
97
+ img.add_canvas 10, 10
98
+ assert_nothing_raised { drawing.composite img, :width=>0, :height=>0, :compose=>"over" }
99
+ assert_match(/image Over 0,0 0,0 'data:image\/x-;base64,/, drawing.inspect)
100
+
101
+ drawing = MagickWand::Drawing.new
102
+ assert_nothing_raised { drawing.composite img, :x=>0, :y=>0, :width=>0, :height=>0, :compose=>"over" }
103
+ assert_match(/image Over 0,0 0,0 'data:image\/x-;base64,/, drawing.inspect)
104
+
105
+ assert_raise(ArgumentError) { drawing.composite img, :compose=>"xxx" }
106
+ drawing.freeze
107
+ assert_raise(FreezeError) { drawing.composite(img) }
108
+ end
109
+
110
+ def test_draw
111
+ wand = MagickWand::Wand.new
112
+ wand.add_canvas 100
113
+ drawing = MagickWand::Drawing.new
114
+ drawing.circle 20, :x=>50, :y=>50
115
+ assert_nothing_raised { wand.draw drawing }
116
+
117
+ wand.freeze
118
+ assert_raise(FreezeError) { wand.draw drawing }
119
+ end
120
+
121
+ def test_ellipse
122
+ drawing = MagickWand::Drawing.new
123
+ assert_nothing_raised { drawing.ellipse 20, 30 }
124
+ assert_match(/ellipse 0,0 20,30 0,360/, drawing.inspect)
125
+
126
+ drawing = MagickWand::Drawing.new
127
+ assert_nothing_raised { drawing.ellipse 20, 30, :x=>20, :y=>20 }
128
+ assert_match(/ellipse 20,20 20,30 0,360/, drawing.inspect)
129
+
130
+ drawing = MagickWand::Drawing.new
131
+ assert_nothing_raised { drawing.ellipse 20, 30, :start=>0, :end=>360 }
132
+ assert_match(/ellipse 0,0 20,30 0,360/, drawing.inspect)
133
+
134
+ drawing.freeze
135
+ assert_raise(FreezeError) { drawing.ellipse 20, 30 }
136
+ end
137
+
138
+ def test_fill_stroke_pattern
139
+ drawing = MagickWand::Drawing.new
140
+ drawing.define_pattern("test_pattern") { drawing.circle(10) }
141
+ drawing.with(:fill_pattern=>"test_pattern", :stroke_pattern=>"test_pattern") {}
142
+ assert_match(/fill url\(\#test_pattern\)/, drawing.inspect)
143
+ assert_match(/stroke url\(\#test_pattern\)/, drawing.inspect)
144
+ end
145
+
146
+ def test_line
147
+ drawing = MagickWand::Drawing.new
148
+ assert_nothing_raised { drawing.line 10, 20, 30, 40 }
149
+ assert_match(/line 10,20 30,40/, drawing.inspect)
150
+
151
+ drawing.freeze
152
+ assert_raise(FreezeError) { drawing.line 10, 20, 30, 40 }
153
+ end
154
+
155
+ def test_matte
156
+ drawing = MagickWand::Drawing.new
157
+ assert_nothing_raised { drawing.matte 20, 30 }
158
+ assert_match(/matte 20,30 'Point'/, drawing.inspect)
159
+
160
+ drawing = MagickWand::Drawing.new
161
+ assert_nothing_raised { drawing.matte 25, 35, :method=>"replace" }
162
+ assert_match(/matte 25,35 'Replace'/, drawing.inspect)
163
+
164
+ drawing.freeze
165
+ assert_raise(FreezeError) { drawing.matte 20, 30 }
166
+ end
167
+
168
+ def test_path
169
+ drawing = MagickWand::Drawing.new
170
+ # ensure private methods
171
+ assert(drawing.private_methods.include?("start_path"))
172
+ assert(drawing.private_methods.include?("finish_path"))
173
+
174
+ assert_nothing_raised { drawing.add_path {} }
175
+ assert_nothing_raised do
176
+ drawing.add_path {|path| path.close_path}
177
+ end
178
+ assert_match(/path 'z'/, drawing.inspect)
179
+
180
+ drawing = MagickWand::Drawing.new
181
+ assert_nothing_raised do
182
+ drawing.add_path {|path| path.curve_to_absolute(10, 20, 30, 40, 50, 60) }
183
+ end
184
+ assert_match(/path 'C10,20 30,40 50,60'/, drawing.inspect)
185
+
186
+ drawing = MagickWand::Drawing.new
187
+ assert_nothing_raised do
188
+ drawing.add_path {|path| path.curve_to_relative(10, 20, 30, 40, 50, 60) }
189
+ end
190
+ assert_match(/path 'c10,20 30,40 50,60'/, drawing.inspect)
191
+
192
+ drawing = MagickWand::Drawing.new
193
+ assert_nothing_raised do
194
+ drawing.add_path {|path| path.curve_to_quadratic_bezier_absolute(10, 20, 30, 40) }
195
+ end
196
+ assert_match(/path 'Q10,20 30,40'/, drawing.inspect)
197
+
198
+ drawing = MagickWand::Drawing.new
199
+ assert_nothing_raised do
200
+ drawing.add_path {|path| path.curve_to_quadratic_bezier_relative(10, 20, 30, 40) }
201
+ end
202
+ assert_match(/path 'q10,20 30,40'/, drawing.inspect)
203
+
204
+
205
+ drawing = MagickWand::Drawing.new
206
+ assert_nothing_raised do
207
+ drawing.add_path {|path| path.curve_to_quadratic_bezier_smooth_absolute(10, 20) }
208
+ end
209
+ assert_match(/path 'T10,20'/, drawing.inspect)
210
+
211
+ drawing = MagickWand::Drawing.new
212
+ assert_nothing_raised do
213
+ drawing.add_path {|path| path.curve_to_quadratic_bezier_smooth_relative(10, 20) }
214
+ end
215
+ assert_match(/path 't10,20'/, drawing.inspect)
216
+
217
+ drawing = MagickWand::Drawing.new
218
+ assert_nothing_raised do
219
+ drawing.add_path {|path| path.curve_to_smooth_absolute(10, 20, 30, 40) }
220
+ end
221
+ assert_match(/path 'S10,20 30,40'/, drawing.inspect)
222
+
223
+ drawing = MagickWand::Drawing.new
224
+ assert_nothing_raised do
225
+ drawing.add_path {|path| path.curve_to_smooth_relative(10, 20, 30, 40) }
226
+ end
227
+ assert_match(/path 's10,20 30,40'/, drawing.inspect)
228
+
229
+ drawing = MagickWand::Drawing.new
230
+ assert_nothing_raised do
231
+ drawing.add_path {|path| path.elliptic_arc_absolute(10, 20, 30, true, false, 40, 50) }
232
+ end
233
+ assert_match(/path 'A10,20 30 1 0 40,50'/, drawing.inspect)
234
+
235
+ drawing = MagickWand::Drawing.new
236
+ assert_nothing_raised do
237
+ drawing.add_path {|path| path.elliptic_arc_relative(10, 20, 30, true, false, 40, 50) }
238
+ end
239
+ assert_match(/path 'a10,20 30 1 0 40,50'/, drawing.inspect)
240
+
241
+ drawing = MagickWand::Drawing.new
242
+ assert_nothing_raised do
243
+ drawing.add_path {|path| path.line_to_absolute(10, 20) }
244
+ end
245
+ assert_match(/path 'L10,20'/, drawing.inspect)
246
+
247
+ drawing = MagickWand::Drawing.new
248
+ assert_nothing_raised do
249
+ drawing.add_path {|path| path.line_to_relative(10, 20) }
250
+ end
251
+ assert_match(/path 'l10,20'/, drawing.inspect)
252
+
253
+ drawing = MagickWand::Drawing.new
254
+ assert_nothing_raised do
255
+ drawing.add_path {|path| path.line_to_horizontal_absolute(10) }
256
+ end
257
+ assert_match(/path 'H10'/, drawing.inspect)
258
+
259
+ drawing = MagickWand::Drawing.new
260
+ assert_nothing_raised do
261
+ drawing.add_path {|path| path.line_to_horizontal_relative(10) }
262
+ end
263
+ assert_match(/path 'h10'/, drawing.inspect)
264
+
265
+ drawing = MagickWand::Drawing.new
266
+ assert_nothing_raised do
267
+ drawing.add_path {|path| path.line_to_vertical_absolute(10) }
268
+ end
269
+ assert_match(/path 'V10'/, drawing.inspect)
270
+
271
+ drawing = MagickWand::Drawing.new
272
+ assert_nothing_raised do
273
+ drawing.add_path {|path| path.line_to_vertical_relative(10) }
274
+ end
275
+ assert_match(/path 'v10'/, drawing.inspect)
276
+
277
+ drawing = MagickWand::Drawing.new
278
+ assert_nothing_raised do
279
+ drawing.add_path {|path| path.move_to_absolute(10, 20) }
280
+ end
281
+ assert_match(/path 'M10,20'/, drawing.inspect)
282
+
283
+ drawing = MagickWand::Drawing.new
284
+ assert_nothing_raised do
285
+ drawing.add_path {|path| path.move_to_relative(10, 20) }
286
+ end
287
+ assert_match(/path 'm10,20'/, drawing.inspect)
288
+ end
289
+
290
+ def test_polygon
291
+ drawing = MagickWand::Drawing.new
292
+ assert_nothing_raised { drawing.polygon 1, 1, 3, 3 }
293
+ assert_match(/polygon 1,1 3,3/, drawing.inspect)
294
+
295
+ drawing = MagickWand::Drawing.new
296
+ assert_nothing_raised { drawing.polygon 1, 1, 3, 3, 5, 5 }
297
+ assert_match(/polygon 1,1 3,3 5,5/, drawing.inspect)
298
+
299
+ assert_raise(ArgumentError) { drawing.polygon 1, 1, 3 }
300
+
301
+ drawing.freeze
302
+ assert_raise(FreezeError) { drawing.polygon 1, 1, 3, 3 }
303
+ end
304
+
305
+ def test_polyline
306
+ drawing = MagickWand::Drawing.new
307
+ assert_nothing_raised { drawing.polyline 1, 1, 3, 3 }
308
+ assert_match(/polyline 1,1 3,3/, drawing.inspect)
309
+
310
+ drawing = MagickWand::Drawing.new
311
+ assert_nothing_raised { drawing.polyline 1, 1, 3, 3, 5, 5 }
312
+ assert_match(/polyline 1,1 3,3 5,5/, drawing.inspect)
313
+
314
+ assert_raise(ArgumentError) { drawing.polyline 1, 1, 3 }
315
+
316
+ drawing.freeze
317
+ assert_raise(FreezeError) { drawing.polyline 1, 1, 3, 3 }
318
+ end
319
+
320
+ def test_rectangle
321
+ drawing = MagickWand::Drawing.new
322
+ assert_nothing_raised { drawing.rectangle 20, 40 }
323
+ assert_match(/rectangle 0,0 20,40/, drawing.inspect)
324
+
325
+ drawing = MagickWand::Drawing.new
326
+ assert_nothing_raised { drawing.rectangle 20, 40, :x=>10, :y=>10 }
327
+ assert_match(/rectangle 10,10 30,50/, drawing.inspect)
328
+
329
+ drawing = MagickWand::Drawing.new
330
+ assert_nothing_raised { drawing.rectangle 20, 40, :rx=>4, :ry=>4 }
331
+ assert_match(/roundrectangle 0,0 20,40 4,4/, drawing.inspect)
332
+
333
+ drawing.freeze
334
+ assert_raise(FreezeError) { drawing.rectangle 20, 40 }
335
+ end
336
+
337
+ def test_transforms
338
+ drawing = MagickWand::Drawing.new
339
+ drawing.wrap do
340
+ drawing.affine(1,1,0,0,0,0)
341
+ end
342
+ assert_match(/push graphic-context\n affine 1,0,0,1,0,0\npop graphic-context/, drawing.inspect)
343
+
344
+ drawing = MagickWand::Drawing.new
345
+ drawing.wrap { drawing.rotate 45 }
346
+ assert_match(/rotate 45/, drawing.inspect)
347
+ drawing.wrap { drawing.rotate 45, 10 } # y-offset defaults to 0
348
+ assert_match(/translate 10,0\n rotate 45\n translate -10,-0/, drawing.inspect)
349
+ drawing.wrap { drawing.rotate 45,10,20 }
350
+ assert_match(/translate 10,20\n rotate 45\n translate -10,-20/, drawing.inspect)
351
+
352
+ drawing = MagickWand::Drawing.new
353
+ drawing.wrap { drawing.scale 1.5 }
354
+ assert_match(/scale 1.5/, drawing.inspect)
355
+ drawing.wrap { drawing.scale 1.5, 2 }
356
+ assert_match(/scale 1.5,2/, drawing.inspect)
357
+
358
+ drawing = MagickWand::Drawing.new
359
+ drawing.wrap { drawing.skew 30 }
360
+ assert_match(/skewX 30/, drawing.inspect)
361
+ drawing = MagickWand::Drawing.new
362
+ drawing.wrap { drawing.skew 30, 30 }
363
+ assert_match(/skewX 30/, drawing.inspect)
364
+ assert_match(/skewY 30/, drawing.inspect)
365
+
366
+ drawing = MagickWand::Drawing.new
367
+ drawing.wrap { drawing.translate 30 }
368
+ assert_match(/translate 30,0/, drawing.inspect)
369
+
370
+ drawing = MagickWand::Drawing.new
371
+ drawing.wrap { drawing.translate 30, 30 }
372
+ assert_match(/translate 30,30/, drawing.inspect)
373
+
374
+ drawing.freeze
375
+ assert_raise(FreezeError) do
376
+ drawing.translate 30, 30
377
+ end
378
+ end
379
+
380
+ def test_with
381
+ drawing = MagickWand::Drawing.new
382
+ # requires a argument
383
+ assert_raise(ArgumentError) { drawing.with }
384
+ # does not require a blocck
385
+ assert_nothing_raised {drawing.with(:align=>"center") }
386
+
387
+ drawing = MagickWand::Drawing.new
388
+ drawing.with(:align=>"center") {}
389
+ assert_match(/text-align 'Center'/, drawing.inspect)
390
+
391
+ drawing = MagickWand::Drawing.new
392
+ drawing.with(:align=>"end") {}
393
+ assert_match(/text-align 'End'/, drawing.inspect)
394
+
395
+ drawing = MagickWand::Drawing.new
396
+ drawing.with(:align=>"left") {}
397
+ assert_match(/text-align 'Left'/, drawing.inspect)
398
+
399
+ drawing = MagickWand::Drawing.new
400
+ drawing.with(:align=>"middle") {}
401
+ assert_match(/text-align 'Center'/, drawing.inspect)
402
+
403
+ drawing = MagickWand::Drawing.new
404
+ drawing.with(:align=>"right") {}
405
+ assert_match(/text-align 'End'/, drawing.inspect)
406
+
407
+ drawing = MagickWand::Drawing.new
408
+ drawing.with(:align=>"start") {}
409
+ assert_match(/text-align 'Left'/, drawing.inspect)
410
+
411
+ assert_raise(ArgumentError) { drawing.with(:align=>"xxx") }
412
+
413
+ drawing = MagickWand::Drawing.new # :antialias
414
+ drawing.with(:antialias=>true, :stroke_antialias=>false) {}
415
+ assert_match(/text-antialias 1/, drawing.inspect)
416
+ assert_match(/stroke-antialias 0/, drawing.inspect)
417
+ drawing = MagickWand::Drawing.new # :antialias
418
+ drawing.with(:text_antialias=>false) {} # alias for :antialias
419
+ assert_match(/text-antialias 0/, drawing.inspect)
420
+
421
+ drawing = MagickWand::Drawing.new
422
+ drawing.with(:antialias=>false) {}
423
+ assert_match(/text-antialias 0/, drawing.inspect)
424
+
425
+ drawing = MagickWand::Drawing.new # :clip_path
426
+ drawing.with(:clip_path=>"clip_path_name") {}
427
+ assert_match(/clip-path url\(#clip_path_name\)/, drawing.inspect)
428
+
429
+ drawing = MagickWand::Drawing.new # :clip_rule
430
+ drawing.with(:clip_rule=>"nonzero") {}
431
+ assert_match(/clip-rule 'NonZero'/, drawing.inspect)
432
+
433
+ drawing = MagickWand::Drawing.new
434
+ drawing.with(:clip_rule=>"evenodd") {}
435
+ assert_match(/clip-rule 'Evenodd'/, drawing.inspect)
436
+
437
+ assert_raise(ArgumentError) do
438
+ drawing.with(:clip_rule=>"bogus") {}
439
+ end
440
+
441
+ drawing = MagickWand::Drawing.new # :clip_units
442
+ drawing.with(:clip_units=>"userspace")
443
+ assert_match(/clip-units 'UserSpace'/, drawing.inspect)
444
+
445
+ drawing = MagickWand::Drawing.new
446
+ drawing.with(:clip_units=>"userspaceonuse")
447
+ assert_match(/clip-units 'UserSpaceOnUse'/, drawing.inspect)
448
+
449
+ drawing = MagickWand::Drawing.new
450
+ drawing.with(:clip_units=>"objectboundingbox")
451
+ assert_match(/clip-units 'ObjectBoundingBox'/, drawing.inspect)
452
+
453
+ assert_raise(ArgumentError) do
454
+ drawing.with(:clip_units=>"bogus") {}
455
+ end
456
+
457
+ drawing = MagickWand::Drawing.new # :decoration
458
+ drawing.with(:decoration=>"none") {}
459
+ assert_match(/decorate 'None'/, drawing.inspect)
460
+
461
+ drawing = MagickWand::Drawing.new
462
+ drawing.with(:decoration=>"linethrough") {}
463
+ assert_match(/decorate 'LineThrough'/, drawing.inspect)
464
+
465
+ drawing = MagickWand::Drawing.new
466
+ drawing.with(:decoration=>"overline") {}
467
+ assert_match(/decorate 'Overline'/, drawing.inspect)
468
+
469
+ drawing = MagickWand::Drawing.new
470
+ drawing.with(:decoration=>"underline") {}
471
+ assert_match(/decorate 'Underline'/, drawing.inspect)
472
+
473
+ assert_raise(ArgumentError) do
474
+ drawing.with(:decoration=>"linethru") {}
475
+ end
476
+
477
+ drawing = MagickWand::Drawing.new
478
+ drawing.with(:encoding=>"adobecustom") {}
479
+ assert_match(/encoding 'adobecustom'/, drawing.inspect)
480
+ drawing.with(:encoding=>"notanencoding") {} # no bad encodings!
481
+ assert_match(/encoding 'notanencoding'/, drawing.inspect)
482
+
483
+ drawing = MagickWand::Drawing.new
484
+ drawing.with(:fill_rule=>"nonzero") {}
485
+ assert_match(/fill-rule 'NonZero'/, drawing.inspect)
486
+
487
+ drawing = MagickWand::Drawing.new
488
+ drawing.with(:fill_rule=>"evenodd") {}
489
+ assert_match(/fill-rule 'Evenodd'/, drawing.inspect)
490
+
491
+ assert_raise(ArgumentError) do
492
+ drawing.with(:fill_rule=>"bogus") {}
493
+ end
494
+
495
+ drawing = MagickWand::Drawing.new
496
+ drawing.with(:family=>"arial") {}
497
+ assert_match(/font-family 'arial'/, drawing.inspect)
498
+ drawing.with(:family=>"notafamily") {} # no bad families!
499
+ assert_match(/font-family 'notafamily'/, drawing.inspect)
500
+
501
+ drawing = MagickWand::Drawing.new
502
+ drawing.with(:fill=>"red") {}
503
+ assert_match(/fill '#FFFF00000000'/, drawing.inspect)
504
+ drawing.with(:fill=>"notafill") {} # no bad fills!
505
+ assert_match(/fill '#000000000000'/, drawing.inspect)
506
+
507
+ drawing = MagickWand::Drawing.new
508
+ drawing.with(:fill_opacity=>0.5) {}
509
+ assert_match(/fill-opacity 0.5/, drawing.inspect)
510
+ drawing.with(:fill_opacity=>20) {} # no bad values!
511
+ assert_match(/fill-opacity 1/, drawing.inspect)
512
+
513
+ drawing = MagickWand::Drawing.new
514
+ drawing.with(:font=>"Times-Roman") {}
515
+ assert_match(/font 'Times-Roman'/, drawing.inspect)
516
+ drawing.with(:font=>"notafont") {} # no bad fonts!
517
+ assert_match(/font 'notafont'/, drawing.inspect)
518
+
519
+ drawing = MagickWand::Drawing.new
520
+ drawing.with(:gravity=>"northwest")
521
+ assert_match(/gravity 'NorthWest'/, drawing.inspect)
522
+ drawing.with(:gravity=>"north")
523
+ assert_match(/gravity 'North'/, drawing.inspect)
524
+ drawing.with(:gravity=>"northeast")
525
+ assert_match(/gravity 'NorthEast'/, drawing.inspect)
526
+ drawing.with(:gravity=>"west")
527
+ assert_match(/gravity 'West'/, drawing.inspect)
528
+ drawing.with(:gravity=>"center")
529
+ assert_match(/gravity 'Center'/, drawing.inspect)
530
+ drawing.with(:gravity=>"east")
531
+ assert_match(/gravity 'East'/, drawing.inspect)
532
+ drawing.with(:gravity=>"southwest")
533
+ assert_match(/gravity 'SouthWest'/, drawing.inspect)
534
+ drawing.with(:gravity=>"south")
535
+ assert_match(/gravity 'South'/, drawing.inspect)
536
+ drawing.with(:gravity=>"southeast")
537
+ assert_match(/gravity 'SouthEast'/, drawing.inspect)
538
+
539
+ assert_raise(ArgumentError) do
540
+ drawing.with(:gravity=>"xxx") {}
541
+ end
542
+
543
+ drawing = MagickWand::Drawing.new
544
+ drawing.with(:interword_spacing=>5) {}
545
+ # actual match is 5.000000
546
+ assert_match(/interword_spacing 5(\.[0]+)/, drawing.inspect)
547
+
548
+ drawing = MagickWand::Drawing.new
549
+ drawing.with(:kerning=>5) {}
550
+ assert_match(/kerning 5/, drawing.inspect)
551
+
552
+ drawing = MagickWand::Drawing.new
553
+ drawing.with(:pointsize=>5) {}
554
+ assert_match(/font-size 5/, drawing.inspect)
555
+
556
+ drawing = MagickWand::Drawing.new
557
+ drawing.with(:stretch=>"any") {}
558
+ assert_match(/font-stretch 'Any'/, drawing.inspect)
559
+ drawing.with(:stretch=>"condensed") {}
560
+ assert_match(/font-stretch 'Condensed'/, drawing.inspect)
561
+ drawing.with(:stretch=>"expanded") {}
562
+ assert_match(/font-stretch 'Expanded'/, drawing.inspect)
563
+ drawing.with(:stretch=>"extracondensed") {}
564
+ assert_match(/font-stretch 'ExtraCondensed'/, drawing.inspect)
565
+ drawing.with(:stretch=>"extraexpanded") {}
566
+ assert_match(/font-stretch 'ExtraExpanded'/, drawing.inspect)
567
+ drawing.with(:stretch=>"normal") {}
568
+ assert_match(/font-stretch 'Normal'/, drawing.inspect)
569
+ drawing.with(:stretch=>"semicondensed") {}
570
+ assert_match(/font-stretch 'SemiCondensed'/, drawing.inspect)
571
+ drawing.with(:stretch=>"SemiExpanded") {}
572
+ assert_match(/font-stretch 'SemiExpanded'/, drawing.inspect)
573
+ drawing.with(:stretch=>"ultracondensed") {}
574
+ assert_match(/font-stretch 'UltraCondensed'/, drawing.inspect)
575
+ drawing.with(:stretch=>"ultraexpanded") {}
576
+ assert_match(/font-stretch 'UltraExpanded'/, drawing.inspect)
577
+
578
+ assert_raise(ArgumentError) do
579
+ drawing.with(:stretch=>"notastretch") {}
580
+ end
581
+
582
+ drawing = MagickWand::Drawing.new
583
+ drawing.with(:stroke=>"red") {}
584
+ assert_match(/stroke '#FFFF00000000'/, drawing.inspect)
585
+ drawing.with(:stroke=>"notastroke") {} # no bad strokes!
586
+ assert_match(/stroke '#000000000000'/, drawing.inspect)
587
+
588
+ drawing = MagickWand::Drawing.new # ::dash_array
589
+ drawing.with(:dash_array=>[3, 5.5, 7.25]) {}
590
+ assert_match(/stroke-dasharray 3,5.5,7.25/, drawing.inspect)
591
+ drawing.with(:dash_array=>nil) {}
592
+ assert_match(/stroke-dasharray none/, drawing.inspect)
593
+ drawing = MagickWand::Drawing.new
594
+ drawing.with(:dash_array=>[]) {}
595
+ assert_match(/stroke-dasharray none/, drawing.inspect)
596
+
597
+ drawing.with(:dash_offset=>1) {}
598
+ assert_match(/stroke-dashoffset 1/, drawing.inspect)
599
+
600
+ drawing = MagickWand::Drawing.new
601
+ drawing.with(:line_cap=>"butt") {}
602
+ assert_match(/stroke-linecap 'Butt'/, drawing.inspect)
603
+ drawing = MagickWand::Drawing.new
604
+ drawing.with(:line_cap=>"round") {}
605
+ assert_match(/stroke-linecap 'Round'/, drawing.inspect)
606
+ drawing = MagickWand::Drawing.new
607
+ drawing.with(:line_cap=>"square") {}
608
+ assert_match(/stroke-linecap 'Square'/, drawing.inspect)
609
+
610
+ drawing = MagickWand::Drawing.new
611
+ drawing.with(:line_join=>"bevel") {}
612
+ assert_match(/stroke-linejoin 'Bevel'/, drawing.inspect)
613
+ drawing = MagickWand::Drawing.new
614
+ drawing.with(:line_join=>"miter") {}
615
+ assert_match(/stroke-linejoin 'Miter'/, drawing.inspect)
616
+ drawing = MagickWand::Drawing.new
617
+ drawing.with(:line_join=>"round") {}
618
+ assert_match(/stroke-linejoin 'Round'/, drawing.inspect)
619
+
620
+ drawing = MagickWand::Drawing.new
621
+ drawing.with(:miter_limit=>15) {}
622
+ assert_match(/stroke-miterlimit 15/, drawing.inspect)
623
+
624
+ drawing = MagickWand::Drawing.new
625
+ drawing.with(:stroke_opacity=>0.5) {}
626
+ assert_match(/stroke-opacity 0.5/, drawing.inspect)
627
+ drawing.with(:stroke_opacity=>20) {} # no bad values!
628
+ assert_match(/stroke-opacity 1/, drawing.inspect)
629
+
630
+ drawing = MagickWand::Drawing.new
631
+ drawing.with(:stroke_width=>5) {}
632
+ assert_match(/stroke-width 5/, drawing.inspect)
633
+
634
+ drawing = MagickWand::Drawing.new
635
+ drawing.with(:style=>"any") {}
636
+ assert_match(/font-style 'Any'/, drawing.inspect)
637
+ drawing.with(:style=>"italic") {}
638
+ assert_match(/font-style 'Italic'/, drawing.inspect)
639
+ drawing.with(:style=>"normal") {}
640
+ assert_match(/font-style 'Normal'/, drawing.inspect)
641
+ drawing.with(:style=>"oblique") {}
642
+ assert_match(/font-style 'Oblique'/, drawing.inspect)
643
+
644
+ assert_raise(ArgumentError) do
645
+ drawing.with(:style=>"notastyle") {}
646
+ end
647
+
648
+ drawing = MagickWand::Drawing.new
649
+ drawing.with(:undercolor=>"red") {}
650
+ assert_match(/undercolor '#FFFF00000000'/, drawing.inspect)
651
+ drawing.with(:undercolor=>"notaundercolor") {} # no bad undercolors!
652
+ assert_match(/undercolor '#000000000000'/, drawing.inspect)
653
+
654
+ # unknown option
655
+ assert_raise(ArgumentError) do
656
+ drawing.with(:noanoption=>22) {}
657
+ end
658
+
659
+ drawing.freeze
660
+ assert_raise(FreezeError) do
661
+ drawing.with(:style=>"any") {}
662
+ end
663
+ end
664
+
665
+ def test_wrap
666
+ drawing = MagickWand::Drawing.new
667
+ # doesn't accept arguments
668
+ assert_raise(ArgumentError) { drawing.wrap(1) }
669
+ # a block is required
670
+ assert_raise(LocalJumpError) { drawing.wrap }
671
+ end
672
+ end