208 lines
4.2 KiB
Go
208 lines
4.2 KiB
Go
// Copyright 2011 The Graphics-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 graphics
|
|
|
|
import (
|
|
"code.google.com/p/graphics-go/graphics/graphicstest"
|
|
"image"
|
|
"image/color"
|
|
"testing"
|
|
|
|
_ "image/png"
|
|
)
|
|
|
|
var blurOneColorTests = []transformOneColorTest{
|
|
{
|
|
"1x1-blank", 1, 1, 1, 1,
|
|
&BlurOptions{0.83, 1},
|
|
[]uint8{0xff},
|
|
[]uint8{0xff},
|
|
},
|
|
{
|
|
"1x1-spreadblank", 1, 1, 1, 1,
|
|
&BlurOptions{0.83, 2},
|
|
[]uint8{0xff},
|
|
[]uint8{0xff},
|
|
},
|
|
{
|
|
"3x3-blank", 3, 3, 3, 3,
|
|
&BlurOptions{0.83, 2},
|
|
[]uint8{
|
|
0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff,
|
|
},
|
|
[]uint8{
|
|
0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff,
|
|
},
|
|
},
|
|
{
|
|
"3x3-dot", 3, 3, 3, 3,
|
|
&BlurOptions{0.34, 1},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00,
|
|
0x00, 0xff, 0x00,
|
|
0x00, 0x00, 0x00,
|
|
},
|
|
[]uint8{
|
|
0x00, 0x03, 0x00,
|
|
0x03, 0xf2, 0x03,
|
|
0x00, 0x03, 0x00,
|
|
},
|
|
},
|
|
{
|
|
"5x5-dot", 5, 5, 5, 5,
|
|
&BlurOptions{0.34, 1},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0xff, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x03, 0x00, 0x00,
|
|
0x00, 0x03, 0xf2, 0x03, 0x00,
|
|
0x00, 0x00, 0x03, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
},
|
|
{
|
|
"5x5-dot-spread", 5, 5, 5, 5,
|
|
&BlurOptions{0.85, 1},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0xff, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x10, 0x20, 0x10, 0x00,
|
|
0x00, 0x20, 0x40, 0x20, 0x00,
|
|
0x00, 0x10, 0x20, 0x10, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
},
|
|
{
|
|
"4x4-box", 4, 4, 4, 4,
|
|
&BlurOptions{0.34, 1},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0xff, 0xff, 0x00,
|
|
0x00, 0xff, 0xff, 0x00,
|
|
0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
[]uint8{
|
|
0x00, 0x03, 0x03, 0x00,
|
|
0x03, 0xf8, 0xf8, 0x03,
|
|
0x03, 0xf8, 0xf8, 0x03,
|
|
0x00, 0x03, 0x03, 0x00,
|
|
},
|
|
},
|
|
{
|
|
"5x5-twodots", 5, 5, 5, 5,
|
|
&BlurOptions{0.34, 1},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x96, 0x00, 0x96, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
[]uint8{
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x02, 0x00, 0x02, 0x00,
|
|
0x02, 0x8e, 0x04, 0x8e, 0x02,
|
|
0x00, 0x02, 0x00, 0x02, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
},
|
|
},
|
|
}
|
|
|
|
func TestBlurOneColor(t *testing.T) {
|
|
for _, oc := range blurOneColorTests {
|
|
dst := oc.newDst()
|
|
src := oc.newSrc()
|
|
opt := oc.opt.(*BlurOptions)
|
|
if err := Blur(dst, src, opt); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if !checkTransformTest(t, &oc, dst) {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBlurEmpty(t *testing.T) {
|
|
empty := image.NewRGBA(image.Rect(0, 0, 0, 0))
|
|
if err := Blur(empty, empty, nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestBlurGopher(t *testing.T) {
|
|
src, err := graphicstest.LoadImage("../testdata/gopher.png")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
dst := image.NewRGBA(src.Bounds())
|
|
if err = Blur(dst, src, &BlurOptions{StdDev: 1.1}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
cmp, err := graphicstest.LoadImage("../testdata/gopher-blur.png")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
err = graphicstest.ImageWithinTolerance(dst, cmp, 0x101)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func benchBlur(b *testing.B, bounds image.Rectangle) {
|
|
b.StopTimer()
|
|
|
|
// Construct a fuzzy image.
|
|
src := image.NewRGBA(bounds)
|
|
for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
|
|
for x := bounds.Min.X; x < bounds.Max.X; x++ {
|
|
src.SetRGBA(x, y, color.RGBA{
|
|
uint8(5 * x % 0x100),
|
|
uint8(7 * y % 0x100),
|
|
uint8((7*x + 5*y) % 0x100),
|
|
0xff,
|
|
})
|
|
}
|
|
}
|
|
dst := image.NewRGBA(bounds)
|
|
|
|
b.StartTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
Blur(dst, src, &BlurOptions{0.84, 3})
|
|
}
|
|
}
|
|
|
|
func BenchmarkBlur400x400x3(b *testing.B) {
|
|
benchBlur(b, image.Rect(0, 0, 400, 400))
|
|
}
|
|
|
|
// Exactly twice the pixel count of 400x400.
|
|
func BenchmarkBlur400x800x3(b *testing.B) {
|
|
benchBlur(b, image.Rect(0, 0, 400, 800))
|
|
}
|
|
|
|
// Exactly twice the pixel count of 400x800
|
|
func BenchmarkBlur400x1600x3(b *testing.B) {
|
|
benchBlur(b, image.Rect(0, 0, 400, 1600))
|
|
}
|