// 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 expected image.Color } var drawTests = []drawTest{ // Uniform mask (0% opaque) mask. drawTest{"nop", vgradGreen(255), fillAlpha(0), image.RGBAColor{136, 0, 0, 255}}, // Uniform mask (100%, 75%, nil) and vertical-gradient source. drawTest{"copy", vgradGreen(90), fillAlpha(255), image.RGBAColor{0, 48, 0, 90}}, drawTest{"copyAlpha", vgradGreen(90), fillAlpha(192), image.RGBAColor{100, 36, 0, 255}}, drawTest{"copyNil", vgradGreen(90), nil, image.RGBAColor{0, 48, 0, 90}}, // Uniform mask (100%, 75%, nil) and uniform source. drawTest{"fill", fillBlue(90), fillAlpha(255), image.RGBAColor{0, 0, 90, 90}}, drawTest{"fillAlpha", fillBlue(90), fillAlpha(192), image.RGBAColor{100, 0, 68, 255}}, drawTest{"fillNil", fillBlue(90), nil, image.RGBAColor{0, 0, 90, 90}}, // Variable mask. In detail, 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), image.RGBAColor{81, 0, 102, 255}}, } 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, SoverD) if !eq(dst.At(8, 8), test.expected) { t.Errorf("draw %s: %v versus %v", test.desc, dst.At(8, 8), test.expected) } } }