diff options
| author | faiface <faiface@ksp.sk> | 2017-08-18 23:01:46 +0200 |
|---|---|---|
| committer | faiface <faiface@ksp.sk> | 2017-08-18 23:01:46 +0200 |
| commit | 1f07692fc940aad75d7b8ef3afb84b3d34eeeacf (patch) | |
| tree | 346a499683c1efadd408a0190d2f49029e520131 | |
| parent | 252ed0faad97bbbed3263c1644c10d1ed7cda5d6 (diff) | |
| download | gui-1f07692fc940aad75d7b8ef3afb84b3d34eeeacf.zip | |
add layers
| -rw-r--r-- | layers/layers.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/layers/layers.go b/layers/layers.go new file mode 100644 index 0000000..6c1b560 --- /dev/null +++ b/layers/layers.go @@ -0,0 +1,67 @@ +package layers + +import ( + "container/list" + "errors" + "image" + "image/draw" +) + +type Layers struct { + dst draw.Image + r image.Rectangle + layers list.List +} + +func (l *Layers) Dst(dst draw.Image, r image.Rectangle) { + l.dst = dst + l.r = r + for e := l.layers.Front(); e != nil; e = e.Next() { + layer := e.Value.(*Layer) + rgba := image.NewRGBA(r) + draw.Draw(rgba, layer.rgba.Bounds(), layer.rgba, layer.rgba.Bounds().Min, draw.Src) + layer.rgba = rgba + } +} + +func (l *Layers) Push() *Layer { + layer := &Layer{ + l: l, + rgba: image.NewRGBA(l.r), + } + layer.e = l.layers.PushBack(layer) + return layer +} + +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) + 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) + } +} + +type Layer struct { + l *Layers + e *list.Element + rgba *image.RGBA +} + +func (l *Layer) Remove() { + l.l.layers.Remove(l.e) +} + +func (l *Layer) Front() { + l.l.layers.MoveToFront(l.e) +} + +func (l *Layer) Image() *image.RGBA { + return l.rgba +} + +func (l *Layer) Flush(r image.Rectangle) { + l.l.Flush(r) +} |