mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 18:58:54 +01:00
pixels: Add 'stale' member
This commit is contained in:
parent
c18756352d
commit
56732d9a23
22
imageimpl.go
22
imageimpl.go
@ -113,9 +113,6 @@ func (i *imageImpl) Fill(clr color.Color) error {
|
||||
if i.disposed {
|
||||
return errors.New("ebiten: image is already disposed")
|
||||
}
|
||||
if i.pixels == nil {
|
||||
i.pixels = pixels.NewPixels(i.image)
|
||||
}
|
||||
i.pixels.Fill(clr)
|
||||
return i.image.Fill(clr)
|
||||
}
|
||||
@ -129,9 +126,6 @@ func (i *imageImpl) clearIfVolatile() error {
|
||||
if !i.volatile {
|
||||
return nil
|
||||
}
|
||||
if i.pixels == nil {
|
||||
i.pixels = pixels.NewPixels(i.image)
|
||||
}
|
||||
i.pixels.Clear()
|
||||
return i.image.Fill(color.Transparent)
|
||||
}
|
||||
@ -170,9 +164,7 @@ func (i *imageImpl) DrawImage(image *Image, options *DrawImageOptions) error {
|
||||
geom := options.GeoM
|
||||
colorm := options.ColorM
|
||||
mode := opengl.CompositeMode(options.CompositeMode)
|
||||
if i.pixels != nil {
|
||||
i.pixels.AppendDrawImageHistory(image.impl.image, vertices, &geom, &colorm, mode)
|
||||
}
|
||||
if err := i.image.DrawImage(image.impl.image, vertices, &geom, &colorm, mode); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -202,10 +194,9 @@ func (i *imageImpl) ensurePixels(context *opengl.Context) error {
|
||||
if i.disposed {
|
||||
return nil
|
||||
}
|
||||
if i.pixels != nil {
|
||||
if !i.pixels.IsStale() {
|
||||
return nil
|
||||
}
|
||||
i.pixels = pixels.NewPixels(i.image)
|
||||
if err := i.pixels.Reset(context); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -224,9 +215,6 @@ func (i *imageImpl) resetPixelsIfDependingOn(target *imageImpl, context *opengl.
|
||||
if target.isDisposed() {
|
||||
return errors.New("ebiten: target is already disposed")
|
||||
}
|
||||
if i.pixels == nil {
|
||||
return nil
|
||||
}
|
||||
// target is an image begin tried to mutate.
|
||||
// If pixels object is related to that image, the pixels must be reset.
|
||||
if !i.pixels.DependsOn(target.image) {
|
||||
@ -234,7 +222,7 @@ func (i *imageImpl) resetPixelsIfDependingOn(target *imageImpl, context *opengl.
|
||||
}
|
||||
if context == nil {
|
||||
// context is nil when this is not initialized yet.
|
||||
i.pixels = nil
|
||||
i.pixels.MakeStale()
|
||||
return nil
|
||||
}
|
||||
if err := i.pixels.Reset(context); err != nil {
|
||||
@ -246,9 +234,6 @@ func (i *imageImpl) resetPixelsIfDependingOn(target *imageImpl, context *opengl.
|
||||
func (i *imageImpl) hasDependency() bool {
|
||||
i.m.Lock()
|
||||
defer i.m.Unlock()
|
||||
if i.pixels == nil {
|
||||
return false
|
||||
}
|
||||
return i.pixels.HasDependency()
|
||||
}
|
||||
|
||||
@ -308,9 +293,6 @@ func (i *imageImpl) ReplacePixels(p []uint8) error {
|
||||
}
|
||||
i.m.Lock()
|
||||
defer i.m.Unlock()
|
||||
if i.pixels == nil {
|
||||
i.pixels = pixels.NewPixels(i.image)
|
||||
}
|
||||
i.pixels.ReplacePixels(p)
|
||||
if i.disposed {
|
||||
return errors.New("ebiten: image is already disposed")
|
||||
|
@ -38,6 +38,7 @@ type Pixels struct {
|
||||
basePixels []uint8
|
||||
baseColor color.Color
|
||||
drawImageHistory []*drawImageHistoryItem
|
||||
stale bool
|
||||
}
|
||||
|
||||
func NewPixels(image *graphics.Image) *Pixels {
|
||||
@ -46,16 +47,29 @@ func NewPixels(image *graphics.Image) *Pixels {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Pixels) IsStale() bool {
|
||||
return p.stale
|
||||
}
|
||||
|
||||
func (p *Pixels) MakeStale() {
|
||||
p.basePixels = nil
|
||||
p.baseColor = nil
|
||||
p.drawImageHistory = nil
|
||||
p.stale = true
|
||||
}
|
||||
|
||||
func (p *Pixels) Clear() {
|
||||
p.basePixels = nil
|
||||
p.baseColor = nil
|
||||
p.drawImageHistory = nil
|
||||
p.stale = false
|
||||
}
|
||||
|
||||
func (p *Pixels) Fill(clr color.Color) {
|
||||
p.basePixels = nil
|
||||
p.baseColor = clr
|
||||
p.drawImageHistory = nil
|
||||
p.stale = false
|
||||
}
|
||||
|
||||
func (p *Pixels) ReplacePixels(pixels []uint8) {
|
||||
@ -65,9 +79,13 @@ func (p *Pixels) ReplacePixels(pixels []uint8) {
|
||||
copy(p.basePixels, pixels)
|
||||
p.baseColor = nil
|
||||
p.drawImageHistory = nil
|
||||
p.stale = false
|
||||
}
|
||||
|
||||
func (p *Pixels) AppendDrawImageHistory(image *graphics.Image, vertices []int16, geom graphics.Matrix, colorm graphics.Matrix, mode opengl.CompositeMode) {
|
||||
if p.stale {
|
||||
return
|
||||
}
|
||||
item := &drawImageHistoryItem{
|
||||
image: image,
|
||||
vertices: vertices,
|
||||
@ -83,7 +101,7 @@ func (p *Pixels) AppendDrawImageHistory(image *graphics.Image, vertices []int16,
|
||||
// Note that this must not be called until context is available.
|
||||
// This means Pixels members must match with acutal state in GPU.
|
||||
func (p *Pixels) At(idx int, context *opengl.Context) (color.Color, error) {
|
||||
if p.basePixels == nil || p.drawImageHistory != nil {
|
||||
if p.basePixels == nil || p.drawImageHistory != nil || p.stale {
|
||||
if err := p.Reset(context); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -93,6 +111,9 @@ func (p *Pixels) At(idx int, context *opengl.Context) (color.Color, error) {
|
||||
}
|
||||
|
||||
func (p *Pixels) DependsOn(target *graphics.Image) bool {
|
||||
if p.stale {
|
||||
return false
|
||||
}
|
||||
for _, c := range p.drawImageHistory {
|
||||
if c.image == target {
|
||||
return true
|
||||
@ -109,10 +130,14 @@ func (p *Pixels) Reset(context *opengl.Context) error {
|
||||
}
|
||||
p.baseColor = nil
|
||||
p.drawImageHistory = nil
|
||||
p.stale = false
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Pixels) HasDependency() bool {
|
||||
if p.stale {
|
||||
return false
|
||||
}
|
||||
return p.drawImageHistory != nil
|
||||
}
|
||||
|
||||
@ -153,5 +178,6 @@ func (p *Pixels) Restore(context *opengl.Context, width, height int, filter open
|
||||
}
|
||||
p.baseColor = nil
|
||||
p.drawImageHistory = nil
|
||||
p.stale = false
|
||||
return gimg, nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user