]> Cypherpunks repositories - gostls13.git/commitdiff
image/gif: respect local color table transparency.
authorNigel Tao <nigeltao@golang.org>
Wed, 18 Dec 2013 20:10:40 +0000 (15:10 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 18 Dec 2013 20:10:40 +0000 (15:10 -0500)
Fixes #6441.

R=r
CC=andybons, golang-dev
https://golang.org/cl/13829043

src/pkg/image/gif/reader.go

index 8b0298a29f3dde2aabef870e31136cf52eac5434..926710a4562da27068b16eb429c115586f8b7301 100644 (file)
@@ -79,7 +79,8 @@ type decoder struct {
        imageFields byte
 
        // From graphics control.
-       transparentIndex byte
+       transparentIndex    byte
+       hasTransparentIndex bool
 
        // Computed.
        pixelSize      uint
@@ -175,11 +176,12 @@ func (d *decoder) decode(r io.Reader, configOnly bool) error {
                                if err != nil {
                                        return err
                                }
-                               // TODO: do we set transparency in this map too? That would be
-                               // d.setTransparency(m.Palette)
                        } else {
                                m.Palette = d.globalColorMap
                        }
+                       if d.hasTransparentIndex && int(d.transparentIndex) < len(m.Palette) {
+                               m.Palette[d.transparentIndex] = color.RGBA{}
+                       }
                        litWidth, err := d.r.ReadByte()
                        if err != nil {
                                return err
@@ -228,7 +230,11 @@ func (d *decoder) decode(r io.Reader, configOnly bool) error {
 
                        d.image = append(d.image, m)
                        d.delay = append(d.delay, d.delayTime)
-                       d.delayTime = 0 // TODO: is this correct, or should we hold on to the value?
+                       // The GIF89a spec, Section 23 (Graphic Control Extension) says:
+                       // "The scope of this extension is the first graphic rendering block
+                       // to follow." We therefore reset the GCE fields to zero.
+                       d.delayTime = 0
+                       d.hasTransparentIndex = false
 
                case sTrailer:
                        if len(d.image) == 0 {
@@ -339,17 +345,11 @@ func (d *decoder) readGraphicControl() error {
        d.delayTime = int(d.tmp[2]) | int(d.tmp[3])<<8
        if d.flags&gcTransparentColorSet != 0 {
                d.transparentIndex = d.tmp[4]
-               d.setTransparency(d.globalColorMap)
+               d.hasTransparentIndex = true
        }
        return nil
 }
 
-func (d *decoder) setTransparency(colorMap color.Palette) {
-       if int(d.transparentIndex) < len(colorMap) {
-               colorMap[d.transparentIndex] = color.RGBA{}
-       }
-}
-
 func (d *decoder) newImageFromDescriptor() (*image.Paletted, error) {
        if _, err := io.ReadFull(d.r, d.tmp[0:9]); err != nil {
                return nil, fmt.Errorf("gif: can't read image descriptor: %s", err)