magickwand 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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