git.lucas.co / go_mono
git clone https://git.lucas.co/go_mono.git

tiff/writer_test.go (2.7K)

  1 // Copyright 2012 The Go Authors. 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 tiff
  6 
  7 import (
  8 	"bytes"
  9 	"image"
 10 	"io/ioutil"
 11 	"os"
 12 	"testing"
 13 )
 14 
 15 var roundtripTests = []struct {
 16 	filename string
 17 	opts     *Options
 18 }{
 19 	{"video-001.tiff", nil},
 20 	{"video-001-16bit.tiff", nil},
 21 	{"video-001-gray.tiff", nil},
 22 	{"video-001-gray-16bit.tiff", nil},
 23 	{"video-001-paletted.tiff", nil},
 24 	{"bw-packbits.tiff", nil},
 25 	{"video-001.tiff", &Options{Predictor: true}},
 26 	{"video-001.tiff", &Options{Compression: Deflate}},
 27 	{"video-001.tiff", &Options{Predictor: true, Compression: Deflate}},
 28 }
 29 
 30 func openImage(filename string) (image.Image, error) {
 31 	f, err := os.Open(testdataDir + filename)
 32 	if err != nil {
 33 		return nil, err
 34 	}
 35 	defer f.Close()
 36 	return Decode(f)
 37 }
 38 
 39 func TestRoundtrip(t *testing.T) {
 40 	for _, rt := range roundtripTests {
 41 		img, err := openImage(rt.filename)
 42 		if err != nil {
 43 			t.Fatal(err)
 44 		}
 45 
 46 		out := new(bytes.Buffer)
 47 		err = Encode(out, img, rt.opts)
 48 		if err != nil {
 49 			t.Fatal(err)
 50 		}
 51 
 52 		img2, err := Decode(&buffer{buf: out.Bytes()})
 53 		if err != nil {
 54 			t.Fatal(err)
 55 		}
 56 		compare(t, img, img2)
 57 	}
 58 }
 59 
 60 // TestRoundtrip2 tests that encoding and decoding an image whose
 61 // origin is not (0, 0) gives the same thing.
 62 func TestRoundtrip2(t *testing.T) {
 63 	m0 := image.NewRGBA(image.Rect(3, 4, 9, 8))
 64 	for i := range m0.Pix {
 65 		m0.Pix[i] = byte(i)
 66 	}
 67 	out := new(bytes.Buffer)
 68 	if err := Encode(out, m0, nil); err != nil {
 69 		t.Fatal(err)
 70 	}
 71 	m1, err := Decode(&buffer{buf: out.Bytes()})
 72 	if err != nil {
 73 		t.Fatal(err)
 74 	}
 75 	compare(t, m0, m1)
 76 }
 77 
 78 func TestUnsupported(t *testing.T) {
 79 	img := image.NewGray(image.Rect(0, 0, 1, 1))
 80 	out := new(bytes.Buffer)
 81 	err := Encode(out, img, &Options{Compression: LZW})
 82 	if err == nil {
 83 		t.Error("tiff.Encode(LZW): no error returned, expected an error")
 84 	}
 85 }
 86 
 87 func benchmarkEncode(b *testing.B, name string, pixelSize int) {
 88 	b.Helper()
 89 	img, err := openImage(name)
 90 	if err != nil {
 91 		b.Fatal(err)
 92 	}
 93 	s := img.Bounds().Size()
 94 	b.SetBytes(int64(s.X * s.Y * pixelSize))
 95 	b.ResetTimer()
 96 	for i := 0; i < b.N; i++ {
 97 		Encode(ioutil.Discard, img, nil)
 98 	}
 99 }
100 
101 func BenchmarkEncode(b *testing.B)         { benchmarkEncode(b, "video-001.tiff", 4) }
102 func BenchmarkEncodePaletted(b *testing.B) { benchmarkEncode(b, "video-001-paletted.tiff", 1) }
103 func BenchmarkEncodeGray(b *testing.B)     { benchmarkEncode(b, "video-001-gray.tiff", 1) }
104 func BenchmarkEncodeGray16(b *testing.B)   { benchmarkEncode(b, "video-001-gray-16bit.tiff", 2) }
105 func BenchmarkEncodeRGBA(b *testing.B)     { benchmarkEncode(b, "video-001.tiff", 4) }
106 func BenchmarkEncodeRGBA64(b *testing.B)   { benchmarkEncode(b, "video-001-16bit.tiff", 8) }