aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/image/gif/reader.go16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/image/gif/reader.go b/src/image/gif/reader.go
index b1335e6125..19f3c61e5d 100644
--- a/src/image/gif/reader.go
+++ b/src/image/gif/reader.go
@@ -150,7 +150,7 @@ func (b *blockReader) Read(p []byte) (int, error) {
}
// decode reads a GIF image from r and stores the result in d.
-func (d *decoder) decode(r io.Reader, configOnly bool) error {
+func (d *decoder) decode(r io.Reader, configOnly, keepAllFrames bool) error {
// Add buffering if r does not provide ReadByte.
if rr, ok := r.(reader); ok {
d.r = rr
@@ -279,9 +279,11 @@ func (d *decoder) decode(r io.Reader, configOnly bool) error {
uninterlace(m)
}
- d.image = append(d.image, m)
- d.delay = append(d.delay, d.delayTime)
- d.disposal = append(d.disposal, d.disposalMethod)
+ if keepAllFrames || len(d.image) == 0 {
+ d.image = append(d.image, m)
+ d.delay = append(d.delay, d.delayTime)
+ d.disposal = append(d.disposal, d.disposalMethod)
+ }
// 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.
@@ -491,7 +493,7 @@ func uninterlace(m *image.Paletted) {
// image as an image.Image.
func Decode(r io.Reader) (image.Image, error) {
var d decoder
- if err := d.decode(r, false); err != nil {
+ if err := d.decode(r, false, false); err != nil {
return nil, err
}
return d.image[0], nil
@@ -526,7 +528,7 @@ type GIF struct {
// and timing information.
func DecodeAll(r io.Reader) (*GIF, error) {
var d decoder
- if err := d.decode(r, false); err != nil {
+ if err := d.decode(r, false, true); err != nil {
return nil, err
}
gif := &GIF{
@@ -548,7 +550,7 @@ func DecodeAll(r io.Reader) (*GIF, error) {
// without decoding the entire image.
func DecodeConfig(r io.Reader) (image.Config, error) {
var d decoder
- if err := d.decode(r, true); err != nil {
+ if err := d.decode(r, true, false); err != nil {
return image.Config{}, err
}
return image.Config{