diff options
author | Nigel Tao <nigeltao@golang.org> | 2014-09-18 12:43:01 +1000 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2014-09-18 12:43:01 +1000 |
commit | 119f5863b018f819c46f6dbc733e18aa05642fde (patch) | |
tree | c8b20e3be108713bc32e95a286c0283232047f22 /src/image/gif | |
parent | 752cffdaad35fdd07fe7aaebbc3f37a686760b65 (diff) | |
download | go-119f5863b018f819c46f6dbc733e18aa05642fde.tar.gz |
image/gif: fix GIF encoding of sub-images.
benchmark old ns/op new ns/op delta
BenchmarkEncode 8641055 8646829 +0.07%
Fixes issue 7792.
LGTM=r
R=r
CC=dbathgate, golang-codereviews
https://codereview.appspot.com/147730043
Diffstat (limited to 'src/image/gif')
-rw-r--r-- | src/image/gif/writer.go | 18 | ||||
-rw-r--r-- | src/image/gif/writer_test.go | 23 |
2 files changed, 37 insertions, 4 deletions
diff --git a/src/image/gif/writer.go b/src/image/gif/writer.go index 15cd40fad..49abde704 100644 --- a/src/image/gif/writer.go +++ b/src/image/gif/writer.go @@ -233,10 +233,20 @@ func (e *encoder) writeImageBlock(pm *image.Paletted, delay int) { e.writeByte(uint8(litWidth)) // LZW Minimum Code Size. lzww := lzw.NewWriter(blockWriter{e: e}, lzw.LSB, litWidth) - _, e.err = lzww.Write(pm.Pix) - if e.err != nil { - lzww.Close() - return + if dx := b.Dx(); dx == pm.Stride { + _, e.err = lzww.Write(pm.Pix) + if e.err != nil { + lzww.Close() + return + } + } else { + for i, y := 0, b.Min.Y; y < b.Max.Y; i, y = i+pm.Stride, y+1 { + _, e.err = lzww.Write(pm.Pix[i : i+dx]) + if e.err != nil { + lzww.Close() + return + } + } } lzww.Close() e.writeByte(0x00) // Block Terminator. diff --git a/src/image/gif/writer_test.go b/src/image/gif/writer_test.go index bc5d37845..93306ffdb 100644 --- a/src/image/gif/writer_test.go +++ b/src/image/gif/writer_test.go @@ -102,6 +102,29 @@ func TestWriter(t *testing.T) { } } +func TestSubImage(t *testing.T) { + m0, err := readImg("../testdata/video-001.gif") + if err != nil { + t.Fatalf("readImg: %v", err) + } + m0 = m0.(*image.Paletted).SubImage(image.Rect(0, 0, 50, 30)) + var buf bytes.Buffer + err = Encode(&buf, m0, nil) + if err != nil { + t.Fatalf("Encode: %v", err) + } + m1, err := Decode(&buf) + if err != nil { + t.Fatalf("Decode: %v", err) + } + if m0.Bounds() != m1.Bounds() { + t.Fatalf("bounds differ: %v and %v", m0.Bounds(), m1.Bounds()) + } + if averageDelta(m0, m1) != 0 { + t.Fatalf("images differ") + } +} + var frames = []string{ "../testdata/video-001.gif", "../testdata/video-005.gray.gif", |