summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNigel Tao <nigeltao@golang.org>2009-12-29 15:23:55 +1100
committerNigel Tao <nigeltao@golang.org>2009-12-29 15:23:55 +1100
commitd506f10323894a63b987c6c2a13c251180739c38 (patch)
tree433a1f94ae63d91114de69874bb3ea5b34caa30f
parentd971a42550d4683d70a7db5245c3a7d1d3734111 (diff)
downloadgo-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.go32
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