diff options
| author | faiface <faiface@ksp.sk> | 2017-08-18 23:10:33 +0200 |
|---|---|---|
| committer | faiface <faiface@ksp.sk> | 2017-08-18 23:10:33 +0200 |
| commit | 81065c009d96bf287bc4310956e9e5223d4167b1 (patch) | |
| tree | 4aac1411e0da9f418f672cb185196c03eb84d0fb | |
| parent | 1f07692fc940aad75d7b8ef3afb84b3d34eeeacf (diff) | |
| download | gui-81065c009d96bf287bc4310956e9e5223d4167b1.zip | |
layers: add ImageFlusher for Flush propagation
| -rw-r--r-- | layers/layers.go | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/layers/layers.go b/layers/layers.go index 6c1b560..90a195a 100644 --- a/layers/layers.go +++ b/layers/layers.go @@ -7,18 +7,21 @@ import ( "image/draw" ) +type ImageFlusher interface { + Image() *image.RGBA + Flush(r image.Rectangle) +} + type Layers struct { - dst draw.Image - r image.Rectangle + dst ImageFlusher layers list.List } -func (l *Layers) Dst(dst draw.Image, r image.Rectangle) { +func (l *Layers) Dst(dst ImageFlusher) { l.dst = dst - l.r = r for e := l.layers.Front(); e != nil; e = e.Next() { layer := e.Value.(*Layer) - rgba := image.NewRGBA(r) + rgba := image.NewRGBA(dst.Image().Bounds()) draw.Draw(rgba, layer.rgba.Bounds(), layer.rgba, layer.rgba.Bounds().Min, draw.Src) layer.rgba = rgba } @@ -27,7 +30,7 @@ func (l *Layers) Dst(dst draw.Image, r image.Rectangle) { func (l *Layers) Push() *Layer { layer := &Layer{ l: l, - rgba: image.NewRGBA(l.r), + rgba: image.NewRGBA(l.dst.Image().Bounds()), } layer.e = l.layers.PushBack(layer) return layer @@ -37,11 +40,12 @@ func (l *Layers) Flush(r image.Rectangle) { if l.dst == nil { panic(errors.New("layers: Flush: no destination")) } - draw.Draw(l.dst, r, image.Transparent, r.Min, draw.Src) + draw.Draw(l.dst.Image(), r, image.Transparent, r.Min, draw.Src) for e := l.layers.Front(); e != nil; e = e.Next() { layer := e.Value.(*Layer) - draw.Draw(l.dst, r, layer.rgba, r.Min, draw.Over) + draw.Draw(l.dst.Image(), r, layer.rgba, r.Min, draw.Over) } + l.dst.Flush(r) } type Layer struct { |