diff --git a/src/pkg/Makefile b/src/pkg/Makefile index 68e4a16d3a1..2a65d376986 100644 --- a/src/pkg/Makefile +++ b/src/pkg/Makefile @@ -121,7 +121,6 @@ DIRS=\ NOTEST=\ debug/proc\ - exp/draw\ go/ast\ go/doc\ go/token\ diff --git a/src/pkg/exp/draw/draw_test.go b/src/pkg/exp/draw/draw_test.go new file mode 100644 index 00000000000..61794dab885 --- /dev/null +++ b/src/pkg/exp/draw/draw_test.go @@ -0,0 +1,89 @@ +// 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) + } + } +}