initial commit

This commit is contained in:
2021-12-20 01:55:30 +01:00
commit bd790c1488
38 changed files with 2320 additions and 0 deletions

74
src/lib/ui/Canvas.hx Normal file
View File

@@ -0,0 +1,74 @@
package lib.ui;
import util.Vec.Vec2;
import kernel.ui.TermBuffer.Pixel;
abstract Canvas(Array<Array<Pixel>>) to Array<Array<Pixel>> {
inline public function new() {
this = [[]];
}
public inline function set(i:Vec2<Int>,pixel:Pixel) {
if (this[i.y] == null){
this[i.y] = [];
}
this[i.y][i.x] = pixel;
}
public inline function get(i:Vec2<Int>): Pixel {
return this[i.y][i.x];
}
public function keyValueIterator(): KeyValueIterator<Vec2<Int>,Pixel>{
return new CanvasKeyValueIterator(this);
}
public function combine(other: Canvas,offset: Vec2<Int>) {
for (key => value in other) {
if (value == null){
continue;
}
var y = offset.y + key.y;
var x = offset.x + key.x;
if (this[y] == null){
this[y] = [];
}
this[y][x] = value;
}
}
}
class CanvasKeyValueIterator{
private final canvas:Array<Array<Pixel>>;
private var index:Vec2<Int> = {x: 0,y: 0};
@:allow(lib.ui.Canvas)
private function new(canvas: Array<Array<Pixel>>) {
this.canvas = canvas;
}
public function hasNext():Bool{
return index.y < canvas.length && index.x < canvas[index.y].length;
}
public function next():{key:Vec2<Int>, value:Pixel}{
var oldIndex: Vec2<Int> = this.index;
if (index.x >= canvas[index.y].length){
// Goto next line
index = {x:0,y: index.y + 1};
}else{
// Goto next pixel in line
index = {x:index.x + 1,y: index.y};
}
return {
key: oldIndex,
value: this.canvas[oldIndex.y][oldIndex.x]
};
}
}