]> Cypherpunks repositories - gostls13.git/commitdiff
image/png: speed up paletted encoding ~25%
authorBrad Fitzpatrick <brad@danga.com>
Wed, 27 Oct 2010 11:48:18 +0000 (22:48 +1100)
committerNigel Tao <nigeltao@golang.org>
Wed, 27 Oct 2010 11:48:18 +0000 (22:48 +1100)
Avoids a lot of redundant bounds checks.

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

src/pkg/image/png/writer.go
src/pkg/image/png/writer_test.go

index a03cc166510229633cfbe6b3c3f49e78b2038173..081d06bf57178c5babbd1f80893bb3368622ce95 100644 (file)
@@ -311,9 +311,8 @@ func writeImage(w io.Writer, m image.Image, cb int) os.Error {
                                cr[0][3*x+3] = uint8(b >> 8)
                        }
                case cbP8:
-                       for x := b.Min.X; x < b.Max.X; x++ {
-                               cr[0][x+1] = paletted.ColorIndexAt(x, y)
-                       }
+                       rowOffset := y * paletted.Stride
+                       copy(cr[0][b.Min.X+1:], paletted.Pix[rowOffset+b.Min.X:rowOffset+b.Max.X])
                case cbTCA8:
                        // Convert from image.Image (which is alpha-premultiplied) to PNG's non-alpha-premultiplied.
                        for x := b.Min.X; x < b.Max.X; x++ {
index 0fb7bebaed0ee61608b762bb1c739590e740256a..f218a5564bb0c103eeec4a9a6fe5f179a0a7b006 100644 (file)
@@ -5,6 +5,7 @@
 package png
 
 import (
+       "bytes"
        "fmt"
        "image"
        "io"
@@ -68,3 +69,18 @@ func TestWriter(t *testing.T) {
                }
        }
 }
+
+func BenchmarkEncodePaletted(b *testing.B) {
+       b.StopTimer()
+       img := image.NewPaletted(640, 480,
+               []image.Color{
+                       image.RGBAColor{0, 0, 0, 255},
+                       image.RGBAColor{255, 255, 255, 255},
+               })
+       b.StartTimer()
+       buffer := new(bytes.Buffer)
+       for i := 0; i < b.N; i++ {
+               buffer.Reset()
+               Encode(buffer, img)
+       }
+}