You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.2 KiB
207 lines
4.2 KiB
// 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)) |
|
}
|
|
|