prawn-shadings 0.1.1

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.
@@ -0,0 +1,862 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "Shadingns" do
6
+ before(:each) { create_pdf }
7
+
8
+ describe 'linear gradients' do
9
+ it "should create a /Pattern resource" do
10
+ @pdf.fill_gradient [0, @pdf.bounds.height],
11
+ [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
12
+
13
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
14
+ pattern = grad.patterns.values.first
15
+
16
+ pattern.should_not be_nil
17
+ pattern[:Shading][:ShadingType].should == 2
18
+ pattern[:Shading][:Coords].should == [0, 0, @pdf.bounds.width, 0]
19
+ pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
20
+ (x1-x2).abs < 0.01
21
+ }.should be_true
22
+ pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
23
+ (x1-x2).abs < 0.01
24
+ }.should be_true
25
+ end
26
+
27
+ it "fill_gradient should set fill color to the pattern" do
28
+ @pdf.fill_gradient [0, @pdf.bounds.height],
29
+ [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
30
+
31
+ str = @pdf.render
32
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
33
+ end
34
+
35
+ it "stroke_gradient should set stroke color to the pattern" do
36
+ @pdf.stroke_gradient [0, @pdf.bounds.height],
37
+ [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
38
+
39
+ str = @pdf.render
40
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
41
+ end
42
+
43
+ it "should be reused if used twice on page" do
44
+ 2.times do
45
+ @pdf.fill_gradient [0, @pdf.bounds.height],
46
+ [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF'
47
+ end
48
+
49
+ @pdf.page.resources[:Pattern].length.should == 1
50
+ end
51
+
52
+ it "should validate colors to be in the same color space" do
53
+ lambda {
54
+ @pdf.fill_gradient [0, @pdf.bounds.height],
55
+ [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', [1.0, 1.0, 1.0, 1.0]
56
+ }.should raise_error(ArgumentError)
57
+ end
58
+ end
59
+
60
+ describe 'radial gradients' do
61
+ it "should create a /Pattern resource" do
62
+ @pdf.fill_gradient [0, @pdf.bounds.height], 10,
63
+ [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
64
+
65
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
66
+ pattern = grad.patterns.values.first
67
+
68
+ pattern.should_not be_nil
69
+ pattern[:Shading][:ShadingType].should == 3
70
+ pattern[:Shading][:Coords].should == [0, 0, 10, @pdf.bounds.width, 0, 20]
71
+ pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
72
+ (x1-x2).abs < 0.01
73
+ }.should be_true
74
+ pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
75
+ (x1-x2).abs < 0.01
76
+ }.should be_true
77
+ end
78
+
79
+ it "fill_gradient should set fill color to the pattern" do
80
+ @pdf.fill_gradient [0, @pdf.bounds.height], 10,
81
+ [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
82
+
83
+ str = @pdf.render
84
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
85
+ end
86
+
87
+ it "stroke_gradient should set stroke color to the pattern" do
88
+ @pdf.stroke_gradient [0, @pdf.bounds.height], 10,
89
+ [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
90
+
91
+ str = @pdf.render
92
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
93
+ end
94
+
95
+ it "should be reused if used twice on page" do
96
+ 2.times do
97
+ @pdf.stroke_gradient [0, @pdf.bounds.height], 10,
98
+ [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF'
99
+ end
100
+
101
+ @pdf.page.resources[:Pattern].length.should == 1
102
+ end
103
+
104
+ it "should validate colors to be in the same color space" do
105
+ lambda {
106
+ @pdf.stroke_gradient [0, @pdf.bounds.height], 10,
107
+ [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', [1.0, 1.0, 1.0, 1.0]
108
+ }.should raise_error(ArgumentError)
109
+ end
110
+ end
111
+
112
+ describe 'Free-Form Gouraud-Shaded Triangle Mesh' do
113
+ it "should create a /Pattern resource" do
114
+ @pdf.fill_gradient :ffgstm do
115
+ [
116
+ [0, 0, 0, 'ff0000'],
117
+ [0, 0, 100, '00ff00'],
118
+ [0, 100, 0, '0000ff']
119
+ ]
120
+ end
121
+
122
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
123
+ pattern = grad.patterns.values.first
124
+
125
+ pattern.should_not be_nil
126
+ shading = pattern[:Shading].hash
127
+ shading[:ShadingType].should == 4
128
+
129
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
130
+ pattern[:Shading].data.length.should == 36
131
+ pattern[:Shading].data.should == [0, 0, 0, 0xff, 0, 0, 0, 0, 0xffffffff, 0, 0xff, 0, 0, 0xffffffff, 0, 0, 0, 0xff].pack("CNNCCC" * 3)
132
+ end
133
+
134
+ it "fill_gradient should set fill color to the pattern" do
135
+ @pdf.fill_gradient :ffgstm do
136
+ [
137
+ [0, 0, 0, 'ff0000'],
138
+ [0, 0, 100, '00ff00'],
139
+ [0, 100, 0, '0000ff']
140
+ ]
141
+ end
142
+
143
+ str = @pdf.render
144
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
145
+ end
146
+
147
+ it "stroke_gradient should set stroke color to the pattern" do
148
+ @pdf.stroke_gradient :ffgstm do
149
+ [
150
+ [0, 0, 0, 'ff0000'],
151
+ [0, 0, 100, '00ff00'],
152
+ [0, 100, 0, '0000ff']
153
+ ]
154
+ end
155
+
156
+ str = @pdf.render
157
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
158
+ end
159
+
160
+ it "should be reused if used twice on page" do
161
+ 2.times do
162
+ @pdf.fill_gradient :ffgstm do
163
+ [
164
+ [0, 0, 0, 'ff0000'],
165
+ [0, 0, 100, '00ff00'],
166
+ [0, 100, 0, '0000ff']
167
+ ]
168
+ end
169
+ end
170
+
171
+ @pdf.page.resources[:Pattern].length.should == 1
172
+ end
173
+
174
+ it "should validate flag" do
175
+ lambda {
176
+ @pdf.fill_gradient :ffgstm do
177
+ [
178
+ [0, 0, 0, 'ff0000'],
179
+ [2, 0, 100, '00ff00'],
180
+ [100, 100, 0, '0000ff']
181
+ ]
182
+ end
183
+ }.should raise_error(ArgumentError, /flag/i)
184
+ end
185
+
186
+ it "should validate vertices colorspace" do
187
+ lambda {
188
+ @pdf.fill_gradient :ffgstm do
189
+ [
190
+ [0, 0, 0, 'ff0000'],
191
+ [0, 0, 100, [0, 1, 0, 1]],
192
+ [0, 100, 0, '0000ff']
193
+ ]
194
+ end
195
+ }.should raise_error(ArgumentError, /color space/i)
196
+ end
197
+ end
198
+
199
+ describe 'Lattice-Form Gouraud-Shaded Triangle Mesh' do
200
+ it "should create a /Pattern resource" do
201
+ @pdf.fill_gradient :lfgstm do
202
+ [
203
+ [ [0, 100, '000000'], [100, 100, 'ff0000'] ],
204
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
205
+ ]
206
+ end
207
+
208
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
209
+ pattern = grad.patterns.values.first
210
+
211
+ pattern.should_not be_nil
212
+ shading = pattern[:Shading].hash
213
+ shading[:ShadingType].should == 5
214
+
215
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
216
+ pattern[:Shading].data.length.should == 44
217
+ pattern[:Shading].data.should == [0, 0xffffffff, 0, 0, 0, 0xffffffff, 0xffffffff, 0xff, 0, 0, 0, 0, 0xff, 0, 0, 0xffffffff, 0, 0, 0, 0].pack("NNCCC" * 4)
218
+ end
219
+
220
+ it "fill_gradient should set fill color to the pattern" do
221
+ @pdf.fill_gradient :lfgstm do
222
+ [
223
+ [ [0, 100, '000000'], [100, 100, 'ff0000'] ],
224
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
225
+ ]
226
+ end
227
+
228
+ str = @pdf.render
229
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
230
+ end
231
+
232
+ it "stroke_gradient should set stroke color to the pattern" do
233
+ @pdf.stroke_gradient :lfgstm do
234
+ [
235
+ [ [0, 100, '000000'], [100, 100, 'ff0000'] ],
236
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
237
+ ]
238
+ end
239
+
240
+ str = @pdf.render
241
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
242
+ end
243
+
244
+ it "should be reused if used twice on page" do
245
+ 2.times do
246
+ @pdf.fill_gradient :lfgstm do
247
+ [
248
+ [ [0, 100, '000000'], [100, 100, 'ff0000'] ],
249
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
250
+ ]
251
+
252
+ end
253
+ end
254
+
255
+ @pdf.page.resources[:Pattern].length.should == 1
256
+ end
257
+
258
+ it "should validate number of rows" do
259
+ lambda {
260
+ @pdf.fill_gradient :lfgstm do
261
+ [
262
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
263
+ ]
264
+ end
265
+ }.should raise_error(ArgumentError, /rows/i)
266
+ end
267
+
268
+ it "should validate number of vertices in all rows" do
269
+ lambda {
270
+ @pdf.fill_gradient :lfgstm do
271
+ [
272
+ [ [0, 100, '000000'] ],
273
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
274
+ ]
275
+ end
276
+ }.should raise_error(ArgumentError, /at least 2 vertices per row/i)
277
+ end
278
+
279
+ it "should validate number of vertices in all rows" do
280
+ lambda {
281
+ @pdf.fill_gradient :lfgstm do
282
+ [
283
+ [ [0, 100, '000000'], [100, 100, 'ff0000'], [200, 100, '00ff00'] ],
284
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
285
+ ]
286
+ end
287
+ }.should raise_error(ArgumentError, /rectangular matrix/i)
288
+ end
289
+
290
+ it "should validate vertices colorspace" do
291
+ lambda {
292
+ @pdf.fill_gradient :lfgstm do
293
+ [
294
+ [ [0, 100, '000000'], [100, 100, [1, 1, 1, 1]] ],
295
+ [ [0, 0, 'ff0000'], [100, 0, '000000'] ]
296
+ ]
297
+
298
+ end
299
+ }.should raise_error(ArgumentError, /color space/i)
300
+ end
301
+ end
302
+
303
+ describe 'Coons Patch Mesh' do
304
+ it "should create a /Pattern resource" do
305
+ @pdf.fill_gradient :cpm do
306
+ [
307
+ [
308
+ 0,
309
+ 0, 0,
310
+ 0, 0,
311
+ 0, 100,
312
+ 0, 100,
313
+ 0, 100,
314
+ 100, 100,
315
+ 100, 100,
316
+ 100, 100,
317
+ 100, 0,
318
+ 100, 0,
319
+ 100, 0,
320
+ 0, 0,
321
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
322
+ ]
323
+ ]
324
+ end
325
+
326
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
327
+ pattern = grad.patterns.values.first
328
+
329
+ pattern.should_not be_nil
330
+ shading = pattern[:Shading].hash
331
+ shading[:ShadingType].should == 6
332
+
333
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
334
+ pattern[:Shading].data.length.should == 109
335
+ pattern[:Shading].data.should == [0,
336
+ 0, 0,
337
+ 0, 0,
338
+ 0, 0xffffffff,
339
+ 0, 0xffffffff,
340
+ 0, 0xffffffff,
341
+ 0xffffffff, 0xffffffff,
342
+ 0xffffffff, 0xffffffff,
343
+ 0xffffffff, 0xffffffff,
344
+ 0xffffffff, 0,
345
+ 0xffffffff, 0,
346
+ 0xffffffff, 0,
347
+ 0, 0,
348
+ 0xff, 0xff, 0,
349
+ 0xff, 0, 0,
350
+ 0, 0xff, 0,
351
+ 0, 0, 0xff].pack("CN24C12")
352
+ end
353
+
354
+ it "should create a /Pattern resource with reused vertices" do
355
+ @pdf.fill_gradient :cpm do
356
+ [
357
+ [
358
+ 0,
359
+ 0, 0,
360
+ 0, 0,
361
+ 0, 100,
362
+ 0, 100,
363
+ 0, 100,
364
+ 100, 100,
365
+ 100, 100,
366
+ 100, 100,
367
+ 100, 0,
368
+ 100, 0,
369
+ 100, 0,
370
+ 0, 0,
371
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
372
+ ],
373
+ [
374
+ 1,
375
+ 0, 100,
376
+ 100, 100,
377
+ 100, 100,
378
+ 100, 100,
379
+ 100, 0,
380
+ 100, 0,
381
+ 100, 0,
382
+ 0, 0,
383
+ '00ff00', '0000ff'
384
+ ],
385
+
386
+ ]
387
+ end
388
+
389
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
390
+ pattern = grad.patterns.values.first
391
+
392
+ pattern.should_not be_nil
393
+ shading = pattern[:Shading].hash
394
+ shading[:ShadingType].should == 6
395
+
396
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
397
+ pattern[:Shading].data.length.should == 180
398
+ pattern[:Shading].data.should == [0,
399
+ 0, 0,
400
+ 0, 0,
401
+ 0, 0xffffffff,
402
+ 0, 0xffffffff,
403
+ 0, 0xffffffff,
404
+ 0xffffffff, 0xffffffff,
405
+ 0xffffffff, 0xffffffff,
406
+ 0xffffffff, 0xffffffff,
407
+ 0xffffffff, 0,
408
+ 0xffffffff, 0,
409
+ 0xffffffff, 0,
410
+ 0, 0,
411
+ 0xff, 0xff, 0,
412
+ 0xff, 0, 0,
413
+ 0, 0xff, 0,
414
+ 0, 0, 0xff,
415
+
416
+ 1,
417
+ 0, 0xffffffff,
418
+ 0xffffffff, 0xffffffff,
419
+ 0xffffffff, 0xffffffff,
420
+ 0xffffffff, 0xffffffff,
421
+ 0xffffffff, 0,
422
+ 0xffffffff, 0,
423
+ 0xffffffff, 0,
424
+ 0, 0,
425
+ 0, 0xff, 0,
426
+ 0, 0, 0xff
427
+ ].pack("CN24C12CN16C6")
428
+ end
429
+
430
+ it "fill_gradient should set fill color to the pattern" do
431
+ @pdf.fill_gradient :cpm do
432
+ [
433
+ [
434
+ 0,
435
+ 0, 0,
436
+ 0, 0,
437
+ 0, 100,
438
+ 0, 100,
439
+ 0, 100,
440
+ 100, 100,
441
+ 100, 100,
442
+ 100, 100,
443
+ 100, 0,
444
+ 100, 0,
445
+ 100, 0,
446
+ 0, 0,
447
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
448
+ ]
449
+ ]
450
+ end
451
+
452
+ str = @pdf.render
453
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
454
+ end
455
+
456
+ it "stroke_gradient should set stroke color to the pattern" do
457
+ @pdf.stroke_gradient :cpm do
458
+ [
459
+ [
460
+ 0,
461
+ 0, 0,
462
+ 0, 0,
463
+ 0, 100,
464
+ 0, 100,
465
+ 0, 100,
466
+ 100, 100,
467
+ 100, 100,
468
+ 100, 100,
469
+ 100, 0,
470
+ 100, 0,
471
+ 100, 0,
472
+ 0, 0,
473
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
474
+ ]
475
+ ]
476
+
477
+ end
478
+
479
+ str = @pdf.render
480
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
481
+ end
482
+
483
+ it "should be reused if used twice on page" do
484
+ 2.times do
485
+ @pdf.fill_gradient :cpm do
486
+ [
487
+ [
488
+ 0,
489
+ 0, 0,
490
+ 0, 0,
491
+ 0, 100,
492
+ 0, 100,
493
+ 0, 100,
494
+ 100, 100,
495
+ 100, 100,
496
+ 100, 100,
497
+ 100, 0,
498
+ 100, 0,
499
+ 100, 0,
500
+ 0, 0,
501
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
502
+ ]
503
+ ]
504
+ end
505
+ end
506
+
507
+ @pdf.page.resources[:Pattern].length.should == 1
508
+ end
509
+
510
+ it "should validate flags" do
511
+ lambda {
512
+ @pdf.fill_gradient :cpm do
513
+ [
514
+ [
515
+ 20,
516
+ 0, 0,
517
+ 0, 0,
518
+ 0, 100,
519
+ 0, 100,
520
+ 0, 100,
521
+ 100, 100,
522
+ 100, 100,
523
+ 100, 100,
524
+ 100, 0,
525
+ 100, 0,
526
+ 100, 0,
527
+ 0, 0,
528
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
529
+ ]
530
+ ]
531
+ end
532
+ }.should raise_error(ArgumentError, /flag/i)
533
+ end
534
+
535
+ it "should validate vertices colorspace" do
536
+ lambda {
537
+ @pdf.fill_gradient :cpm do
538
+ [
539
+ [
540
+ 0,
541
+ 0, 0,
542
+ 0, 0,
543
+ 0, 100,
544
+ 0, 100,
545
+ 0, 100,
546
+ 100, 100,
547
+ 100, 100,
548
+ 100, 100,
549
+ 100, 0,
550
+ 100, 0,
551
+ 100, 0,
552
+ 0, 0,
553
+ 'ffff00', 'ff0000', '00ff00', [1, 1, 1, 1]
554
+ ]
555
+ ]
556
+ end
557
+ }.should raise_error(ArgumentError, /color space/i)
558
+ end
559
+ end
560
+
561
+ describe 'Tensor-Product Patch Mesh' do
562
+ it "should create a /Pattern resource" do
563
+ @pdf.fill_gradient :tppm do
564
+ [
565
+ [
566
+ 0,
567
+ 0, 0,
568
+ 0, 0,
569
+ 0, 100,
570
+ 0, 100,
571
+ 0, 100,
572
+ 100, 100,
573
+ 100, 100,
574
+ 100, 100,
575
+ 100, 0,
576
+ 100, 0,
577
+ 100, 0,
578
+ 0, 0,
579
+ 50, 50,
580
+ 50, 50,
581
+ 50, 50,
582
+ 50, 50,
583
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
584
+ ]
585
+ ]
586
+ end
587
+
588
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
589
+ pattern = grad.patterns.values.first
590
+
591
+ pattern.should_not be_nil
592
+ shading = pattern[:Shading].hash
593
+ shading[:ShadingType].should == 7
594
+
595
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
596
+ pattern[:Shading].data.length.should == 141
597
+ pattern[:Shading].data.should == [0,
598
+ 0, 0,
599
+ 0, 0,
600
+ 0, 0xffffffff,
601
+ 0, 0xffffffff,
602
+ 0, 0xffffffff,
603
+ 0xffffffff, 0xffffffff,
604
+ 0xffffffff, 0xffffffff,
605
+ 0xffffffff, 0xffffffff,
606
+ 0xffffffff, 0,
607
+ 0xffffffff, 0,
608
+ 0xffffffff, 0,
609
+ 0, 0,
610
+ 0x80000000, 0x80000000,
611
+ 0x80000000, 0x80000000,
612
+ 0x80000000, 0x80000000,
613
+ 0x80000000, 0x80000000,
614
+ 0xff, 0xff, 0,
615
+ 0xff, 0, 0,
616
+ 0, 0xff, 0,
617
+ 0, 0, 0xff].pack("CN32C12")
618
+ end
619
+
620
+ it "should create a /Pattern resource with reused vertices" do
621
+ @pdf.fill_gradient :tppm do
622
+ [
623
+ [
624
+ 0,
625
+ 0, 0,
626
+ 0, 0,
627
+ 0, 100,
628
+ 0, 100,
629
+ 0, 100,
630
+ 100, 100,
631
+ 100, 100,
632
+ 100, 100,
633
+ 100, 0,
634
+ 100, 0,
635
+ 100, 0,
636
+ 0, 0,
637
+ 50, 50,
638
+ 50, 50,
639
+ 50, 50,
640
+ 50, 50,
641
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
642
+ ],
643
+ [
644
+ 1,
645
+ 0, 100,
646
+ 100, 100,
647
+ 100, 100,
648
+ 100, 100,
649
+ 100, 0,
650
+ 100, 0,
651
+ 100, 0,
652
+ 0, 0,
653
+ 50, 50,
654
+ 50, 50,
655
+ 50, 50,
656
+ 50, 50,
657
+ '00ff00', '0000ff'
658
+ ],
659
+
660
+ ]
661
+ end
662
+
663
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
664
+ pattern = grad.patterns.values.first
665
+
666
+ pattern.should_not be_nil
667
+ shading = pattern[:Shading].hash
668
+ shading[:ShadingType].should == 7
669
+
670
+ shading[:Decode].should == [0, 100, 0, 100, 0, 1, 0, 1, 0, 1]
671
+ pattern[:Shading].data.length.should == 244
672
+ pattern[:Shading].data.should == [0,
673
+ 0, 0,
674
+ 0, 0,
675
+ 0, 0xffffffff,
676
+ 0, 0xffffffff,
677
+ 0, 0xffffffff,
678
+ 0xffffffff, 0xffffffff,
679
+ 0xffffffff, 0xffffffff,
680
+ 0xffffffff, 0xffffffff,
681
+ 0xffffffff, 0,
682
+ 0xffffffff, 0,
683
+ 0xffffffff, 0,
684
+ 0, 0,
685
+ 0x80000000, 0x80000000,
686
+ 0x80000000, 0x80000000,
687
+ 0x80000000, 0x80000000,
688
+ 0x80000000, 0x80000000,
689
+ 0xff, 0xff, 0,
690
+ 0xff, 0, 0,
691
+ 0, 0xff, 0,
692
+ 0, 0, 0xff,
693
+
694
+ 1,
695
+ 0, 0xffffffff,
696
+ 0xffffffff, 0xffffffff,
697
+ 0xffffffff, 0xffffffff,
698
+ 0xffffffff, 0xffffffff,
699
+ 0xffffffff, 0,
700
+ 0xffffffff, 0,
701
+ 0xffffffff, 0,
702
+ 0, 0,
703
+ 0x80000000, 0x80000000,
704
+ 0x80000000, 0x80000000,
705
+ 0x80000000, 0x80000000,
706
+ 0x80000000, 0x80000000,
707
+ 0, 0xff, 0,
708
+ 0, 0, 0xff
709
+ ].pack("CN32C12CN24C6")
710
+ end
711
+
712
+ it "fill_gradient should set fill color to the pattern" do
713
+ @pdf.fill_gradient :tppm do
714
+ [
715
+ [
716
+ 0,
717
+ 0, 0,
718
+ 0, 0,
719
+ 0, 100,
720
+ 0, 100,
721
+ 0, 100,
722
+ 100, 100,
723
+ 100, 100,
724
+ 100, 100,
725
+ 100, 0,
726
+ 100, 0,
727
+ 100, 0,
728
+ 0, 0,
729
+ 50, 50,
730
+ 50, 50,
731
+ 50, 50,
732
+ 50, 50,
733
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
734
+ ]
735
+ ]
736
+ end
737
+
738
+ str = @pdf.render
739
+ str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn}
740
+ end
741
+
742
+ it "stroke_gradient should set stroke color to the pattern" do
743
+ @pdf.stroke_gradient :tppm do
744
+ [
745
+ [
746
+ 0,
747
+ 0, 0,
748
+ 0, 0,
749
+ 0, 100,
750
+ 0, 100,
751
+ 0, 100,
752
+ 100, 100,
753
+ 100, 100,
754
+ 100, 100,
755
+ 100, 0,
756
+ 100, 0,
757
+ 100, 0,
758
+ 0, 0,
759
+ 50, 50,
760
+ 50, 50,
761
+ 50, 50,
762
+ 50, 50,
763
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
764
+ ]
765
+ ]
766
+
767
+ end
768
+
769
+ str = @pdf.render
770
+ str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}
771
+ end
772
+
773
+ it "should be reused if used twice on page" do
774
+ 2.times do
775
+ @pdf.fill_gradient :tppm do
776
+ [
777
+ [
778
+ 0,
779
+ 0, 0,
780
+ 0, 0,
781
+ 0, 100,
782
+ 0, 100,
783
+ 0, 100,
784
+ 100, 100,
785
+ 100, 100,
786
+ 100, 100,
787
+ 100, 0,
788
+ 100, 0,
789
+ 100, 0,
790
+ 0, 0,
791
+ 50, 50,
792
+ 50, 50,
793
+ 50, 50,
794
+ 50, 50,
795
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
796
+ ]
797
+ ]
798
+ end
799
+ end
800
+
801
+ @pdf.page.resources[:Pattern].length.should == 1
802
+ end
803
+
804
+ it "should validate flags" do
805
+ lambda {
806
+ @pdf.fill_gradient :tppm do
807
+ [
808
+ [
809
+ 20,
810
+ 0, 0,
811
+ 0, 0,
812
+ 0, 100,
813
+ 0, 100,
814
+ 0, 100,
815
+ 100, 100,
816
+ 100, 100,
817
+ 100, 100,
818
+ 100, 0,
819
+ 100, 0,
820
+ 100, 0,
821
+ 0, 0,
822
+ 50, 50,
823
+ 50, 50,
824
+ 50, 50,
825
+ 50, 50,
826
+ 'ffff00', 'ff0000', '00ff00', '0000ff'
827
+ ]
828
+ ]
829
+ end
830
+ }.should raise_error(ArgumentError, /flag/i)
831
+ end
832
+
833
+ it "should validate vertices colorspace" do
834
+ lambda {
835
+ @pdf.fill_gradient :tppm do
836
+ [
837
+ [
838
+ 0,
839
+ 0, 0,
840
+ 0, 0,
841
+ 0, 100,
842
+ 0, 100,
843
+ 0, 100,
844
+ 100, 100,
845
+ 100, 100,
846
+ 100, 100,
847
+ 100, 0,
848
+ 100, 0,
849
+ 100, 0,
850
+ 0, 0,
851
+ 50, 50,
852
+ 50, 50,
853
+ 50, 50,
854
+ 50, 50,
855
+ 'ffff00', 'ff0000', '00ff00', [1, 1, 1, 1]
856
+ ]
857
+ ]
858
+ end
859
+ }.should raise_error(ArgumentError, /color space/i)
860
+ end
861
+ end
862
+ end