bench(b, color.RGBAModel, color.RGBA64Model, nil, Src)
}
-func BenchmarkPaletted(b *testing.B) {
+func BenchmarkPalettedFill(b *testing.B) {
+ bench(b, palette, nil, nil, Src)
+}
+
+func BenchmarkPalettedRGBA(b *testing.B) {
bench(b, palette, color.RGBAModel, nil, Src)
}
drawRGBA(dst0, r, src, sp, mask, mp, op)
return
case *image.Paletted:
- if op == Src && mask == nil && !processBackward(dst, r, src, sp) {
- drawPaletted(dst0, r, src, sp, false)
- return
+ if op == Src && mask == nil {
+ if src0, ok := src.(*image.Uniform); ok {
+ colorIndex := uint8(dst0.Palette.Index(src0.C))
+ i0 := dst0.PixOffset(r.Min.X, r.Min.Y)
+ i1 := i0 + r.Dx()
+ for i := i0; i < i1; i++ {
+ dst0.Pix[i] = colorIndex
+ }
+ firstRow := dst0.Pix[i0:i1]
+ for y := r.Min.Y + 1; y < r.Max.Y; y++ {
+ i0 += dst0.Stride
+ i1 += dst0.Stride
+ copy(dst0.Pix[i0:i1], firstRow)
+ }
+ return
+ } else if !processBackward(dst, r, src, sp) {
+ drawPaletted(dst0, r, src, sp, false)
+ return
+ }
}
}
t.Fatalf("open: %v", err)
}
defer f.Close()
- src, err := png.Decode(f)
+ video001, err := png.Decode(f)
if err != nil {
t.Fatalf("decode: %v", err)
}
- b := src.Bounds()
+ b := video001.Bounds()
cgaPalette := color.Palette{
color.RGBA{0x00, 0x00, 0x00, 0xff},
"src": Src,
"floyd-steinberg": FloydSteinberg,
}
+ sources := map[string]image.Image{
+ "uniform": &image.Uniform{color.RGBA{0xff, 0x7f, 0xff, 0xff}},
+ "video001": video001,
+ }
-loop:
for dName, d := range drawers {
- dst0 := image.NewPaletted(b, cgaPalette)
- dst1 := image.NewPaletted(b, cgaPalette)
- d.Draw(dst0, b, src, image.Point{})
- d.Draw(embeddedPaletted{dst1}, b, src, image.Point{})
- for y := b.Min.Y; y < b.Max.Y; y++ {
- for x := b.Min.X; x < b.Max.X; x++ {
- if !eq(dst0.At(x, y), dst1.At(x, y)) {
- t.Errorf("%s: at (%d, %d), %v versus %v",
- dName, x, y, dst0.At(x, y), dst1.At(x, y))
- continue loop
+ loop:
+ for sName, src := range sources {
+ dst0 := image.NewPaletted(b, cgaPalette)
+ dst1 := image.NewPaletted(b, cgaPalette)
+ d.Draw(dst0, b, src, image.Point{})
+ d.Draw(embeddedPaletted{dst1}, b, src, image.Point{})
+ for y := b.Min.Y; y < b.Max.Y; y++ {
+ for x := b.Min.X; x < b.Max.X; x++ {
+ if !eq(dst0.At(x, y), dst1.At(x, y)) {
+ t.Errorf("%s / %s: at (%d, %d), %v versus %v",
+ dName, sName, x, y, dst0.At(x, y), dst1.At(x, y))
+ continue loop
+ }
}
}
}