From ff6b9223616f673aaeddb791f9e0303591b128bc Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Wed, 18 Dec 2013 15:10:40 -0500 Subject: [PATCH] image/gif: respect local color table transparency. Fixes #6441. R=r CC=andybons, golang-dev https://golang.org/cl/13829043 --- src/pkg/image/gif/reader.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pkg/image/gif/reader.go b/src/pkg/image/gif/reader.go index 8b0298a29f3..926710a4562 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)