| // Copyright 2010 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package draw | |
| import ( | |
| "image" | |
| "testing" | |
| ) | |
| func eq(c0, c1 image.Color) bool { | |
| r0, g0, b0, a0 := c0.RGBA() | |
| r1, g1, b1, a1 := c1.RGBA() | |
| return r0 == r1 && g0 == g1 && b0 == b1 && a0 == a1 | |
| } | |
| func fillBlue(alpha int) image.Image { | |
| return image.ColorImage{image.RGBAColor{0, 0, uint8(alpha), uint8(alpha)}} | |
| } | |
| func fillAlpha(alpha int) image.Image { | |
| return image.ColorImage{image.AlphaColor{uint8(alpha)}} | |
| } | |
| func vgradGreen(alpha int) image.Image { | |
| m := image.NewRGBA(16, 16) | |
| for y := 0; y < 16; y++ { | |
| for x := 0; x < 16; x++ { | |
| m.Set(x, y, image.RGBAColor{0, uint8(y * alpha / 15), 0, uint8(alpha)}) | |
| } | |
| } | |
| return m | |
| } | |
| func vgradAlpha(alpha int) image.Image { | |
| m := image.NewAlpha(16, 16) | |
| for y := 0; y < 16; y++ { | |
| for x := 0; x < 16; x++ { | |
| m.Set(x, y, image.AlphaColor{uint8(y * alpha / 15)}) | |
| } | |
| } | |
| return m | |
| } | |
| func hgradRed(alpha int) Image { | |
| m := image.NewRGBA(16, 16) | |
| for y := 0; y < 16; y++ { | |
| for x := 0; x < 16; x++ { | |
| m.Set(x, y, image.RGBAColor{uint8(x * alpha / 15), 0, 0, uint8(alpha)}) | |
| } | |
| } | |
| return m | |
| } | |
| type drawTest struct { | |
| desc string | |
| src image.Image | |
| mask image.Image | |
| op Op | |
| expected image.Color | |
| } | |
| var drawTests = []drawTest{ | |
| // Uniform mask (0% opaque). | |
| drawTest{"nop", vgradGreen(255), fillAlpha(0), Over, image.RGBAColor{136, 0, 0, 255}}, | |
| drawTest{"clear", vgradGreen(255), fillAlpha(0), Src, image.RGBAColor{0, 0, 0, 0}}, | |
| // Uniform mask (100%, 75%, nil) and uniform source. | |
| // At (x, y) == (8, 8): | |
| // The destination pixel is {136, 0, 0, 255}. | |
| // The source pixel is {0, 0, 90, 90}. | |
| drawTest{"fill", fillBlue(90), fillAlpha(255), Over, image.RGBAColor{88, 0, 90, 255}}, | |
| drawTest{"fillSrc", fillBlue(90), fillAlpha(255), Src, image.RGBAColor{0, 0, 90, 90}}, | |
| drawTest{"fillAlpha", fillBlue(90), fillAlpha(192), Over, image.RGBAColor{100, 0, 68, 255}}, | |
| drawTest{"fillAlphaSrc", fillBlue(90), fillAlpha(192), Src, image.RGBAColor{0, 0, 68, 68}}, | |
| drawTest{"fillNil", fillBlue(90), nil, Over, image.RGBAColor{88, 0, 90, 255}}, | |
| drawTest{"fillNilSrc", fillBlue(90), nil, Src, image.RGBAColor{0, 0, 90, 90}}, | |
| // Uniform mask (100%, 75%, nil) and variable source. | |
| // At (x, y) == (8, 8): | |
| // The destination pixel is {136, 0, 0, 255}. | |
| // The source pixel is {0, 48, 0, 90}. | |
| drawTest{"copy", vgradGreen(90), fillAlpha(255), Over, image.RGBAColor{88, 48, 0, 255}}, | |
| drawTest{"copySrc", vgradGreen(90), fillAlpha(255), Src, image.RGBAColor{0, 48, 0, 90}}, | |
| drawTest{"copyAlpha", vgradGreen(90), fillAlpha(192), Over, image.RGBAColor{100, 36, 0, 255}}, | |
| drawTest{"copyAlphaSrc", vgradGreen(90), fillAlpha(192), Src, image.RGBAColor{0, 36, 0, 68}}, | |
| drawTest{"copyNil", vgradGreen(90), nil, Over, image.RGBAColor{88, 48, 0, 255}}, | |
| drawTest{"copyNilSrc", vgradGreen(90), nil, Src, image.RGBAColor{0, 48, 0, 90}}, | |
| // Variable mask and variable source. | |
| // At (x, y) == (8, 8): | |
| // The destination pixel is {136, 0, 0, 255}. | |
| // The source pixel is {0, 0, 255, 255}. | |
| // The mask pixel's alpha is 102, or 40%. | |
| drawTest{"generic", fillBlue(255), vgradAlpha(192), Over, image.RGBAColor{81, 0, 102, 255}}, | |
| drawTest{"genericSrc", fillBlue(255), vgradAlpha(192), Src, image.RGBAColor{0, 0, 102, 102}}, | |
| } | |
| func TestDraw(t *testing.T) { | |
| for _, test := range drawTests { | |
| dst := hgradRed(255) | |
| DrawMask(dst, Rect(0, 0, 16, 16), test.src, ZP, test.mask, ZP, test.op) | |
| if !eq(dst.At(8, 8), test.expected) { | |
| t.Errorf("draw %s: %v versus %v", test.desc, dst.At(8, 8), test.expected) | |
| } | |
| } | |
| } |