diff options
author | Nigel Tao <nigeltao@golang.org> | 2009-12-29 15:23:55 +1100 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2009-12-29 15:23:55 +1100 |
commit | d506f10323894a63b987c6c2a13c251180739c38 (patch) | |
tree | 433a1f94ae63d91114de69874bb3ea5b34caa30f | |
parent | d971a42550d4683d70a7db5245c3a7d1d3734111 (diff) | |
download | go-d506f10323894a63b987c6c2a13c251180739c38.tar.gz |
PNG decoder now handles transparent paletted images.
Fixes issue 439.
R=r
CC=golang-dev
http://codereview.appspot.com/181087
-rw-r--r-- | src/pkg/image/png/reader.go | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/pkg/image/png/reader.go b/src/pkg/image/png/reader.go index 9176524c9..5db125eb3 100644 --- a/src/pkg/image/png/reader.go +++ b/src/pkg/image/png/reader.go @@ -164,6 +164,33 @@ func (d *decoder) parsePLTE(r io.Reader, crc hash.Hash32, length uint32) os.Erro return nil } +func (d *decoder) parsetRNS(r io.Reader, crc hash.Hash32, length uint32) os.Error { + if length > 256 { + return FormatError("bad tRNS length") + } + n, err := io.ReadFull(r, d.tmp[0:length]) + if err != nil { + return err + } + crc.Write(d.tmp[0:n]) + switch d.colorType { + case ctTrueColor: + return UnsupportedError("TrueColor transparency") + case ctPaletted: + p := d.image.(*image.Paletted).Palette + if n > len(p) { + return FormatError("bad tRNS length") + } + for i := 0; i < n; i++ { + rgba := p[i].(image.RGBAColor) + p[i] = image.RGBAColor{rgba.R, rgba.G, rgba.B, d.tmp[i]} + } + case ctTrueColorAlpha: + return FormatError("tRNS, color type mismatch") + } + return nil +} + // The Paeth filter function, as per the PNG specification. func paeth(a, b, c uint8) uint8 { p := int(a) + int(b) - int(c) @@ -353,6 +380,11 @@ func (d *decoder) parseChunk(r io.Reader) os.Error { } d.stage = dsSeenPLTE err = d.parsePLTE(r, crc, length) + case "tRNS": + if d.stage != dsSeenPLTE { + return chunkOrderError + } + err = d.parsetRNS(r, crc, length) case "IDAT": if d.stage < dsSeenIHDR || d.stage > dsSeenIDAT || (d.colorType == ctPaletted && d.stage == dsSeenIHDR) { return chunkOrderError |