cc-haxe/src/lib/ui/CanvasStack.hx

57 lines
1.1 KiB
Haxe
Raw Normal View History

2024-01-21 15:32:55 +00:00
package lib.ui;
import kernel.ui.Pixel;
import lib.ui.Canvas;
/**
Layer multiple canvases and compress them into one from a top down view.
**/
class CanvasStack {
private var layers:Array<{c:Canvas, offset:Pos}> = [];
private var width:Int = 0;
private var hight:Int = 0;
public function new() {}
public function addLayer(c:Canvas, offset:Pos) {
this.layers.push({c: c, offset: offset});
var layerWidth = c.maxWidth() + offset.x;
var layerHight = c.height() + offset.y;
if (layerWidth > this.width) {
this.width = layerWidth;
}
if (layerHight > this.hight) {
this.hight = layerHight;
}
}
public function compress():Canvas {
var rtn = new Canvas();
for (y in 0...this.hight) {
for (x in 0...this.width) {
var pos = new Pos({x: x, y: y});
rtn.set(pos, this.pixelAt(pos));
}
}
return rtn;
}
public function pixelAt(pos:Pos):Null<Pixel> {
for (i in 0...this.layers.length) {
var newi = (this.layers.length - 1) - i;
var offset = this.layers[newi].offset;
var px = this.layers[newi].c.get(pos - offset);
if (px != null) {
return px;
}
}
return null;
}
}