src/pkg/image/png/writer.go | 5 ++--- src/pkg/image/png/writer_test.go | 16 ++++++++++++++++ diff --git a/src/pkg/image/png/writer.go b/src/pkg/image/png/writer.go index a03cc166510229633cfbe6b3c3f49e78b2038173..081d06bf57178c5babbd1f80893bb3368622ce95 100644 --- a/src/pkg/image/png/writer.go +++ b/src/pkg/image/png/writer.go @@ -311,9 +311,8 @@ cr[0][3*x+2] = uint8(g >> 8) 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++ { diff --git a/src/pkg/image/png/writer_test.go b/src/pkg/image/png/writer_test.go index 0fb7bebaed0ee61608b762bb1c739590e740256a..f218a5564bb0c103eeec4a9a6fe5f179a0a7b006 100644 --- a/src/pkg/image/png/writer_test.go +++ b/src/pkg/image/png/writer_test.go @@ -5,6 +5,7 @@ package png import ( + "bytes" "fmt" "image" "io" @@ -68,3 +69,18 @@ continue } } } + +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) + } +}