@@ -66,6 +66,23 @@ func (p *slowestRGBA) PixOffset(x, y int) int {
66
66
return (y - p .Rect .Min .Y )* p .Stride + (x - p .Rect .Min .X )* 4
67
67
}
68
68
69
+ func convertToSlowestRGBA (m image.Image ) * slowestRGBA {
70
+ if rgba , ok := m .(* image.RGBA ); ok {
71
+ return & slowestRGBA {
72
+ Pix : append ([]byte (nil ), rgba .Pix ... ),
73
+ Stride : rgba .Stride ,
74
+ Rect : rgba .Rect ,
75
+ }
76
+ }
77
+ rgba := image .NewRGBA (m .Bounds ())
78
+ Draw (rgba , rgba .Bounds (), m , m .Bounds ().Min , Src )
79
+ return & slowestRGBA {
80
+ Pix : rgba .Pix ,
81
+ Stride : rgba .Stride ,
82
+ Rect : rgba .Rect ,
83
+ }
84
+ }
85
+
69
86
func init () {
70
87
var p interface {} = (* slowestRGBA )(nil )
71
88
if _ , ok := p .(RGBA64Image ); ok {
@@ -138,6 +155,23 @@ func (p *slowerRGBA) PixOffset(x, y int) int {
138
155
return (y - p .Rect .Min .Y )* p .Stride + (x - p .Rect .Min .X )* 4
139
156
}
140
157
158
+ func convertToSlowerRGBA (m image.Image ) * slowerRGBA {
159
+ if rgba , ok := m .(* image.RGBA ); ok {
160
+ return & slowerRGBA {
161
+ Pix : append ([]byte (nil ), rgba .Pix ... ),
162
+ Stride : rgba .Stride ,
163
+ Rect : rgba .Rect ,
164
+ }
165
+ }
166
+ rgba := image .NewRGBA (m .Bounds ())
167
+ Draw (rgba , rgba .Bounds (), m , m .Bounds ().Min , Src )
168
+ return & slowerRGBA {
169
+ Pix : rgba .Pix ,
170
+ Stride : rgba .Stride ,
171
+ Rect : rgba .Rect ,
172
+ }
173
+ }
174
+
141
175
func init () {
142
176
var p interface {} = (* slowerRGBA )(nil )
143
177
if _ , ok := p .(RGBA64Image ); ! ok {
@@ -310,6 +344,32 @@ var drawTests = []drawTest{
310
344
{"grayAlphaSrc" , vgradGray (), fillAlpha (192 ), Src , color.RGBA {102 , 102 , 102 , 192 }},
311
345
{"grayNil" , vgradGray (), nil , Over , color.RGBA {136 , 136 , 136 , 255 }},
312
346
{"grayNilSrc" , vgradGray (), nil , Src , color.RGBA {136 , 136 , 136 , 255 }},
347
+ // Same again, but with a slowerRGBA source.
348
+ {"graySlower" , convertToSlowerRGBA (vgradGray ()), fillAlpha (255 ),
349
+ Over , color.RGBA {136 , 136 , 136 , 255 }},
350
+ {"graySrcSlower" , convertToSlowerRGBA (vgradGray ()), fillAlpha (255 ),
351
+ Src , color.RGBA {136 , 136 , 136 , 255 }},
352
+ {"grayAlphaSlower" , convertToSlowerRGBA (vgradGray ()), fillAlpha (192 ),
353
+ Over , color.RGBA {136 , 102 , 102 , 255 }},
354
+ {"grayAlphaSrcSlower" , convertToSlowerRGBA (vgradGray ()), fillAlpha (192 ),
355
+ Src , color.RGBA {102 , 102 , 102 , 192 }},
356
+ {"grayNilSlower" , convertToSlowerRGBA (vgradGray ()), nil ,
357
+ Over , color.RGBA {136 , 136 , 136 , 255 }},
358
+ {"grayNilSrcSlower" , convertToSlowerRGBA (vgradGray ()), nil ,
359
+ Src , color.RGBA {136 , 136 , 136 , 255 }},
360
+ // Same again, but with a slowestRGBA source.
361
+ {"graySlowest" , convertToSlowestRGBA (vgradGray ()), fillAlpha (255 ),
362
+ Over , color.RGBA {136 , 136 , 136 , 255 }},
363
+ {"graySrcSlowest" , convertToSlowestRGBA (vgradGray ()), fillAlpha (255 ),
364
+ Src , color.RGBA {136 , 136 , 136 , 255 }},
365
+ {"grayAlphaSlowest" , convertToSlowestRGBA (vgradGray ()), fillAlpha (192 ),
366
+ Over , color.RGBA {136 , 102 , 102 , 255 }},
367
+ {"grayAlphaSrcSlowest" , convertToSlowestRGBA (vgradGray ()), fillAlpha (192 ),
368
+ Src , color.RGBA {102 , 102 , 102 , 192 }},
369
+ {"grayNilSlowest" , convertToSlowestRGBA (vgradGray ()), nil ,
370
+ Over , color.RGBA {136 , 136 , 136 , 255 }},
371
+ {"grayNilSrcSlowest" , convertToSlowestRGBA (vgradGray ()), nil ,
372
+ Src , color.RGBA {136 , 136 , 136 , 255 }},
313
373
// Uniform mask (100%, 75%, nil) and variable CMYK source.
314
374
// At (x, y) == (8, 8):
315
375
// The destination pixel is {136, 0, 0, 255}.
@@ -327,6 +387,16 @@ var drawTests = []drawTest{
327
387
// The mask pixel's alpha is 102, or 40%.
328
388
{"generic" , fillBlue (255 ), vgradAlpha (192 ), Over , color.RGBA {81 , 0 , 102 , 255 }},
329
389
{"genericSrc" , fillBlue (255 ), vgradAlpha (192 ), Src , color.RGBA {0 , 0 , 102 , 102 }},
390
+ // Same again, but with a slowerRGBA mask.
391
+ {"genericSlower" , fillBlue (255 ), convertToSlowerRGBA (vgradAlpha (192 )),
392
+ Over , color.RGBA {81 , 0 , 102 , 255 }},
393
+ {"genericSrcSlower" , fillBlue (255 ), convertToSlowerRGBA (vgradAlpha (192 )),
394
+ Src , color.RGBA {0 , 0 , 102 , 102 }},
395
+ // Same again, but with a slowestRGBA mask.
396
+ {"genericSlowest" , fillBlue (255 ), convertToSlowestRGBA (vgradAlpha (192 )),
397
+ Over , color.RGBA {81 , 0 , 102 , 255 }},
398
+ {"genericSrcSlowest" , fillBlue (255 ), convertToSlowestRGBA (vgradAlpha (192 )),
399
+ Src , color.RGBA {0 , 0 , 102 , 102 }},
330
400
}
331
401
332
402
func makeGolden (dst image.Image , r image.Rectangle , src image.Image , sp image.Point , mask image.Image , mp image.Point , op Op ) image.Image {
@@ -399,19 +469,9 @@ func TestDraw(t *testing.T) {
399
469
// result, in terms of final pixel RGBA values.
400
470
switch i {
401
471
case 1 :
402
- d := dst .(* image.RGBA )
403
- dst = & slowerRGBA {
404
- Pix : d .Pix ,
405
- Stride : d .Stride ,
406
- Rect : d .Rect ,
407
- }
472
+ dst = convertToSlowerRGBA (dst )
408
473
case 2 :
409
- d := dst .(* image.RGBA )
410
- dst = & slowestRGBA {
411
- Pix : d .Pix ,
412
- Stride : d .Stride ,
413
- Rect : d .Rect ,
414
- }
474
+ dst = convertToSlowestRGBA (dst )
415
475
}
416
476
417
477
// Draw the (src, mask, op) onto a copy of dst using a slow but obviously correct implementation.
0 commit comments