From 5c2f01f3923cae85f50260778b8ad0f9d857fd1d Mon Sep 17 00:00:00 2001 From: Dustin Long Date: Fri, 11 Jul 2014 11:02:02 +1000 Subject: [PATCH] image/png: interlacing support for png. Fixes #6293. Image "testdata/benchRGB-interlace.png" was generated by opening "testdata/benchRGB.png" in the editor Gimp and saving it with interlacing enabled. Benchmark: BenchmarkDecodeRGB 500 7014194 ns/op 37.37 MB/s ok pkg/image/png 4.657s BenchmarkDecodeInterlacing 100 10623241 ns/op 24.68 MB/s ok pkg/image/png 1.339s LGTM=nigeltao R=nigeltao, andybons, matrixik CC=golang-codereviews https://golang.org/cl/102130044 --- src/pkg/image/png/reader.go | 219 ++++++++++++++---- src/pkg/image/png/reader_test.go | 12 + .../image/png/testdata/benchRGB-interlace.png | Bin 0 -> 47483 bytes .../png/testdata/pngsuite/basn3p04-31i.png | Bin 0 -> 358 bytes .../png/testdata/pngsuite/basn3p04-31i.sng | 57 +++++ 5 files changed, 239 insertions(+), 49 deletions(-) create mode 100644 src/pkg/image/png/testdata/benchRGB-interlace.png create mode 100644 src/pkg/image/png/testdata/pngsuite/basn3p04-31i.png create mode 100644 src/pkg/image/png/testdata/pngsuite/basn3p04-31i.sng diff --git a/src/pkg/image/png/reader.go b/src/pkg/image/png/reader.go index dfe2991024..0a40ca161d 100644 --- a/src/pkg/image/png/reader.go +++ b/src/pkg/image/png/reader.go @@ -57,6 +57,29 @@ const ( nFilter = 5 ) +// Interlace type. +const ( + itNone = 0 + itAdam7 = 1 +) + +// interlaceScan defines the placement and size of a pass for Adam7 interlacing. +type interlaceScan struct { + xFactor, yFactor, xOffset, yOffset int +} + +// interlacing defines Adam7 interlacing, with 7 passes of reduced images. +// See http://www.w3.org/TR/PNG/#8Interlace +var interlacing = []interlaceScan{ + {8, 8, 0, 0}, + {8, 8, 4, 0}, + {4, 8, 0, 4}, + {4, 4, 2, 0}, + {2, 4, 0, 2}, + {2, 2, 1, 0}, + {1, 2, 0, 1}, +} + // Decoding stage. // The PNG specification says that the IHDR, PLTE (if present), IDAT and IEND // chunks must appear in that order. There may be multiple IDAT chunks, and @@ -84,6 +107,7 @@ type decoder struct { stage int idatLength uint32 tmp [3 * 256]byte + interlace int } // A FormatError reports that the input is not a valid PNG. @@ -113,9 +137,16 @@ func (d *decoder) parseIHDR(length uint32) error { return err } d.crc.Write(d.tmp[:13]) - if d.tmp[10] != 0 || d.tmp[11] != 0 || d.tmp[12] != 0 { - return UnsupportedError("compression, filter or interlace method") + if d.tmp[10] != 0 { + return UnsupportedError("compression method") } + if d.tmp[11] != 0 { + return UnsupportedError("filter method") + } + if d.tmp[12] != itNone && d.tmp[12] != itAdam7 { + return FormatError("invalid interlace method") + } + d.interlace = int(d.tmp[12]) w := int32(binary.BigEndian.Uint32(d.tmp[0:4])) h := int32(binary.BigEndian.Uint32(d.tmp[4:8])) if w < 0 || h < 0 { @@ -287,7 +318,42 @@ func (d *decoder) decode() (image.Image, error) { return nil, err } defer r.Close() - bitsPerPixel := 0 + var img image.Image + if d.interlace == itNone { + img, err = d.readImagePass(r, 0, false) + } else if d.interlace == itAdam7 { + // Allocate a blank image of the full size. + img, err = d.readImagePass(nil, 0, true) + for pass := 0; pass < 7; pass++ { + imagePass, err := d.readImagePass(r, pass, false) + if err != nil { + return nil, err + } + d.mergePassInto(img, imagePass, pass) + } + } + + // Check for EOF, to verify the zlib checksum. + n := 0 + for i := 0; n == 0 && err == nil; i++ { + if i == 100 { + return nil, io.ErrNoProgress + } + n, err = r.Read(d.tmp[:1]) + } + if err != nil && err != io.EOF { + return nil, FormatError(err.Error()) + } + if n != 0 || d.idatLength != 0 { + return nil, FormatError("too much pixel data") + } + + return img, nil +} + +// readImagePass reads a single image pass, sized according to the pass number. +func (d *decoder) readImagePass(r io.Reader, pass int, allocateOnly bool) (image.Image, error) { + var bitsPerPixel int = 0 pixOffset := 0 var ( gray *image.Gray @@ -299,52 +365,63 @@ func (d *decoder) decode() (image.Image, error) { nrgba64 *image.NRGBA64 img image.Image ) + width, height := d.width, d.height + if d.interlace == itAdam7 && !allocateOnly { + p := interlacing[pass] + // Add the multiplication factor and subtract one, effectively rounding up. + width = (width - p.xOffset + p.xFactor - 1) / p.xFactor + height = (height - p.yOffset + p.yFactor - 1) / p.yFactor + } switch d.cb { case cbG1, cbG2, cbG4, cbG8: bitsPerPixel = d.depth - gray = image.NewGray(image.Rect(0, 0, d.width, d.height)) + gray = image.NewGray(image.Rect(0, 0, width, height)) img = gray case cbGA8: bitsPerPixel = 16 - nrgba = image.NewNRGBA(image.Rect(0, 0, d.width, d.height)) + nrgba = image.NewNRGBA(image.Rect(0, 0, width, height)) img = nrgba case cbTC8: bitsPerPixel = 24 - rgba = image.NewRGBA(image.Rect(0, 0, d.width, d.height)) + rgba = image.NewRGBA(image.Rect(0, 0, width, height)) img = rgba case cbP1, cbP2, cbP4, cbP8: bitsPerPixel = d.depth - paletted = image.NewPaletted(image.Rect(0, 0, d.width, d.height), d.palette) + paletted = image.NewPaletted(image.Rect(0, 0, width, height), d.palette) img = paletted case cbTCA8: bitsPerPixel = 32 - nrgba = image.NewNRGBA(image.Rect(0, 0, d.width, d.height)) + nrgba = image.NewNRGBA(image.Rect(0, 0, width, height)) img = nrgba case cbG16: bitsPerPixel = 16 - gray16 = image.NewGray16(image.Rect(0, 0, d.width, d.height)) + gray16 = image.NewGray16(image.Rect(0, 0, width, height)) img = gray16 case cbGA16: bitsPerPixel = 32 - nrgba64 = image.NewNRGBA64(image.Rect(0, 0, d.width, d.height)) + nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height)) img = nrgba64 case cbTC16: bitsPerPixel = 48 - rgba64 = image.NewRGBA64(image.Rect(0, 0, d.width, d.height)) + rgba64 = image.NewRGBA64(image.Rect(0, 0, width, height)) img = rgba64 case cbTCA16: bitsPerPixel = 64 - nrgba64 = image.NewNRGBA64(image.Rect(0, 0, d.width, d.height)) + nrgba64 = image.NewNRGBA64(image.Rect(0, 0, width, height)) img = nrgba64 } + if allocateOnly { + return img, nil + } bytesPerPixel := (bitsPerPixel + 7) / 8 - // cr and pr are the bytes for the current and previous row. // The +1 is for the per-row filter type, which is at cr[0]. - cr := make([]uint8, 1+(bitsPerPixel*d.width+7)/8) - pr := make([]uint8, 1+(bitsPerPixel*d.width+7)/8) + rowSize := 1 + (bitsPerPixel*width+7)/8 + // cr and pr are the bytes for the current and previous row. + cr := make([]uint8, rowSize) + pr := make([]uint8, rowSize) - for y := 0; y < d.height; y++ { + for y := 0; y < height; y++ { // Read the decompressed bytes. _, err := io.ReadFull(r, cr) if err != nil { @@ -381,25 +458,25 @@ func (d *decoder) decode() (image.Image, error) { // Convert from bytes to colors. switch d.cb { case cbG1: - for x := 0; x < d.width; x += 8 { + for x := 0; x < width; x += 8 { b := cdat[x/8] - for x2 := 0; x2 < 8 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 8 && x+x2 < width; x2++ { gray.SetGray(x+x2, y, color.Gray{(b >> 7) * 0xff}) b <<= 1 } } case cbG2: - for x := 0; x < d.width; x += 4 { + for x := 0; x < width; x += 4 { b := cdat[x/4] - for x2 := 0; x2 < 4 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 4 && x+x2 < width; x2++ { gray.SetGray(x+x2, y, color.Gray{(b >> 6) * 0x55}) b <<= 2 } } case cbG4: - for x := 0; x < d.width; x += 2 { + for x := 0; x < width; x += 2 { b := cdat[x/2] - for x2 := 0; x2 < 2 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 2 && x+x2 < width; x2++ { gray.SetGray(x+x2, y, color.Gray{(b >> 4) * 0x11}) b <<= 4 } @@ -408,13 +485,13 @@ func (d *decoder) decode() (image.Image, error) { copy(gray.Pix[pixOffset:], cdat) pixOffset += gray.Stride case cbGA8: - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { ycol := cdat[2*x+0] nrgba.SetNRGBA(x, y, color.NRGBA{ycol, ycol, ycol, cdat[2*x+1]}) } case cbTC8: pix, i, j := rgba.Pix, pixOffset, 0 - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { pix[i+0] = cdat[j+0] pix[i+1] = cdat[j+1] pix[i+2] = cdat[j+2] @@ -424,9 +501,9 @@ func (d *decoder) decode() (image.Image, error) { } pixOffset += rgba.Stride case cbP1: - for x := 0; x < d.width; x += 8 { + for x := 0; x < width; x += 8 { b := cdat[x/8] - for x2 := 0; x2 < 8 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 8 && x+x2 < width; x2++ { idx := b >> 7 if len(paletted.Palette) <= int(idx) { paletted.Palette = paletted.Palette[:int(idx)+1] @@ -436,9 +513,9 @@ func (d *decoder) decode() (image.Image, error) { } } case cbP2: - for x := 0; x < d.width; x += 4 { + for x := 0; x < width; x += 4 { b := cdat[x/4] - for x2 := 0; x2 < 4 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 4 && x+x2 < width; x2++ { idx := b >> 6 if len(paletted.Palette) <= int(idx) { paletted.Palette = paletted.Palette[:int(idx)+1] @@ -448,9 +525,9 @@ func (d *decoder) decode() (image.Image, error) { } } case cbP4: - for x := 0; x < d.width; x += 2 { + for x := 0; x < width; x += 2 { b := cdat[x/2] - for x2 := 0; x2 < 2 && x+x2 < d.width; x2++ { + for x2 := 0; x2 < 2 && x+x2 < width; x2++ { idx := b >> 4 if len(paletted.Palette) <= int(idx) { paletted.Palette = paletted.Palette[:int(idx)+1] @@ -461,7 +538,7 @@ func (d *decoder) decode() (image.Image, error) { } case cbP8: if len(paletted.Palette) != 255 { - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { if len(paletted.Palette) <= int(cdat[x]) { paletted.Palette = paletted.Palette[:int(cdat[x])+1] } @@ -473,25 +550,25 @@ func (d *decoder) decode() (image.Image, error) { copy(nrgba.Pix[pixOffset:], cdat) pixOffset += nrgba.Stride case cbG16: - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { ycol := uint16(cdat[2*x+0])<<8 | uint16(cdat[2*x+1]) gray16.SetGray16(x, y, color.Gray16{ycol}) } case cbGA16: - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { ycol := uint16(cdat[4*x+0])<<8 | uint16(cdat[4*x+1]) acol := uint16(cdat[4*x+2])<<8 | uint16(cdat[4*x+3]) nrgba64.SetNRGBA64(x, y, color.NRGBA64{ycol, ycol, ycol, acol}) } case cbTC16: - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { rcol := uint16(cdat[6*x+0])<<8 | uint16(cdat[6*x+1]) gcol := uint16(cdat[6*x+2])<<8 | uint16(cdat[6*x+3]) bcol := uint16(cdat[6*x+4])<<8 | uint16(cdat[6*x+5]) rgba64.SetRGBA64(x, y, color.RGBA64{rcol, gcol, bcol, 0xffff}) } case cbTCA16: - for x := 0; x < d.width; x++ { + for x := 0; x < width; x++ { rcol := uint16(cdat[8*x+0])<<8 | uint16(cdat[8*x+1]) gcol := uint16(cdat[8*x+2])<<8 | uint16(cdat[8*x+3]) bcol := uint16(cdat[8*x+4])<<8 | uint16(cdat[8*x+5]) @@ -504,22 +581,66 @@ func (d *decoder) decode() (image.Image, error) { pr, cr = cr, pr } - // Check for EOF, to verify the zlib checksum. - n := 0 - for i := 0; n == 0 && err == nil; i++ { - if i == 100 { - return nil, io.ErrNoProgress + return img, nil +} + +// mergePassInto merges a single pass into a full sized image. +func (d *decoder) mergePassInto(dst image.Image, src image.Image, pass int) { + p := interlacing[pass] + var ( + srcPix []uint8 + dstPix []uint8 + stride int + rect image.Rectangle + bytesPerPixel int + ) + switch target := dst.(type) { + case *image.Alpha: + srcPix = src.(*image.Alpha).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 1 + case *image.Alpha16: + srcPix = src.(*image.Alpha16).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 2 + case *image.Gray: + srcPix = src.(*image.Gray).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 1 + case *image.Gray16: + srcPix = src.(*image.Gray16).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 2 + case *image.NRGBA: + srcPix = src.(*image.NRGBA).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 4 + case *image.NRGBA64: + srcPix = src.(*image.NRGBA64).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 8 + case *image.Paletted: + srcPix = src.(*image.Paletted).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 1 + case *image.RGBA: + srcPix = src.(*image.RGBA).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 4 + case *image.RGBA64: + srcPix = src.(*image.RGBA64).Pix + dstPix, stride, rect = target.Pix, target.Stride, target.Rect + bytesPerPixel = 8 + } + s, bounds := 0, src.Bounds() + for y := bounds.Min.Y; y < bounds.Max.Y; y++ { + dBase := (y*p.yFactor+p.yOffset-rect.Min.Y)*stride + (p.xOffset-rect.Min.X)*bytesPerPixel + for x := bounds.Min.X; x < bounds.Max.X; x++ { + d := dBase + x*p.xFactor*bytesPerPixel + copy(dstPix[d:], srcPix[s:s+bytesPerPixel]) + s += bytesPerPixel } - n, err = r.Read(pr[:1]) } - if err != nil && err != io.EOF { - return nil, FormatError(err.Error()) - } - if n != 0 || d.idatLength != 0 { - return nil, FormatError("too much pixel data") - } - - return img, nil } func (d *decoder) parseIDAT(length uint32) (err error) { diff --git a/src/pkg/image/png/reader_test.go b/src/pkg/image/png/reader_test.go index 0bc3c8d4a1..ce772eb6f0 100644 --- a/src/pkg/image/png/reader_test.go +++ b/src/pkg/image/png/reader_test.go @@ -30,6 +30,7 @@ var filenames = []string{ "basn3p01", "basn3p02", "basn3p04", + "basn3p04-31i", "basn3p08", "basn3p08-trns", "basn4a08", @@ -186,6 +187,13 @@ func sng(w io.WriteCloser, filename string, png image.Image) { c = 0 } } + if c != 0 { + for c != 8/bitdepth { + b = b << uint(bitdepth) + c++ + } + fmt.Fprintf(w, "%02x", b) + } } io.WriteString(w, "\n") } @@ -348,3 +356,7 @@ func BenchmarkDecodePaletted(b *testing.B) { func BenchmarkDecodeRGB(b *testing.B) { benchmarkDecode(b, "testdata/benchRGB.png", 4) } + +func BenchmarkDecodeInterlacing(b *testing.B) { + benchmarkDecode(b, "testdata/benchRGB-interlace.png", 4) +} diff --git a/src/pkg/image/png/testdata/benchRGB-interlace.png b/src/pkg/image/png/testdata/benchRGB-interlace.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b5daba3c6e03fc0789df7444247221826b1bb7 GIT binary patch literal 47483 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 literal 0 HcmV?d00001 diff --git a/src/pkg/image/png/testdata/pngsuite/basn3p04-31i.sng b/src/pkg/image/png/testdata/pngsuite/basn3p04-31i.sng new file mode 100644 index 0000000000..31b87c72d1 --- /dev/null +++ b/src/pkg/image/png/testdata/pngsuite/basn3p04-31i.sng @@ -0,0 +1,57 @@ +#SNG: from basn3p04-31i.png +IHDR { + width: 31; height: 31; bitdepth: 4; + using color palette; +} +gAMA {1.0000} +PLTE { + ( 34, 0,255) # rgb = (0x22,0x00,0xff) + ( 0,255,255) # rgb = (0x00,0xff,0xff) + (136, 0,255) # rgb = (0x88,0x00,0xff) + ( 34,255, 0) # rgb = (0x22,0xff,0x00) + ( 0,153,255) # rgb = (0x00,0x99,0xff) + (255,102, 0) # rgb = (0xff,0x66,0x00) + (221, 0,255) # rgb = (0xdd,0x00,0xff) + (119,255, 0) # rgb = (0x77,0xff,0x00) + (255, 0, 0) # rgb = (0xff,0x00,0x00) + ( 0,255,153) # rgb = (0x00,0xff,0x99) + (221,255, 0) # rgb = (0xdd,0xff,0x00) + (255, 0,187) # rgb = (0xff,0x00,0xbb) + (255,187, 0) # rgb = (0xff,0xbb,0x00) + ( 0, 68,255) # rgb = (0x00,0x44,0xff) + ( 0,255, 68) # rgb = (0x00,0xff,0x44) +} +IMAGE { + pixels hex +88885555ccccaaaa77773333eeee9990 +88885555ccccaaaa77773333eeee9990 +88885555ccccaaaa77773333eeee9990 +88885555ccccaaaa77773333eeee9990 +5555ccccaaaa77773333eeee99991110 +5555ccccaaaa77773333eeee99991110 +5555ccccaaaa77773333eeee99991110 +5555ccccaaaa77773333eeee99991110 +ccccaaaa77773333eeee999911114440 +ccccaaaa77773333eeee999911114440 +ccccaaaa77773333eeee999911114440 +ccccaaaa77773333eeee999911114440 +aaaa77773333eeee999911114444ddd0 +aaaa77773333eeee999911114444ddd0 +aaaa77773333eeee999911114444ddd0 +aaaa77773333eeee999911114444ddd0 +77773333eeee999911114444dddd0000 +77773333eeee999911114444dddd0000 +77773333eeee999911114444dddd0000 +77773333eeee999911114444dddd0000 +3333eeee999911114444dddd00002220 +3333eeee999911114444dddd00002220 +3333eeee999911114444dddd00002220 +3333eeee999911114444dddd00002220 +eeee999911114444dddd000022226660 +eeee999911114444dddd000022226660 +eeee999911114444dddd000022226660 +eeee999911114444dddd000022226660 +999911114444dddd000022226666bbb0 +999911114444dddd000022226666bbb0 +999911114444dddd000022226666bbb0 +} -- 2.48.1