github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/reader_test.go (about)

     1  // Copyright 2014 <chaishushan{AT}gmail.com>. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package jxr
     6  
     7  import (
     8  	"image"
     9  	_ "image/png"
    10  	"os"
    11  	"testing"
    12  )
    13  
    14  const testdataDir = "../testdata/"
    15  
    16  func compare(t *testing.T, img0, img1 image.Image) {
    17  	b := img1.Bounds()
    18  	if !b.Eq(img0.Bounds()) {
    19  		t.Fatalf("wrong image size: want %s, got %s", img0.Bounds(), b)
    20  	}
    21  	for y := b.Min.Y; y < b.Max.Y; y++ {
    22  		for x := b.Min.X; x < b.Max.X; x++ {
    23  			c0 := img0.At(x, y)
    24  			c1 := img1.At(x, y)
    25  			r0, g0, b0, a0 := c0.RGBA()
    26  			r1, g1, b1, a1 := c1.RGBA()
    27  			if r0 != r1 || g0 != g1 || b0 != b1 || a0 != a1 {
    28  				t.Fatalf("pixel at (%d, %d) has wrong color: want %v, got %v", x, y, c0, c1)
    29  			}
    30  		}
    31  	}
    32  }
    33  
    34  // TestDecode tests that decoding a PNG image and a BMP image result in the
    35  // same pixel data.
    36  func TestDecode(t *testing.T) {
    37  	f0, err := os.Open(testdataDir + "video-001.png")
    38  	if err != nil {
    39  		t.Fatal(err)
    40  	}
    41  	defer f0.Close()
    42  	img0, _, err := image.Decode(f0)
    43  	if err != nil {
    44  		t.Fatal(err)
    45  	}
    46  
    47  	f1, err := os.Open(testdataDir + "video-001.wdp")
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	defer f1.Close()
    52  	img1, _, err := image.Decode(f1)
    53  	if err != nil {
    54  		t.Fatal(err)
    55  	}
    56  
    57  	// Compare the average delta to the tolerance level.
    58  	want := int64(2 << 8)
    59  	if got := averageDelta(img0, img1); got > want {
    60  		t.Fatalf("average delta too high; got %d, want <= %d", got, want)
    61  	}
    62  }
    63  
    64  // averageDelta returns the average delta in RGB space. The two images must
    65  // have the same bounds.
    66  func averageDelta(m0, m1 image.Image) int64 {
    67  	b := m0.Bounds()
    68  	var sum, n int64
    69  	for y := b.Min.Y; y < b.Max.Y; y++ {
    70  		for x := b.Min.X; x < b.Max.X; x++ {
    71  			c0 := m0.At(x, y)
    72  			c1 := m1.At(x, y)
    73  			r0, g0, b0, _ := c0.RGBA()
    74  			r1, g1, b1, _ := c1.RGBA()
    75  			sum += delta(r0, r1)
    76  			sum += delta(g0, g1)
    77  			sum += delta(b0, b1)
    78  			n += 3
    79  		}
    80  	}
    81  	return sum / n
    82  }
    83  
    84  func delta(u0, u1 uint32) int64 {
    85  	d := int64(u0) - int64(u1)
    86  	if d < 0 {
    87  		return -d
    88  	}
    89  	return d
    90  }