From 56732d9a239eb52c8c0942900b34b43febb6a290 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Wed, 27 Jul 2016 02:16:31 +0900 Subject: [PATCH] pixels: Add 'stale' member --- imageimpl.go | 24 +++--------------------- internal/pixels/pixels.go | 28 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/imageimpl.go b/imageimpl.go index 2c66a344d..3efe4331e 100644 --- a/imageimpl.go +++ b/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) - } + 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") diff --git a/internal/pixels/pixels.go b/internal/pixels/pixels.go index ab0172c33..89d816d69 100644 --- a/internal/pixels/pixels.go +++ b/internal/pixels/pixels.go @@ -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 }