diff options
Diffstat (limited to 'src/pkg/image/gif')
-rw-r--r-- | src/pkg/image/gif/reader.go | 22 | ||||
-rw-r--r-- | src/pkg/image/gif/reader_test.go | 4 |
2 files changed, 15 insertions, 11 deletions
diff --git a/src/pkg/image/gif/reader.go b/src/pkg/image/gif/reader.go index 8b0298a29..926710a45 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) diff --git a/src/pkg/image/gif/reader_test.go b/src/pkg/image/gif/reader_test.go index 09867132d..fc2041e99 100644 --- a/src/pkg/image/gif/reader_test.go +++ b/src/pkg/image/gif/reader_test.go @@ -1,3 +1,7 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + package gif import ( |