From: Nigel Tao Date: Wed, 18 Dec 2013 20:10:40 +0000 (-0500) Subject: image/gif: respect local color table transparency. X-Git-Tag: go1.3beta1~1161 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ff6b9223616f673aaeddb791f9e0303591b128bc;p=gostls13.git image/gif: respect local color table transparency. Fixes #6441. R=r CC=andybons, golang-dev https://golang.org/cl/13829043 --- diff --git a/src/pkg/image/gif/reader.go b/src/pkg/image/gif/reader.go index 8b0298a29f..926710a456 100644 --- a/src/pkg/image/gif/reader.go +++ b/src/pkg/image/gif/reader.go @@ -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)