]> Cypherpunks repositories - gostls13.git/commitdiff
image/gif: fix GIF encoding of sub-images.
authorNigel Tao <nigeltao@golang.org>
Thu, 18 Sep 2014 02:43:01 +0000 (12:43 +1000)
committerNigel Tao <nigeltao@golang.org>
Thu, 18 Sep 2014 02:43:01 +0000 (12:43 +1000)
benchmark                    old ns/op     new ns/op     delta
BenchmarkEncode              8641055       8646829       +0.07%

Fixes #7792.

LGTM=r
R=r
CC=dbathgate, golang-codereviews
https://golang.org/cl/147730043

src/image/gif/writer.go
src/image/gif/writer_test.go

index 15cd40fadf6d729383394461372b93cd503bb795..49abde704c86669af12714da0bc505d3ceae4492 100644 (file)
@@ -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.
index bc5d37845b630c941e9c49a3264e9f3962c969d8..93306ffdb34e3c3d34edc4fa91d98c5c4e88a2fe 100644 (file)
@@ -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",