restorable: Avoid memory allocating when an entire image is cleared

This commit is contained in:
Hajime Hoshi 2018-10-30 11:08:38 +09:00
parent bb0b8ca83b
commit b2b09ccec0
2 changed files with 29 additions and 3 deletions

View File

@ -169,10 +169,16 @@ func (i *Image) ReplacePixels(pixels []byte, x, y, width, height int) {
} }
if x == 0 && y == 0 && width == w && height == h { if x == 0 && y == 0 && width == w && height == h {
if i.basePixels == nil { if pixels != nil {
i.basePixels = make([]byte, 4*w*h) if i.basePixels == nil {
i.basePixels = make([]byte, 4*w*h)
}
copy(i.basePixels, pixels)
} else {
// If basePixels is nil, the restored pixels are cleared.
// See restore() implementation.
i.basePixels = nil
} }
copy(i.basePixels, pixels)
i.drawImageHistory = nil i.drawImageHistory = nil
i.stale = false i.stale = false
return return

View File

@ -97,6 +97,26 @@ func TestRestore(t *testing.T) {
} }
} }
func TestRestoreWithoutDraw(t *testing.T) {
img0 := NewImage(1024, 1024, false)
defer img0.Dispose()
// If there is no drawing command on img0, img0 is cleared when restored.
ResolveStaleImages()
if err := Restore(); err != nil {
t.Fatal(err)
}
for i := 0; i < 1024*1024; i++ {
want := color.RGBA{0x00, 0x00, 0x00, 0x00}
got := byteSliceToColor(img0.BasePixelsForTesting(), i)
if !sameColors(got, want, 0) {
t.Errorf("got %v, want %v", got, want)
}
}
}
func TestRestoreChain(t *testing.T) { func TestRestoreChain(t *testing.T) {
const num = 10 const num = 10
imgs := []*Image{} imgs := []*Image{}