-
Notifications
You must be signed in to change notification settings - Fork 0
/
canvasTree.ts
60 lines (49 loc) · 1.54 KB
/
canvasTree.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { CanvasTreeItem } from "./canvasTreeItem";
import { Viewport } from "./viewport";
import { GetTransformMatrix } from "../util/common";
import { OrderedLinkedList } from "./struct/orderedLinkedList";
import { LinkedList } from "./struct/linkedList";
export class CanvasTree {
private layerMap: OrderedLinkedList<
LinkedList<CanvasTreeItem>
> = new OrderedLinkedList();
public Draw(root: CanvasTreeItem, ctx: CanvasRenderingContext2D) {
this.ResetCanvas(ctx);
this.RebuildTree(root);
this.Traverse((node: CanvasTreeItem) => {
node.$Draw(ctx);
node.$Melt();
});
}
private Add(value: CanvasTreeItem) {
const key = value.GlobalZIndex;
let layer = this.layerMap.GetByKey(key);
if (layer == null) {
layer = new LinkedList<CanvasTreeItem>();
this.layerMap.Insert(layer, key);
}
layer.Push(value);
}
private Clear() {
this.layerMap.Traverse(layer => layer.Clear());
}
private RebuildTree(root: CanvasTreeItem) {
this.Clear();
// @ts-ignore
root.Traverse((node: CanvasTreeItem) => {
node.$Freeze();
this.Add(node as CanvasTreeItem);
});
}
private ResetCanvas(ctx: CanvasRenderingContext2D) {
const canvas = ctx.canvas;
ctx.resetTransform();
ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientHeight);
ctx.transform(
...GetTransformMatrix(Viewport.Current.Offset, 0, Viewport.Current.Zoom)
);
}
private Traverse(cb: (value: CanvasTreeItem) => void) {
this.layerMap.Traverse(layer => layer.Traverse(cb));
}
}