|
@@ -0,0 +1,281 @@
|
|
|
+package imaging
|
|
|
+
|
|
|
+import (
|
|
|
+ "image"
|
|
|
+ "testing"
|
|
|
+)
|
|
|
+
|
|
|
+func TestResize(t *testing.T) {
|
|
|
+ td := []struct {
|
|
|
+ desc string
|
|
|
+ src image.Image
|
|
|
+ w, h int
|
|
|
+ f ResampleFilter
|
|
|
+ want *image.NRGBA
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "Resize 2x2 1x1 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 1, 1,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Resize 2x2 2x2 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 2, 2,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 2, 2),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Resize 3x1 1x1 nearest",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 2, 0),
|
|
|
+ Stride: 3 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 1, 1,
|
|
|
+ NearestNeighbor,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x00, 0xff, 0x00, 0xff},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Resize 2x2 0x4 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 0, 4,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 4, 4),
|
|
|
+ Stride: 4 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Resize 2x2 4x0 linear",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 4, 0,
|
|
|
+ Linear,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 4, 4),
|
|
|
+ Stride: 4 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xbf, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0x40, 0x00, 0x40, 0x30, 0x30, 0x10, 0x70, 0x8f, 0x10, 0x30, 0xcf, 0xbf, 0x00, 0x40, 0xff,
|
|
|
+ 0x00, 0xbf, 0x00, 0xbf, 0x10, 0x8f, 0x30, 0xcf, 0x30, 0x30, 0x8f, 0xef, 0x40, 0x00, 0xbf, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0xbf, 0x40, 0xff, 0x00, 0x40, 0xbf, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, d := range td {
|
|
|
+ got := Resize(d.src, d.w, d.h, d.f)
|
|
|
+ want := d.want
|
|
|
+ if !compareNRGBA(got, want, 1) {
|
|
|
+ t.Errorf("test [%s] failed: %#v", d.desc, got)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestFit(t *testing.T) {
|
|
|
+ td := []struct {
|
|
|
+ desc string
|
|
|
+ src image.Image
|
|
|
+ w, h int
|
|
|
+ f ResampleFilter
|
|
|
+ want *image.NRGBA
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "Fit 2x2 1x10 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 1, 10,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Fit 2x2 10x1 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 10, 1,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Fit 2x2 10x10 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 1),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 10, 10,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 2, 2),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, d := range td {
|
|
|
+ got := Fit(d.src, d.w, d.h, d.f)
|
|
|
+ want := d.want
|
|
|
+ if !compareNRGBA(got, want, 0) {
|
|
|
+ t.Errorf("test [%s] failed: %#v", d.desc, got)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestThumbnail(t *testing.T) {
|
|
|
+ td := []struct {
|
|
|
+ desc string
|
|
|
+ src image.Image
|
|
|
+ w, h int
|
|
|
+ f ResampleFilter
|
|
|
+ want *image.NRGBA
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "Thumbnail 6x2 1x1 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 5, 1),
|
|
|
+ Stride: 6 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 1, 1,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Thumbnail 2x6 1x1 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 1, 5),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 1, 1,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 1, 1),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "Thumbnail 1x3 2x2 box",
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(-1, -1, 0, 2),
|
|
|
+ Stride: 1 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0x00, 0x00, 0x00, 0x00,
|
|
|
+ 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0xff, 0xff, 0xff, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ 2, 2,
|
|
|
+ Box,
|
|
|
+ &image.NRGBA{
|
|
|
+ Rect: image.Rect(0, 0, 2, 2),
|
|
|
+ Stride: 2 * 4,
|
|
|
+ Pix: []uint8{
|
|
|
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, d := range td {
|
|
|
+ got := Thumbnail(d.src, d.w, d.h, d.f)
|
|
|
+ want := d.want
|
|
|
+ if !compareNRGBA(got, want, 0) {
|
|
|
+ t.Errorf("test [%s] failed: %#v", d.desc, got)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|