Newer
Older
/**
* Worker to handle canvas draws to free the main thread
*/
import { CanvasPixel, CanvasRenderer, CanvasRole } from "../lib/canvasRenderer";
console.log("[Render Worker] Initialize");
const renderer = new CanvasRenderer();
renderer.on("ready", () => {
postMessage({ type: "ready" });
});
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
switch (req.data.type) {
case "canvas": {
const canvas: OffscreenCanvas = req.data.canvas;
const role: CanvasRole = req.data.role;
renderer.useCanvas(canvas, role);
renderer.renderLoop();
break;
}
case "remove-canvas": {
const role: CanvasRole = req.data.role;
renderer.removeCanvas(role);
break;
}
case "size": {
const width: number = req.data.width;
const height: number = req.data.height;
renderer.setSize(width, height);
break;
}
case "pixels": {
const pixelsIn: string = req.data.pixels;
const replace: boolean = req.data.replace;
const pixels = deserializePixels(pixelsIn);
renderer.usePixels(pixels, replace);
break;
}
case "pixel": {
const pixel = deserializePixel(req.data.pixel);
renderer.usePixel(pixel);
break;
}
case "startRender": {
renderer.startRender();
break;
}
case "stopRender": {
renderer.stopRender();
break;
}
default:
console.warn(
"[Render Worker] Received unknown message type",
req.data.type
);
}
});
const deserializePixel = (str: string): CanvasPixel => {
let [x, y, hex] = str.split(",");
return {
x: parseInt(x),
y: parseInt(y),
hex,
};
};
const deserializePixels = (str: string): CanvasPixel[] => {
let pixels: CanvasPixel[] = [];
const pixelsIn = str.split(";");
for (const pixel of pixelsIn) {
pixels.push(deserializePixel(pixel));
}
return pixels;
};