graphics: Image.ReplacePixels/Dispose always returns nil (#331)

This commit is contained in:
Hajime Hoshi 2017-03-04 02:23:39 +09:00
parent 6a4bb0513b
commit a3e14c9ddb
3 changed files with 21 additions and 15 deletions

View File

@ -230,13 +230,18 @@ func (i *Image) At(x, y int) color.Color {
//
// The behavior of any functions for a disposed image is undefined.
//
// When the image is disposed, Dipose does nothing.
//
// Dipose always return nil as of 1.5.0-alpha.
//
// This function is concurrent-safe.
func (i *Image) Dispose() error {
if i.impl.isDisposed() {
return nil
}
theImagesForRestoring.resetPixelsIfDependingOn(i, glContext())
return i.impl.Dispose()
i.impl.Dispose()
return nil
}
// ReplacePixels replaces the pixels of the image with p.
@ -245,10 +250,17 @@ func (i *Image) Dispose() error {
//
// ReplacePixels may be slow (as for implementation, this calls glTexSubImage2D).
//
// When len(p) is not 4 * (width) * (height), ReplacePixels panics.
//
// When the image is disposed, ReplacePixels does nothing.
//
// ReplacePixels always returns nil as of 1.5.0-alpha.
//
// This function is concurrent-safe.
func (i *Image) ReplacePixels(p []uint8) error {
theImagesForRestoring.resetPixelsIfDependingOn(i, glContext())
return i.impl.ReplacePixels(p)
i.impl.ReplacePixels(p)
return nil
}
// A DrawImageOptions represents options to render an image on an image.

View File

@ -15,7 +15,6 @@
package ebiten
import (
"errors"
"fmt"
"image"
"image/color"
@ -184,29 +183,26 @@ func (i *imageImpl) restore(context *opengl.Context) error {
return nil
}
func (i *imageImpl) Dispose() error {
func (i *imageImpl) Dispose() {
i.m.Lock()
defer i.m.Unlock()
if i.restorable == nil {
return errors.New("ebiten: image is already disposed")
}
if err := i.restorable.Dispose(); err != nil {
return err
return
}
i.restorable.Dispose()
i.restorable = nil
runtime.SetFinalizer(i, nil)
return nil
}
func (i *imageImpl) ReplacePixels(p []uint8) error {
func (i *imageImpl) ReplacePixels(p []uint8) {
w, h := i.restorable.Size()
if l := 4 * w * h; len(p) != l {
return fmt.Errorf("ebiten: p's length must be %d", l)
panic(fmt.Sprintf("ebiten: len(p) was %d but must be %d", len(p), l))
}
i.m.Lock()
defer i.m.Unlock()
if i.restorable == nil {
return errors.New("ebiten: image is already disposed")
return
}
w2, h2 := graphics.NextPowerOf2Int(w), graphics.NextPowerOf2Int(h)
pix := make([]uint8, 4*w2*h2)
@ -214,7 +210,6 @@ func (i *imageImpl) ReplacePixels(p []uint8) error {
copy(pix[j*w2*4:], p[j*w*4:(j+1)*w*4])
}
i.restorable.ReplacePixels(pix)
return nil
}
func (i *imageImpl) isDisposed() bool {

View File

@ -261,14 +261,13 @@ func (p *Image) Restore(context *opengl.Context) error {
return nil
}
func (p *Image) Dispose() error {
func (p *Image) Dispose() {
p.image.Dispose()
p.image = nil
p.basePixels = nil
p.baseColor = color.RGBA{}
p.drawImageHistory = nil
p.stale = false
return nil
}
func (p *Image) IsInvalidated(context *opengl.Context) bool {