]> Cypherpunks repositories - gostls13.git/commitdiff
image/png: always set up palette during DecodeConfig
authorVolker Dobler <dr.volker.dobler@gmail.com>
Mon, 4 Mar 2013 03:54:36 +0000 (14:54 +1100)
committerNigel Tao <nigeltao@golang.org>
Mon, 4 Mar 2013 03:54:36 +0000 (14:54 +1100)
The old code would decode the palette only for 8-bit
images during a DecodeConfig.
This CL keeps the behavior for 8-bit images and sets
up the decoded palette also for 1, 2 and 4-bit images.

Fixes #4279.

R=golang-dev, nigeltao
CC=golang-dev
https://golang.org/cl/7421048

src/pkg/image/png/reader.go
src/pkg/image/png/reader_test.go

index ff837331f81b991ee0768bc62849c2b5c9a7a03c..a6bf86ede6505036ee3800f1484d6fdbb9f38041 100644 (file)
@@ -652,10 +652,11 @@ func DecodeConfig(r io.Reader) (image.Config, error) {
                        }
                        return image.Config{}, err
                }
-               if d.stage == dsSeenIHDR && d.cb != cbP8 {
+               paletted := d.cb == cbP8 || d.cb == cbP4 || d.cb == cbP2 || d.cb == cbP1
+               if d.stage == dsSeenIHDR && !paletted {
                        break
                }
-               if d.stage == dsSeenPLTE && d.cb == cbP8 {
+               if d.stage == dsSeenPLTE && paletted {
                        break
                }
        }
index b682bd0968b9e3d4cc0a0c7208d0802a9b80cf15..ac0d949a9d3905eff785db46c2af683a3c1a63d7 100644 (file)
@@ -38,6 +38,14 @@ var filenames = []string{
        "basn6a16",
 }
 
+var filenamesPaletted = []string{
+       "basn3p01",
+       "basn3p02",
+       "basn3p04",
+       "basn3p08",
+       "basn3p08-trns",
+}
+
 var filenamesShort = []string{
        "basn0g01",
        "basn0g04-31",
@@ -278,6 +286,31 @@ func TestReaderError(t *testing.T) {
        }
 }
 
+func TestPalettedDecodeConfig(t *testing.T) {
+       for _, fn := range filenamesPaletted {
+               f, err := os.Open("testdata/pngsuite/" + fn + ".png")
+               if err != nil {
+                       t.Errorf("%s: open failed: %v", fn, err)
+                       continue
+               }
+               defer f.Close()
+               cfg, err := DecodeConfig(f)
+               if err != nil {
+                       t.Errorf("%s: %v", fn, err)
+                       continue
+               }
+               pal, ok := cfg.ColorModel.(color.Palette)
+               if !ok {
+                       t.Errorf("%s: expected paletted color model", fn)
+                       continue
+               }
+               if pal == nil {
+                       t.Errorf("%s: palette not initialized", fn)
+                       continue
+               }
+       }
+}
+
 func benchmarkDecode(b *testing.B, filename string, bytesPerPixel int) {
        b.StopTimer()
        data, err := ioutil.ReadFile(filename)