codeboard-studio 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE +23 -0
- package/README.md +54 -0
- package/dist/src/animation/camera-plane.d.ts +8 -0
- package/dist/src/animation/camera-plane.d.ts.map +1 -0
- package/dist/src/animation/camera-plane.js +16 -0
- package/dist/src/animation/camera-plane.js.map +1 -0
- package/dist/src/animation/drawing-neighbors.d.ts +4 -0
- package/dist/src/animation/drawing-neighbors.d.ts.map +1 -0
- package/dist/src/animation/drawing-neighbors.js +38 -0
- package/dist/src/animation/drawing-neighbors.js.map +1 -0
- package/dist/src/animation/evaluate.d.ts +17 -0
- package/dist/src/animation/evaluate.d.ts.map +1 -0
- package/dist/src/animation/evaluate.js +70 -0
- package/dist/src/animation/evaluate.js.map +1 -0
- package/dist/src/animation/frame.d.ts +8 -0
- package/dist/src/animation/frame.d.ts.map +1 -0
- package/dist/src/animation/frame.js +16 -0
- package/dist/src/animation/frame.js.map +1 -0
- package/dist/src/animation/ik.d.ts +26 -0
- package/dist/src/animation/ik.d.ts.map +1 -0
- package/dist/src/animation/ik.js +47 -0
- package/dist/src/animation/ik.js.map +1 -0
- package/dist/src/animation/retime.d.ts +4 -0
- package/dist/src/animation/retime.d.ts.map +1 -0
- package/dist/src/animation/retime.js +116 -0
- package/dist/src/animation/retime.js.map +1 -0
- package/dist/src/audio/wav.d.ts +11 -0
- package/dist/src/audio/wav.d.ts.map +1 -0
- package/dist/src/audio/wav.js +58 -0
- package/dist/src/audio/wav.js.map +1 -0
- package/dist/src/authoring-runner.d.ts +2 -0
- package/dist/src/authoring-runner.d.ts.map +1 -0
- package/dist/src/authoring-runner.js +24 -0
- package/dist/src/authoring-runner.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +127 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/coordinates.d.ts +16 -0
- package/dist/src/core/coordinates.d.ts.map +1 -0
- package/dist/src/core/coordinates.js +48 -0
- package/dist/src/core/coordinates.js.map +1 -0
- package/dist/src/core/handles.d.ts +93 -0
- package/dist/src/core/handles.d.ts.map +1 -0
- package/dist/src/core/handles.js +190 -0
- package/dist/src/core/handles.js.map +1 -0
- package/dist/src/core/history.d.ts +14 -0
- package/dist/src/core/history.d.ts.map +1 -0
- package/dist/src/core/history.js +80 -0
- package/dist/src/core/history.js.map +1 -0
- package/dist/src/core/inspection.d.ts +51 -0
- package/dist/src/core/inspection.d.ts.map +1 -0
- package/dist/src/core/inspection.js +72 -0
- package/dist/src/core/inspection.js.map +1 -0
- package/dist/src/core/production.d.ts +208 -0
- package/dist/src/core/production.d.ts.map +1 -0
- package/dist/src/core/production.js +894 -0
- package/dist/src/core/production.js.map +1 -0
- package/dist/src/core/project.d.ts +146 -0
- package/dist/src/core/project.d.ts.map +1 -0
- package/dist/src/core/project.js +700 -0
- package/dist/src/core/project.js.map +1 -0
- package/dist/src/drawing/brush-authoring.d.ts +6 -0
- package/dist/src/drawing/brush-authoring.d.ts.map +1 -0
- package/dist/src/drawing/brush-authoring.js +12 -0
- package/dist/src/drawing/brush-authoring.js.map +1 -0
- package/dist/src/drawing/brushes.d.ts +157 -0
- package/dist/src/drawing/brushes.d.ts.map +1 -0
- package/dist/src/drawing/brushes.js +50 -0
- package/dist/src/drawing/brushes.js.map +1 -0
- package/dist/src/drawing/color.d.ts +5 -0
- package/dist/src/drawing/color.d.ts.map +1 -0
- package/dist/src/drawing/color.js +63 -0
- package/dist/src/drawing/color.js.map +1 -0
- package/dist/src/drawing/curves.d.ts +27 -0
- package/dist/src/drawing/curves.d.ts.map +1 -0
- package/dist/src/drawing/curves.js +170 -0
- package/dist/src/drawing/curves.js.map +1 -0
- package/dist/src/drawing/math.d.ts +10 -0
- package/dist/src/drawing/math.d.ts.map +1 -0
- package/dist/src/drawing/math.js +40 -0
- package/dist/src/drawing/math.js.map +1 -0
- package/dist/src/drawing/path-geometry.d.ts +18 -0
- package/dist/src/drawing/path-geometry.d.ts.map +1 -0
- package/dist/src/drawing/path-geometry.js +115 -0
- package/dist/src/drawing/path-geometry.js.map +1 -0
- package/dist/src/drawing/path-sampling.d.ts +10 -0
- package/dist/src/drawing/path-sampling.d.ts.map +1 -0
- package/dist/src/drawing/path-sampling.js +64 -0
- package/dist/src/drawing/path-sampling.js.map +1 -0
- package/dist/src/drawing/path.d.ts +4 -0
- package/dist/src/drawing/path.d.ts.map +1 -0
- package/dist/src/drawing/path.js +27 -0
- package/dist/src/drawing/path.js.map +1 -0
- package/dist/src/drawing/pen-input.d.ts +5 -0
- package/dist/src/drawing/pen-input.d.ts.map +1 -0
- package/dist/src/drawing/pen-input.js +30 -0
- package/dist/src/drawing/pen-input.js.map +1 -0
- package/dist/src/drawing/pixel-selection.d.ts +23 -0
- package/dist/src/drawing/pixel-selection.d.ts.map +1 -0
- package/dist/src/drawing/pixel-selection.js +142 -0
- package/dist/src/drawing/pixel-selection.js.map +1 -0
- package/dist/src/drawing/pixels.d.ts +22 -0
- package/dist/src/drawing/pixels.d.ts.map +1 -0
- package/dist/src/drawing/pixels.js +79 -0
- package/dist/src/drawing/pixels.js.map +1 -0
- package/dist/src/drawing/resource-binary.d.ts +23 -0
- package/dist/src/drawing/resource-binary.d.ts.map +1 -0
- package/dist/src/drawing/resource-binary.js +135 -0
- package/dist/src/drawing/resource-binary.js.map +1 -0
- package/dist/src/drawing/resources.d.ts +51 -0
- package/dist/src/drawing/resources.d.ts.map +1 -0
- package/dist/src/drawing/resources.js +239 -0
- package/dist/src/drawing/resources.js.map +1 -0
- package/dist/src/drawing/stroke-outline.d.ts +5 -0
- package/dist/src/drawing/stroke-outline.d.ts.map +1 -0
- package/dist/src/drawing/stroke-outline.js +53 -0
- package/dist/src/drawing/stroke-outline.js.map +1 -0
- package/dist/src/drawing/swatch.d.ts +6 -0
- package/dist/src/drawing/swatch.d.ts.map +1 -0
- package/dist/src/drawing/swatch.js +15 -0
- package/dist/src/drawing/swatch.js.map +1 -0
- package/dist/src/export/animatic-export.d.ts +11 -0
- package/dist/src/export/animatic-export.d.ts.map +1 -0
- package/dist/src/export/animatic-export.js +52 -0
- package/dist/src/export/animatic-export.js.map +1 -0
- package/dist/src/export/movie-export.d.ts +16 -0
- package/dist/src/export/movie-export.d.ts.map +1 -0
- package/dist/src/export/movie-export.js +108 -0
- package/dist/src/export/movie-export.js.map +1 -0
- package/dist/src/export/sheet-layout.d.ts +27 -0
- package/dist/src/export/sheet-layout.d.ts.map +1 -0
- package/dist/src/export/sheet-layout.js +72 -0
- package/dist/src/export/sheet-layout.js.map +1 -0
- package/dist/src/export/storyboard-export.d.ts +8 -0
- package/dist/src/export/storyboard-export.d.ts.map +1 -0
- package/dist/src/export/storyboard-export.js +76 -0
- package/dist/src/export/storyboard-export.js.map +1 -0
- package/dist/src/index.d.ts +36 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +27 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/model/query.d.ts +6 -0
- package/dist/src/model/query.d.ts.map +1 -0
- package/dist/src/model/query.js +7 -0
- package/dist/src/model/query.js.map +1 -0
- package/dist/src/model/schema.d.ts +754 -0
- package/dist/src/model/schema.d.ts.map +1 -0
- package/dist/src/model/schema.js +205 -0
- package/dist/src/model/schema.js.map +1 -0
- package/dist/src/model/types.d.ts +537 -0
- package/dist/src/model/types.d.ts.map +1 -0
- package/dist/src/model/types.js +8 -0
- package/dist/src/model/types.js.map +1 -0
- package/dist/src/model/validate.d.ts +12 -0
- package/dist/src/model/validate.d.ts.map +1 -0
- package/dist/src/model/validate.js +183 -0
- package/dist/src/model/validate.js.map +1 -0
- package/dist/src/preview/server.d.ts +6 -0
- package/dist/src/preview/server.d.ts.map +1 -0
- package/dist/src/preview/server.js +71 -0
- package/dist/src/preview/server.js.map +1 -0
- package/dist/src/render/annotations.d.ts +4 -0
- package/dist/src/render/annotations.d.ts.map +1 -0
- package/dist/src/render/annotations.js +27 -0
- package/dist/src/render/annotations.js.map +1 -0
- package/dist/src/render/brush-engine.d.ts +14 -0
- package/dist/src/render/brush-engine.d.ts.map +1 -0
- package/dist/src/render/brush-engine.js +230 -0
- package/dist/src/render/brush-engine.js.map +1 -0
- package/dist/src/render/layer-compositor.d.ts +33 -0
- package/dist/src/render/layer-compositor.d.ts.map +1 -0
- package/dist/src/render/layer-compositor.js +296 -0
- package/dist/src/render/layer-compositor.js.map +1 -0
- package/dist/src/render/panel-renderer.d.ts +33 -0
- package/dist/src/render/panel-renderer.d.ts.map +1 -0
- package/dist/src/render/panel-renderer.js +118 -0
- package/dist/src/render/panel-renderer.js.map +1 -0
- package/dist/src/render/png.d.ts +4 -0
- package/dist/src/render/png.d.ts.map +1 -0
- package/dist/src/render/png.js +10 -0
- package/dist/src/render/png.js.map +1 -0
- package/dist/src/render/review.d.ts +42 -0
- package/dist/src/render/review.d.ts.map +1 -0
- package/dist/src/render/review.js +192 -0
- package/dist/src/render/review.js.map +1 -0
- package/dist/src/render/vector-renderer.d.ts +5 -0
- package/dist/src/render/vector-renderer.d.ts.map +1 -0
- package/dist/src/render/vector-renderer.js +98 -0
- package/dist/src/render/vector-renderer.js.map +1 -0
- package/dist/src/starter.d.ts +2 -0
- package/dist/src/starter.d.ts.map +1 -0
- package/dist/src/starter.js +23 -0
- package/dist/src/starter.js.map +1 -0
- package/dist/src/storage/codec.d.ts +20 -0
- package/dist/src/storage/codec.d.ts.map +1 -0
- package/dist/src/storage/codec.js +203 -0
- package/dist/src/storage/codec.js.map +1 -0
- package/dist/src/storage/store.d.ts +89 -0
- package/dist/src/storage/store.d.ts.map +1 -0
- package/dist/src/storage/store.js +392 -0
- package/dist/src/storage/store.js.map +1 -0
- package/dist/src/updates.d.ts +10 -0
- package/dist/src/updates.d.ts.map +1 -0
- package/dist/src/updates.js +134 -0
- package/dist/src/updates.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Canvas, type CanvasRenderingContext2D } from "skia-canvas";
|
|
2
|
+
import type { Layer, Panel, DrawingLayer } from "../model/types.js";
|
|
3
|
+
import { type EvaluatedCamera } from "../animation/evaluate.js";
|
|
4
|
+
export declare class RenderCache {
|
|
5
|
+
readonly maxBytes: number;
|
|
6
|
+
private layers;
|
|
7
|
+
private bytes;
|
|
8
|
+
constructor(maxBytes?: number);
|
|
9
|
+
clear(): void;
|
|
10
|
+
artwork(panel: Panel, layer: DrawingLayer, frame?: number, scale?: number): {
|
|
11
|
+
canvas: Canvas;
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
scale: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
type CompositionBounds = {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
};
|
|
23
|
+
type Matrix = {
|
|
24
|
+
a: number;
|
|
25
|
+
b: number;
|
|
26
|
+
c: number;
|
|
27
|
+
d: number;
|
|
28
|
+
e: number;
|
|
29
|
+
f: number;
|
|
30
|
+
};
|
|
31
|
+
export declare function compositeLayers(panel: Panel, layers: Layer[], target: CanvasRenderingContext2D, frame?: number, cache?: RenderCache, camera?: EvaluatedCamera, visited?: Set<string>, parent?: Matrix, resolution?: number, bounds?: CompositionBounds, selection?: ReadonlySet<string>): void;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=layer-compositor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-compositor.d.ts","sourceRoot":"","sources":["../../../src/render/layer-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAkC,MAAM,mBAAmB,CAAC;AAGpG,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhG,qBAAa,WAAW;IAGV,QAAQ,CAAC,QAAQ;IAF7B,OAAO,CAAC,MAAM,CAA2E;IACzF,OAAO,CAAC,KAAK,CAAK;gBACG,QAAQ,SAAoB;IACjD,KAAK;IACL,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,SAAW,EAAE,KAAK,SAAI,GAAG;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC;CAkDxH;AAaD,KAAK,iBAAiB,GAAG;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAA;CAAC,CAAC;AAsBxE,KAAK,MAAM,GAAG;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AAiEtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,SAAmB,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,cAAoB,EAAC,MAAM,CAAC,EAAC,MAAM,EAAC,UAAU,SAAE,EAAC,MAAM,oBAA6C,EAAC,SAAS,CAAC,EAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAmD1T"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { Canvas } from "skia-canvas";
|
|
2
|
+
import { drawElement } from "./vector-renderer.js";
|
|
3
|
+
import { brushPadding } from "./brush-engine.js";
|
|
4
|
+
import { evaluateLayer, evaluateDrawing } from "../animation/evaluate.js";
|
|
5
|
+
import { cameraPlane } from "../animation/camera-plane.js";
|
|
6
|
+
export class RenderCache {
|
|
7
|
+
maxBytes;
|
|
8
|
+
layers = new Map();
|
|
9
|
+
bytes = 0;
|
|
10
|
+
constructor(maxBytes = 128 * 1024 * 1024) {
|
|
11
|
+
this.maxBytes = maxBytes;
|
|
12
|
+
}
|
|
13
|
+
clear() { this.layers.clear(); this.bytes = 0; }
|
|
14
|
+
artwork(panel, layer, frame = Infinity, scale = 1) {
|
|
15
|
+
scale = Math.max(1, Math.min(8, Math.ceil(scale * 4) / 4));
|
|
16
|
+
const active = revealing(layer, frame);
|
|
17
|
+
const found = active ? undefined : this.layers.get(layer);
|
|
18
|
+
if (found?.scale === scale)
|
|
19
|
+
return found;
|
|
20
|
+
if (found) {
|
|
21
|
+
this.bytes -= found.canvas.width * found.canvas.height * 4;
|
|
22
|
+
this.layers.delete(layer);
|
|
23
|
+
}
|
|
24
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
25
|
+
const include = (left, top, right, bottom, matrix, padding = 0) => {
|
|
26
|
+
const [a, b, c, d, e, f] = matrix ?? [1, 0, 0, 1, 0, 0];
|
|
27
|
+
for (const [u, v] of [[left, top], [right, top], [left, bottom], [right, bottom]]) {
|
|
28
|
+
const x = a * u + c * v + e, y = b * u + d * v + f;
|
|
29
|
+
minX = Math.min(minX, x - padding);
|
|
30
|
+
minY = Math.min(minY, y - padding);
|
|
31
|
+
maxX = Math.max(maxX, x + padding);
|
|
32
|
+
maxY = Math.max(maxY, y + padding);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
for (const e of layer.elements) {
|
|
36
|
+
if (e.kind === "raster-surface") {
|
|
37
|
+
include(0, 0, e.width, e.height, e.matrix, 1);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (e.kind === "text") {
|
|
41
|
+
const context = new Canvas(1, 1).getContext("2d");
|
|
42
|
+
context.font = e.font;
|
|
43
|
+
context.textAlign = e.align;
|
|
44
|
+
const m = context.measureText(e.text);
|
|
45
|
+
include(e.x - m.actualBoundingBoxLeft - 2, e.y - m.actualBoundingBoxAscent - 2, e.x + m.actualBoundingBoxRight + 2, e.y + m.actualBoundingBoxDescent + 2, e.matrix);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const padding = e.kind === "raster-stroke" ? brushPadding(e.brush) : e.kind === "vector-stroke" ? e.width : e.strokeWidth;
|
|
49
|
+
const points = e.kind === "vector-path" ? e.commands.flatMap(c => c.op === "Z" ? [] : [{ x: c.x, y: c.y }, ...("x1" in c ? [{ x: c.x1, y: c.y1 }] : []), ...("x2" in c ? [{ x: c.x2, y: c.y2 }] : [])]) : e.points;
|
|
50
|
+
for (const p of points)
|
|
51
|
+
include(p.x - padding, p.y - padding, p.x + padding, p.y + padding, e.matrix);
|
|
52
|
+
}
|
|
53
|
+
if (!Number.isFinite(minX)) {
|
|
54
|
+
minX = 0;
|
|
55
|
+
minY = 0;
|
|
56
|
+
maxX = 1;
|
|
57
|
+
maxY = 1;
|
|
58
|
+
}
|
|
59
|
+
const x = Math.floor(minX), y = Math.floor(minY), width = Math.max(1, Math.ceil(maxX) - x), height = Math.max(1, Math.ceil(maxY) - y);
|
|
60
|
+
const pixelWidth = Math.ceil(width * scale), pixelHeight = Math.ceil(height * scale);
|
|
61
|
+
if (pixelWidth * pixelHeight > 32 * 1024 * 1024)
|
|
62
|
+
throw new Error(`Layer ${layer.id} exceeds 32 megapixel artwork bounds`);
|
|
63
|
+
const canvas = new Canvas(pixelWidth, pixelHeight);
|
|
64
|
+
const ctx = canvas.getContext("2d");
|
|
65
|
+
try {
|
|
66
|
+
ctx.scale(scale, scale);
|
|
67
|
+
ctx.translate(-x, -y);
|
|
68
|
+
for (const element of layer.elements)
|
|
69
|
+
drawElement(ctx, element, frame);
|
|
70
|
+
const size = pixelWidth * pixelHeight * 4;
|
|
71
|
+
while (this.bytes + size > this.maxBytes && this.layers.size) {
|
|
72
|
+
const first = this.layers.keys().next().value;
|
|
73
|
+
const old = this.layers.get(first);
|
|
74
|
+
this.bytes -= old.canvas.width * old.canvas.height * 4;
|
|
75
|
+
this.layers.delete(first);
|
|
76
|
+
}
|
|
77
|
+
// Keep pixels, not a retained display list of every dab, in the bounded cache.
|
|
78
|
+
const flattened = new Canvas(pixelWidth, pixelHeight);
|
|
79
|
+
flattened.getContext("2d").putImageData(ctx.getImageData(0, 0, pixelWidth, pixelHeight), 0, 0);
|
|
80
|
+
const result = { canvas: flattened, x, y, scale };
|
|
81
|
+
if (!active && size <= this.maxBytes) {
|
|
82
|
+
this.layers.set(layer, result);
|
|
83
|
+
this.bytes += size;
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
ctx.reset();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function findLayerPath(layers, id) {
|
|
93
|
+
for (const layer of layers) {
|
|
94
|
+
if (layer.id === id)
|
|
95
|
+
return [layer];
|
|
96
|
+
if (layer.kind === "group") {
|
|
97
|
+
const nested = findLayerPath(layer.children, id);
|
|
98
|
+
if (nested)
|
|
99
|
+
return [layer, ...nested];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
function compositionBounds(panel, layers, frame, camera) {
|
|
105
|
+
let left = 0, top = 0, right = panel.width, bottom = panel.height;
|
|
106
|
+
if (camera) {
|
|
107
|
+
const c = Math.cos(camera.rotation), s = Math.sin(camera.rotation);
|
|
108
|
+
for (const layer of layers) {
|
|
109
|
+
const { zoom, panX, panY } = cameraPlane(camera, evaluateLayer(layer, frame).depth, panel.width, panel.height);
|
|
110
|
+
for (const [x, y] of [[0, 0], [panel.width, 0], [0, panel.height], [panel.width, panel.height]]) {
|
|
111
|
+
const u = (x - panel.width / 2) / zoom, v = (y - panel.height / 2) / zoom;
|
|
112
|
+
const wx = c * u - s * v + panel.width / 2 + panX;
|
|
113
|
+
const wy = s * u + c * v + panel.height / 2 + panY;
|
|
114
|
+
if (!Number.isFinite(wx) || !Number.isFinite(wy))
|
|
115
|
+
throw new Error('Camera plane composition bounds exceed the supported numerical range');
|
|
116
|
+
left = Math.min(left, Math.floor(wx));
|
|
117
|
+
top = Math.min(top, Math.floor(wy));
|
|
118
|
+
right = Math.max(right, Math.ceil(wx));
|
|
119
|
+
bottom = Math.max(bottom, Math.ceil(wy));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const width = right - left, height = bottom - top;
|
|
124
|
+
if (!Number.isFinite(width) || !Number.isFinite(height))
|
|
125
|
+
throw new Error('Camera plane composition bounds exceed the supported numerical range');
|
|
126
|
+
return { x: left, y: top, width, height };
|
|
127
|
+
}
|
|
128
|
+
function placeLayer(ctx, transform, pivot) {
|
|
129
|
+
ctx.translate(transform.x, transform.y);
|
|
130
|
+
if (pivot)
|
|
131
|
+
ctx.translate(pivot.x, pivot.y);
|
|
132
|
+
ctx.rotate(transform.rotation);
|
|
133
|
+
ctx.scale(transform.scaleX, transform.scaleY);
|
|
134
|
+
if (pivot)
|
|
135
|
+
ctx.translate(-pivot.x, -pivot.y);
|
|
136
|
+
}
|
|
137
|
+
const revealing = (layer, frame) => layer.elements.some(e => e.kind === "raster-stroke" && e.reveal && frame < e.reveal.endFrame);
|
|
138
|
+
function paintCached(ctx, cache, panel, layer, frame) {
|
|
139
|
+
const m = ctx.getTransform(), scale = Math.max(Math.hypot(m.a, m.b), Math.hypot(m.c, m.d));
|
|
140
|
+
const art = cache.artwork(panel, layer, frame, scale);
|
|
141
|
+
ctx.drawImage(art.canvas, art.x, art.y, art.canvas.width / art.scale, art.canvas.height / art.scale);
|
|
142
|
+
}
|
|
143
|
+
function renderLayer(panel, layer, frame, visited = new Set(), force = false, cache, parent, resolution = 1, bounds = { x: 0, y: 0, width: panel.width, height: panel.height }, selection) {
|
|
144
|
+
if (visited.has(layer.id))
|
|
145
|
+
throw new Error(`Circular layer mask involving ${layer.id}`);
|
|
146
|
+
const nextVisited = new Set(visited).add(layer.id);
|
|
147
|
+
const width = Math.ceil(bounds.width * resolution), height = Math.ceil(bounds.height * resolution);
|
|
148
|
+
if (width * height > 32 * 1024 * 1024)
|
|
149
|
+
throw new Error(`Layer ${layer.id} exceeds 32 megapixel camera composition bounds`);
|
|
150
|
+
const canvas = new Canvas(width, height);
|
|
151
|
+
if (!layer.visible && !force)
|
|
152
|
+
return canvas;
|
|
153
|
+
if (layer.exposure && (frame < layer.exposure.startFrame || frame >= layer.exposure.endFrame))
|
|
154
|
+
return canvas;
|
|
155
|
+
const ctx = canvas.getContext("2d");
|
|
156
|
+
ctx.save();
|
|
157
|
+
if (parent)
|
|
158
|
+
ctx.setTransform(parent.a, parent.b, parent.c, parent.d, parent.e, parent.f);
|
|
159
|
+
else {
|
|
160
|
+
ctx.scale(resolution, resolution);
|
|
161
|
+
ctx.translate(-bounds.x, -bounds.y);
|
|
162
|
+
}
|
|
163
|
+
const state = evaluateLayer(layer, frame);
|
|
164
|
+
placeLayer(ctx, state.transform, layer.pivot);
|
|
165
|
+
if (layer.kind === "group") {
|
|
166
|
+
const matrix = ctx.getTransform();
|
|
167
|
+
ctx.resetTransform();
|
|
168
|
+
const drawing = evaluateDrawing(layer.drawingSequence, frame);
|
|
169
|
+
const children = drawing === undefined ? layer.children : layer.children.filter(child => child.id === drawing);
|
|
170
|
+
compositeLayers(panel, children, ctx, frame, cache, undefined, nextVisited, matrix, resolution, bounds, selection?.has(layer.id) ? undefined : selection);
|
|
171
|
+
}
|
|
172
|
+
else if (cache && layer.kind === "raster")
|
|
173
|
+
paintCached(ctx, cache, panel, layer, frame);
|
|
174
|
+
else
|
|
175
|
+
for (const element of layer.elements)
|
|
176
|
+
drawElement(ctx, element, frame);
|
|
177
|
+
ctx.restore();
|
|
178
|
+
if (layer.maskLayerId) {
|
|
179
|
+
const maskPath = findLayerPath(panel.layers, layer.maskLayerId);
|
|
180
|
+
if (!maskPath)
|
|
181
|
+
throw new Error(`Mask layer not found: ${layer.maskLayerId}`);
|
|
182
|
+
const mask = maskPath.at(-1);
|
|
183
|
+
const consumerAncestors = new Set(findLayerPath(panel.layers, layer.id).slice(0, -1).map(entry => entry.id));
|
|
184
|
+
let maskOpacity = evaluateLayer(mask, frame).opacity;
|
|
185
|
+
ctx.save();
|
|
186
|
+
ctx.resetTransform();
|
|
187
|
+
ctx.scale(resolution, resolution);
|
|
188
|
+
ctx.translate(-bounds.x, -bounds.y);
|
|
189
|
+
for (const [index, ancestor] of maskPath.slice(0, -1).entries()) {
|
|
190
|
+
const state = evaluateLayer(ancestor, frame);
|
|
191
|
+
placeLayer(ctx, state.transform, ancestor.pivot);
|
|
192
|
+
if (!consumerAncestors.has(ancestor.id))
|
|
193
|
+
maskOpacity *= state.opacity;
|
|
194
|
+
if (ancestor.exposure && (frame < ancestor.exposure.startFrame || frame >= ancestor.exposure.endFrame))
|
|
195
|
+
maskOpacity = 0;
|
|
196
|
+
if (ancestor.kind === "group") {
|
|
197
|
+
const drawing = evaluateDrawing(ancestor.drawingSequence, frame);
|
|
198
|
+
if (drawing !== undefined && drawing !== maskPath[index + 1].id)
|
|
199
|
+
maskOpacity = 0;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const maskParent = ctx.getTransform();
|
|
203
|
+
ctx.restore();
|
|
204
|
+
const maskCanvas = renderLayer(panel, mask, frame, nextVisited, true, cache, maskParent, resolution, bounds);
|
|
205
|
+
ctx.save();
|
|
206
|
+
ctx.globalCompositeOperation = "destination-in";
|
|
207
|
+
ctx.globalAlpha = maskOpacity;
|
|
208
|
+
ctx.drawImage(maskCanvas, 0, 0);
|
|
209
|
+
ctx.restore();
|
|
210
|
+
}
|
|
211
|
+
return canvas;
|
|
212
|
+
}
|
|
213
|
+
export function compositeLayers(panel, layers, target, frame = panel.startFrame, cache, camera, visited = new Set(), parent, resolution = 1, bounds = compositionBounds(panel, layers, frame, camera), selection) {
|
|
214
|
+
const selected = (layer) => !selection || selection.has(layer.id) || (layer.kind === "group" && layer.children.some(selected));
|
|
215
|
+
let below;
|
|
216
|
+
for (const [index, layer] of layers.entries()) {
|
|
217
|
+
const state = evaluateLayer(layer, frame);
|
|
218
|
+
const placement = camera ? cameraPlane(camera, state.depth, panel.width, panel.height) : undefined;
|
|
219
|
+
const paint = selected(layer);
|
|
220
|
+
if (!paint && !layers[index + 1]?.clipToBelow) {
|
|
221
|
+
below = undefined;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!layer.visible) {
|
|
225
|
+
below = undefined;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (state.opacity === 0) {
|
|
229
|
+
below = undefined;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (layer.exposure && (frame < layer.exposure.startFrame || frame >= layer.exposure.endFrame)) {
|
|
233
|
+
below = undefined;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (layer.clipToBelow && !below)
|
|
237
|
+
continue;
|
|
238
|
+
if (paint && cache && layer.kind !== "group" && !layer.maskLayerId && !layer.clipToBelow && !layers[index + 1]?.clipToBelow && (layer.kind === "raster" || (state.opacity === 1 && layer.blendMode === "source-over"))) {
|
|
239
|
+
target.save();
|
|
240
|
+
if (camera && placement) {
|
|
241
|
+
target.translate(panel.width / 2, panel.height / 2);
|
|
242
|
+
target.rotate(-camera.rotation);
|
|
243
|
+
target.scale(placement.zoom, placement.zoom);
|
|
244
|
+
target.translate(-panel.width / 2 - placement.panX, -panel.height / 2 - placement.panY);
|
|
245
|
+
}
|
|
246
|
+
if (parent)
|
|
247
|
+
target.transform(parent.a, parent.b, parent.c, parent.d, parent.e, parent.f);
|
|
248
|
+
placeLayer(target, state.transform, layer.pivot);
|
|
249
|
+
target.globalAlpha = state.opacity;
|
|
250
|
+
target.globalCompositeOperation = layer.blendMode;
|
|
251
|
+
if (layer.kind === "vector")
|
|
252
|
+
for (const e of layer.elements)
|
|
253
|
+
drawElement(target, e, frame);
|
|
254
|
+
else
|
|
255
|
+
paintCached(target, cache, panel, layer, frame);
|
|
256
|
+
target.restore();
|
|
257
|
+
below = undefined;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const layerResolution = placement ? Math.max(1, Math.ceil(placement.zoom * 4) / 4) : resolution;
|
|
261
|
+
const rendered = renderLayer(panel, layer, frame, visited, false, cache, parent, layerResolution, bounds, paint ? selection : undefined);
|
|
262
|
+
const alphaSource = selection && layer.kind === "group" && paint && !selection.has(layer.id) && layers[index + 1]?.clipToBelow
|
|
263
|
+
? renderLayer(panel, layer, frame, visited, false, cache, parent, layerResolution, bounds) : rendered;
|
|
264
|
+
if (layer.clipToBelow && below) {
|
|
265
|
+
for (const surface of new Set([rendered, alphaSource])) {
|
|
266
|
+
const clippingContext = surface.getContext("2d");
|
|
267
|
+
clippingContext.globalCompositeOperation = "destination-in";
|
|
268
|
+
clippingContext.drawImage(below, 0, 0, surface.width, surface.height);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (paint) {
|
|
272
|
+
target.save();
|
|
273
|
+
if (camera && placement) {
|
|
274
|
+
target.translate(panel.width / 2, panel.height / 2);
|
|
275
|
+
target.rotate(-camera.rotation);
|
|
276
|
+
target.scale(placement.zoom, placement.zoom);
|
|
277
|
+
target.translate(-panel.width / 2 - placement.panX, -panel.height / 2 - placement.panY);
|
|
278
|
+
}
|
|
279
|
+
target.globalAlpha = state.opacity;
|
|
280
|
+
target.globalCompositeOperation = layer.blendMode;
|
|
281
|
+
if (camera)
|
|
282
|
+
target.drawImage(rendered, bounds.x, bounds.y, rendered.width / layerResolution, rendered.height / layerResolution);
|
|
283
|
+
else
|
|
284
|
+
target.drawImage(rendered, 0, 0);
|
|
285
|
+
target.restore();
|
|
286
|
+
}
|
|
287
|
+
below = alphaSource;
|
|
288
|
+
if (state.opacity < 1 && layers[index + 1]?.clipToBelow) {
|
|
289
|
+
below = new Canvas(rendered.width, rendered.height);
|
|
290
|
+
const alpha = below.getContext("2d");
|
|
291
|
+
alpha.globalAlpha = state.opacity;
|
|
292
|
+
alpha.drawImage(alphaSource, 0, 0);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=layer-compositor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layer-compositor.js","sourceRoot":"","sources":["../../../src/render/layer-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiC,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAEzD,MAAM,OAAO,WAAW;IAGD;IAFb,MAAM,GAAG,IAAI,GAAG,EAAgE,CAAC;IACjF,KAAK,GAAG,CAAC,CAAC;IAClB,YAAqB,WAAW,GAAG,GAAG,IAAI,GAAG,IAAI;QAA5B,aAAQ,GAAR,QAAQ,CAAoB;IAAG,CAAC;IACrD,KAAK,KAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA,IAAI,CAAC,KAAK,GAAC,CAAC,CAAC,CAAA,CAAC;IAC1C,OAAO,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,GAAG,CAAC;QACpE,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,KAAK,KAAG,KAAK;YAAE,OAAO,KAAK,CAAC;QACvC,IAAG,KAAK,EAAC,CAAC;YAAA,IAAI,CAAC,KAAK,IAAE,KAAK,CAAC,MAAM,CAAC,KAAK,GAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAC,CAAC,CAAC;YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAA,CAAC;QAC1F,IAAI,IAAI,GAAC,QAAQ,EAAC,IAAI,GAAC,QAAQ,EAAC,IAAI,GAAC,CAAC,QAAQ,EAAC,IAAI,GAAC,CAAC,QAAQ,CAAC;QAC9D,MAAM,OAAO,GAAC,CAAC,IAAW,EAAC,GAAU,EAAC,KAAY,EAAC,MAAa,EAAC,MAAoB,EAAC,OAAO,GAAC,CAAC,EAAC,EAAE;YAChG,MAAM,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,GAAC,MAAM,IAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;YAC1C,KAAI,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAC,GAAG,CAAC,EAAC,CAAC,KAAK,EAAC,GAAG,CAAC,EAAC,CAAC,IAAI,EAAC,MAAM,CAAC,EAAC,CAAC,KAAK,EAAC,MAAM,CAAC,CAAC,EAAC,CAAC;gBACxE,MAAM,CAAC,GAAC,CAAC,GAAC,CAAE,GAAC,CAAC,GAAC,CAAE,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,GAAC,CAAE,GAAC,CAAC,GAAC,CAAE,GAAC,CAAC,CAAC;gBAClC,IAAI,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,GAAC,OAAO,CAAC,CAAC;gBAAA,IAAI,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,GAAC,OAAO,CAAC,CAAC;gBAAA,IAAI,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,GAAC,OAAO,CAAC,CAAC;gBAAA,IAAI,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,GAAC,OAAO,CAAC,CAAC;YAC1H,CAAC;QACH,CAAC,CAAC;QACF,KAAI,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAC,CAAC;YAC7B,IAAG,CAAC,CAAC,IAAI,KAAG,gBAAgB,EAAC,CAAC;gBAC5B,OAAO,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,KAAK,EAAC,CAAC,CAAC,MAAM,EAAC,CAAC,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC;gBAAA,SAAS;YACpD,CAAC;YACD,IAAG,CAAC,CAAC,IAAI,KAAG,MAAM,EAAC,CAAC;gBAClB,MAAM,OAAO,GAAC,IAAI,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAA,OAAO,CAAC,IAAI,GAAC,CAAC,CAAC,IAAI,CAAC;gBAAA,OAAO,CAAC,SAAS,GAAC,CAAC,CAAC,KAAK,CAAC;gBAAA,MAAM,CAAC,GAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjI,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,qBAAqB,GAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,uBAAuB,GAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,sBAAsB,GAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,wBAAwB,GAAC,CAAC,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAAA,SAAS;YAC3J,CAAC;YACD,MAAM,OAAO,GAAC,CAAC,CAAC,IAAI,KAAG,eAAe,CAAA,CAAC,CAAA,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,IAAI,KAAG,eAAe,CAAA,CAAC,CAAA,CAAC,CAAC,KAAK,CAAA,CAAC,CAAA,CAAC,CAAC,WAAW,CAAC;YAC5G,MAAM,MAAM,GAAC,CAAC,CAAC,IAAI,KAAG,aAAa,CAAA,CAAC,CAAA,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,GAAG,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,EAAC,EAAC,GAAG,CAAC,IAAI,IAAG,CAAC,CAAA,CAAC,CAAA,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,EAAC,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,GAAG,CAAC,IAAI,IAAG,CAAC,CAAA,CAAC,CAAA,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,EAAC,CAAC,EAAC,CAAC,CAAC,EAAE,EAAC,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,MAAM,CAAC;YACxK,KAAI,MAAM,CAAC,IAAI,MAAM;gBAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,OAAO,EAAC,CAAC,CAAC,CAAC,GAAC,OAAO,EAAC,CAAC,CAAC,CAAC,GAAC,OAAO,EAAC,CAAC,CAAC,CAAC,GAAC,OAAO,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1F,CAAC;QACD,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,CAAC;YAAA,IAAI,GAAC,CAAC,CAAC;YAAA,IAAI,GAAC,CAAC,CAAC;YAAA,IAAI,GAAC,CAAC,CAAC;YAAA,IAAI,GAAC,CAAC,CAAC;QAAA,CAAC;QACxD,MAAM,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAC,CAAC,CAAC,EAAC,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAC,CAAC,CAAC,CAAC;QACrH,MAAM,UAAU,GAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAC,KAAK,CAAC,EAAC,WAAW,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAC,KAAK,CAAC,CAAC;QAC5E,IAAG,UAAU,GAAC,WAAW,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI;YAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,sCAAsC,CAAC,CAAC;QAChH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,IAAG,CAAC;YACJ,GAAG,CAAC,KAAK,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC;YAAA,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;gBAAE,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;gBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,+EAA+E;YAC/E,MAAM,SAAS,GAAC,IAAI,MAAM,CAAC,UAAU,EAAC,WAAW,CAAC,CAAC;YACnD,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAC,CAAC,EAAC,UAAU,EAAC,WAAW,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;YAC1F,MAAM,MAAM,GAAC,EAAC,MAAM,EAAC,SAAS,EAAC,CAAC,EAAC,CAAC,EAAC,KAAK,EAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;YAAC,CAAC;YAC7F,OAAO,MAAM,CAAC;QACd,CAAC;gBAAO,CAAC;YAAA,GAAG,CAAC,KAAK,EAAE,CAAC;QAAA,CAAC;IACxB,CAAC;CACF;AAED,SAAS,aAAa,CAAC,MAAe,EAAE,EAAU;IAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM;gBAAE,OAAO,CAAC,KAAK,EAAC,GAAG,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,SAAS,iBAAiB,CAAC,KAAW,EAAC,MAAc,EAAC,KAAY,EAAC,MAAuB;IACxF,IAAI,IAAI,GAAC,CAAC,EAAC,GAAG,GAAC,CAAC,EAAC,KAAK,GAAC,KAAK,CAAC,KAAK,EAAC,MAAM,GAAC,KAAK,CAAC,MAAM,CAAC;IACvD,IAAG,MAAM,EAAC,CAAC;QACT,MAAM,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9D,KAAI,MAAM,KAAK,IAAI,MAAM,EAAC,CAAC;YACzB,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAC,WAAW,CAAC,MAAM,EAAC,aAAa,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrG,KAAI,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,CAAC,KAAK,CAAC,KAAK,EAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,KAAK,CAAC,MAAM,CAAC,EAAC,CAAC,KAAK,CAAC,KAAK,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC;gBACtF,MAAM,CAAC,GAAC,CAAC,CAAE,GAAC,KAAK,CAAC,KAAK,GAAC,CAAC,CAAC,GAAC,IAAI,EAAC,CAAC,GAAC,CAAC,CAAE,GAAC,KAAK,CAAC,MAAM,GAAC,CAAC,CAAC,GAAC,IAAI,CAAC;gBAC3D,MAAM,EAAE,GAAC,CAAC,GAAC,CAAC,GAAC,CAAC,GAAC,CAAC,GAAC,KAAK,CAAC,KAAK,GAAC,CAAC,GAAC,IAAI,CAAC;gBACpC,MAAM,EAAE,GAAC,CAAC,GAAC,CAAC,GAAC,CAAC,GAAC,CAAC,GAAC,KAAK,CAAC,MAAM,GAAC,CAAC,GAAC,IAAI,CAAC;gBACrC,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACtI,IAAI,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAA,GAAG,GAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpE,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAA,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAC,KAAK,GAAC,IAAI,EAAC,MAAM,GAAC,MAAM,GAAC,GAAG,CAAC;IACzC,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC7I,OAAO,EAAC,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,CAAC;AACrC,CAAC;AAGD,SAAS,UAAU,CAAC,GAA4B,EAAC,SAAmB,EAAC,KAAY;IAC/E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvC,IAAG,KAAK;QAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAAA,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5E,IAAG,KAAK;QAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AACD,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxJ,SAAS,WAAW,CAAC,GAA4B,EAAC,KAAiB,EAAC,KAAW,EAAC,KAAkB,EAAC,KAAY;IAC7G,MAAM,CAAC,GAAC,GAAG,CAAC,YAAY,EAAE,EAAC,KAAK,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC;IACjD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAC,GAAG,CAAC,CAAC,EAAC,GAAG,CAAC,CAAC,EAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAC,GAAG,CAAC,KAAK,EAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/F,CAAC;AACD,SAAS,WAAW,CAAC,KAAY,EAAE,KAAY,EAAE,KAAa,EAAE,UAAU,IAAI,GAAG,EAAU,EAAE,KAAK,GAAG,KAAK,EAAE,KAAmB,EAAE,MAAc,EAAC,UAAU,GAAC,CAAC,EAAC,SAAyB,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,MAAM,EAAC,KAAK,CAAC,MAAM,EAAC,EAAC,SAA8B;IAClQ,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAC,UAAU,CAAC,EAAC,MAAM,GAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAC,UAAU,CAAC,CAAC;IAC1F,IAAG,KAAK,GAAC,MAAM,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI;QAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,EAAE,iDAAiD,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC5C,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7G,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,IAAG,MAAM;QAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC7E,CAAC;QAAA,GAAG,CAAC,KAAK,CAAC,UAAU,EAAC,UAAU,CAAC,CAAC;QAAA,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAAA,CAAC;IAC3E,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,UAAU,CAAC,GAAG,EAAC,KAAK,CAAC,SAAS,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAAA,GAAG,CAAC,cAAc,EAAE,CAAC;QACrD,MAAM,OAAO,GAAC,eAAe,CAAC,KAAK,CAAC,eAAe,EAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAC,OAAO,KAAG,SAAS,CAAA,CAAC,CAAA,KAAK,CAAC,QAAQ,CAAA,CAAC,CAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA,EAAE,CAAA,KAAK,CAAC,EAAE,KAAG,OAAO,CAAC,CAAC;QACnG,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,EAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC;IACpJ,CAAC;SACI,IAAI,KAAK,IAAE,KAAK,CAAC,IAAI,KAAG,QAAQ;QAAE,WAAW,CAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC;;QAC3E,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ;YAAE,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5E,GAAG,CAAC,OAAO,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,iBAAiB,GAAC,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAC,KAAK,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA,EAAE,CAAA,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,WAAW,GAAC,aAAa,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC,OAAO,CAAC;QAClD,GAAG,CAAC,IAAI,EAAE,CAAC;QAAA,GAAG,CAAC,cAAc,EAAE,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAC,UAAU,CAAC,CAAC;QAAA,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpE,KAAI,MAAM,CAAC,KAAK,EAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAC,CAAC;YAC5D,MAAM,KAAK,GAAC,aAAa,CAAC,QAAQ,EAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,GAAG,EAAC,KAAK,CAAC,SAAS,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAC,WAAW,IAAE,KAAK,CAAC,OAAO,CAAC;YAClE,IAAG,QAAQ,CAAC,QAAQ,IAAE,CAAC,KAAK,GAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,IAAE,KAAK,IAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAC,WAAW,GAAC,CAAC,CAAC;YAC5G,IAAG,QAAQ,CAAC,IAAI,KAAG,OAAO,EAAC,CAAC;gBAC1B,MAAM,OAAO,GAAC,eAAe,CAAC,QAAQ,CAAC,eAAe,EAAC,KAAK,CAAC,CAAC;gBAC9D,IAAG,OAAO,KAAG,SAAS,IAAE,OAAO,KAAG,QAAQ,CAAC,KAAK,GAAC,CAAC,CAAE,CAAC,EAAE;oBAAC,WAAW,GAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAAA,GAAG,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAC,UAAU,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC;QAC1G,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,wBAAwB,GAAG,gBAAgB,CAAC;QAChD,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;QAC9B,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,GAAG,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,MAAe,EAAE,MAAgC,EAAE,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,KAAmB,EAAE,MAAwB,EAAE,UAAU,IAAI,GAAG,EAAU,EAAC,MAAc,EAAC,UAAU,GAAC,CAAC,EAAC,MAAM,GAAC,iBAAiB,CAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,CAAC,EAAC,SAA8B;IAClT,MAAM,QAAQ,GAAC,CAAC,KAAW,EAAS,EAAE,CAAA,CAAC,SAAS,IAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAE,CAAC,KAAK,CAAC,IAAI,KAAG,OAAO,IAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjI,IAAI,KAAyB,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAC,aAAa,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAC,MAAM,CAAA,CAAC,CAAA,WAAW,CAAC,MAAM,EAAC,KAAK,CAAC,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,KAAK,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,SAAS,CAAC;QAC1F,MAAM,KAAK,GAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAG,CAAC,KAAK,IAAE,CAAC,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,EAAE,WAAW,EAAC,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YAAA,SAAS;QAAA,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YAAA,SAAS;QAAA,CAAC;QAC/C,IAAG,KAAK,CAAC,OAAO,KAAG,CAAC,EAAC,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YAAA,SAAS;QAAA,CAAC;QAChD,IAAG,KAAK,CAAC,QAAQ,IAAE,CAAC,KAAK,GAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAE,KAAK,IAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAC,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YAAA,SAAS;QAAA,CAAC;QAChH,IAAG,KAAK,CAAC,WAAW,IAAE,CAAC,KAAK;YAAC,SAAS;QACtC,IAAG,KAAK,IAAE,KAAK,IAAE,KAAK,CAAC,IAAI,KAAG,OAAO,IAAE,CAAC,KAAK,CAAC,WAAW,IAAE,CAAC,KAAK,CAAC,WAAW,IAAE,CAAC,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,EAAE,WAAW,IAAE,CAAC,KAAK,CAAC,IAAI,KAAG,QAAQ,IAAE,CAAC,KAAK,CAAC,OAAO,KAAG,CAAC,IAAE,KAAK,CAAC,SAAS,KAAG,aAAa,CAAC,CAAC,EAAC,CAAC;YAC3L,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,IAAG,MAAM,IAAE,SAAS,EAAC,CAAC;gBAAA,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,EAAC,KAAK,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;gBAAA,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAA,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAA,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,GAAC,SAAS,CAAC,IAAI,EAAC,CAAC,KAAK,CAAC,MAAM,GAAC,CAAC,GAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAAA,CAAC;YACjO,IAAG,MAAM;gBAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAClF,UAAU,CAAC,MAAM,EAAC,KAAK,CAAC,SAAS,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,GAAC,KAAK,CAAC,OAAO,CAAC;YAAA,MAAM,CAAC,wBAAwB,GAAC,KAAK,CAAC,SAAS,CAAC;YACjF,IAAG,KAAK,CAAC,IAAI,KAAG,QAAQ;gBAAC,KAAI,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ;oBAAC,WAAW,CAAC,MAAM,EAAC,CAAC,EAAC,KAAK,CAAC,CAAC;;gBAC9E,WAAW,CAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,CAAC;YAAA,KAAK,GAAC,SAAS,CAAC;YAAA,SAAS;QAC5C,CAAC;QACD,MAAM,eAAe,GAAC,SAAS,CAAA,CAAC,CAAA,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAA,CAAC,CAAA,UAAU,CAAC;QACrF,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,EAAC,eAAe,EAAC,MAAM,EAAC,KAAK,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,SAAS,CAAC,CAAC;QACjI,MAAM,WAAW,GAAC,SAAS,IAAE,KAAK,CAAC,IAAI,KAAG,OAAO,IAAE,KAAK,IAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAE,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,EAAE,WAAW;YAC9G,CAAC,CAAA,WAAW,CAAC,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,eAAe,EAAC,MAAM,CAAC,CAAA,CAAC,CAAA,QAAQ,CAAC;QAC7F,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC;YAC/B,KAAI,MAAM,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAC,WAAW,CAAC,CAAC,EAAC,CAAC;gBACpD,MAAM,eAAe,GAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAA,eAAe,CAAC,wBAAwB,GAAC,gBAAgB,CAAC;gBACzG,eAAe,CAAC,SAAS,CAAC,KAAK,EAAC,CAAC,EAAC,CAAC,EAAC,OAAO,CAAC,KAAK,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,IAAG,KAAK,EAAC,CAAC;YAAA,MAAM,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,MAAM,IAAE,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,GAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;YACnC,MAAM,CAAC,wBAAwB,GAAG,KAAK,CAAC,SAAS,CAAC;YAClD,IAAG,MAAM;gBAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAC,MAAM,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC,EAAC,QAAQ,CAAC,KAAK,GAAC,eAAe,EAAC,QAAQ,CAAC,MAAM,GAAC,eAAe,CAAC,CAAC;;gBACjH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAA,CAAC;QAClB,KAAK,GAAG,WAAW,CAAC;QACpB,IAAG,KAAK,CAAC,OAAO,GAAC,CAAC,IAAE,MAAM,CAAC,KAAK,GAAC,CAAC,CAAC,EAAE,WAAW,EAAC,CAAC;YAChD,KAAK,GAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,KAAK,GAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,KAAK,CAAC,WAAW,GAAC,KAAK,CAAC,OAAO,CAAC;YAAA,KAAK,CAAC,SAAS,CAAC,WAAW,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Canvas } from "skia-canvas";
|
|
2
|
+
import type { StoryboardDocument } from "../model/types.js";
|
|
3
|
+
import { StoryboardProject } from "../core/project.js";
|
|
4
|
+
import { RenderCache } from "./layer-compositor.js";
|
|
5
|
+
export type RenderSource = StoryboardProject | StoryboardDocument;
|
|
6
|
+
export type PanelRenderSource = StoryboardProject | Pick<StoryboardDocument, "canvas" | "panels" | "shots">;
|
|
7
|
+
export declare function renderPanelCanvas(source: PanelRenderSource, panelId: string, options?: {
|
|
8
|
+
annotations?: boolean;
|
|
9
|
+
frame?: number;
|
|
10
|
+
camera?: boolean;
|
|
11
|
+
layerIds?: readonly string[];
|
|
12
|
+
cache?: RenderCache;
|
|
13
|
+
}): Canvas;
|
|
14
|
+
export declare function renderPanelPNG(source: RenderSource, panelId: string, options?: {
|
|
15
|
+
annotations?: boolean;
|
|
16
|
+
frame?: number;
|
|
17
|
+
camera?: boolean;
|
|
18
|
+
layerIds?: readonly string[];
|
|
19
|
+
}): Promise<Buffer>;
|
|
20
|
+
export declare function renderFrameCanvas(source: RenderSource, frame: number, options?: {
|
|
21
|
+
annotations?: boolean;
|
|
22
|
+
cache?: RenderCache;
|
|
23
|
+
}): Canvas;
|
|
24
|
+
export declare function renderFramePNG(source: RenderSource, frame: number, options?: {
|
|
25
|
+
annotations?: boolean;
|
|
26
|
+
}): Promise<Buffer>;
|
|
27
|
+
/** A frozen document snapshot with bounded artwork cache; create another session after edits. */
|
|
28
|
+
export declare function createRenderSession(source: RenderSource, maxCacheBytes?: number): {
|
|
29
|
+
durationFrames: number;
|
|
30
|
+
frame: (frame: number) => Canvas;
|
|
31
|
+
panel: (id: string, frame?: number) => Canvas;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=panel-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-renderer.d.ts","sourceRoot":"","sources":["../../../src/render/panel-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,kBAAkB,EAAS,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAmB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQrE,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAC,QAAQ,GAAC,QAAQ,GAAC,OAAO,CAAC,CAAC;AAMvG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,MAAM,CAwBlN;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpM;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,MAAM,CAoC3I;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAElI;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM;;mBAO7D,MAAM;gBACT,MAAM,UAAU,MAAM;EAErC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Canvas } from "skia-canvas";
|
|
2
|
+
import { StoryboardProject } from "../core/project.js";
|
|
3
|
+
import { compositeLayers, RenderCache } from "./layer-compositor.js";
|
|
4
|
+
import { drawMotionAnnotations } from "./annotations.js";
|
|
5
|
+
import { evaluateCamera } from "../animation/evaluate.js";
|
|
6
|
+
import { parseStoryboardDocument } from "../model/validate.js";
|
|
7
|
+
import { assertRenderFrame, selectFramePanels } from "../animation/frame.js";
|
|
8
|
+
import { isDrawingColor } from "../drawing/color.js";
|
|
9
|
+
import { encodePNG } from "./png.js";
|
|
10
|
+
function documentOf(source) {
|
|
11
|
+
return source instanceof StoryboardProject ? source.toJSON() : source;
|
|
12
|
+
}
|
|
13
|
+
export function renderPanelCanvas(source, panelId, options = {}) {
|
|
14
|
+
const document = source instanceof StoryboardProject ? source._readRenderPanels([panelId]) : source;
|
|
15
|
+
const panel = document.panels.find((entry) => entry.id === panelId);
|
|
16
|
+
if (!panel)
|
|
17
|
+
throw new Error(`Panel not found: ${panelId}`);
|
|
18
|
+
const frame = options.frame ?? panel.startFrame;
|
|
19
|
+
assertRenderFrame(frame);
|
|
20
|
+
if (!isDrawingColor(document.canvas.background))
|
|
21
|
+
throw new Error("Invalid canvas background color");
|
|
22
|
+
const shot = document.shots.find((entry) => entry.id === panel.shotId);
|
|
23
|
+
const camera = evaluateCamera(shot?.cameraKeyframes ?? [], frame);
|
|
24
|
+
let selection;
|
|
25
|
+
if (options.layerIds) {
|
|
26
|
+
selection = new Set(options.layerIds);
|
|
27
|
+
if (!selection.size || selection.size !== options.layerIds.length)
|
|
28
|
+
throw new Error("Layer render selection requires nonempty unique layer IDs");
|
|
29
|
+
const ids = new Set();
|
|
30
|
+
const visit = (layers) => { for (const layer of layers) {
|
|
31
|
+
ids.add(layer.id);
|
|
32
|
+
if (layer.kind === "group")
|
|
33
|
+
visit(layer.children);
|
|
34
|
+
} };
|
|
35
|
+
visit(panel.layers);
|
|
36
|
+
for (const id of selection)
|
|
37
|
+
if (!ids.has(id))
|
|
38
|
+
throw new Error(`Render layer not found in panel ${panelId}: ${id}`);
|
|
39
|
+
}
|
|
40
|
+
const stage = new Canvas(panel.width, panel.height), stageContext = stage.getContext("2d");
|
|
41
|
+
try {
|
|
42
|
+
stageContext.fillStyle = document.canvas.background;
|
|
43
|
+
stageContext.fillRect(0, 0, panel.width, panel.height);
|
|
44
|
+
compositeLayers(panel, panel.layers, stageContext, frame, options.cache ?? new RenderCache(), options.camera === false ? undefined : camera, undefined, undefined, 1, undefined, selection);
|
|
45
|
+
if (options.annotations ?? true)
|
|
46
|
+
drawMotionAnnotations(stageContext, panel);
|
|
47
|
+
return stage;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
stageContext.reset();
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function renderPanelPNG(source, panelId, options = {}) {
|
|
55
|
+
return encodePNG(renderPanelCanvas(source, panelId, options));
|
|
56
|
+
}
|
|
57
|
+
export function renderFrameCanvas(source, frame, options = {}) {
|
|
58
|
+
assertRenderFrame(frame);
|
|
59
|
+
const document = source instanceof StoryboardProject ? source._readRenderFrame(frame) : source;
|
|
60
|
+
const { panel, incoming: next, progress } = selectFramePanels(document.panels, frame);
|
|
61
|
+
const current = renderPanelCanvas(document, panel.id, { ...options, frame, annotations: options.annotations ?? false });
|
|
62
|
+
const transition = panel.transition;
|
|
63
|
+
if (!next)
|
|
64
|
+
return current;
|
|
65
|
+
let incoming, output;
|
|
66
|
+
try {
|
|
67
|
+
incoming = renderPanelCanvas(document, next.id, { ...options, frame: next.startFrame, annotations: options.annotations ?? false });
|
|
68
|
+
output = new Canvas(panel.width, panel.height);
|
|
69
|
+
const ctx = output.getContext("2d");
|
|
70
|
+
if (transition.type === "dissolve") {
|
|
71
|
+
ctx.globalAlpha = 1 - progress;
|
|
72
|
+
ctx.drawImage(current, 0, 0);
|
|
73
|
+
ctx.globalAlpha = progress;
|
|
74
|
+
ctx.globalCompositeOperation = "lighter";
|
|
75
|
+
ctx.drawImage(incoming, 0, 0);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
ctx.drawImage(current, 0, 0);
|
|
79
|
+
const width = panel.width * progress;
|
|
80
|
+
const left = transition.type === "wipe-left" ? panel.width - width : 0;
|
|
81
|
+
ctx.clearRect(left, 0, width, panel.height);
|
|
82
|
+
ctx.save();
|
|
83
|
+
ctx.beginPath();
|
|
84
|
+
ctx.rect(left, 0, width, panel.height);
|
|
85
|
+
ctx.clip();
|
|
86
|
+
ctx.drawImage(incoming, 0, 0);
|
|
87
|
+
ctx.restore();
|
|
88
|
+
}
|
|
89
|
+
return output;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
output?.getContext("2d").reset();
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
incoming?.getContext("2d").reset();
|
|
97
|
+
current.getContext("2d").reset();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function renderFramePNG(source, frame, options = {}) {
|
|
101
|
+
return encodePNG(renderFrameCanvas(source, frame, options));
|
|
102
|
+
}
|
|
103
|
+
/** A frozen document snapshot with bounded artwork cache; create another session after edits. */
|
|
104
|
+
export function createRenderSession(source, maxCacheBytes) {
|
|
105
|
+
const document = parseStoryboardDocument(documentOf(source));
|
|
106
|
+
const cache = new RenderCache(maxCacheBytes);
|
|
107
|
+
let lastPanel = "";
|
|
108
|
+
const select = (id) => { if (lastPanel !== id) {
|
|
109
|
+
cache.clear();
|
|
110
|
+
lastPanel = id;
|
|
111
|
+
} };
|
|
112
|
+
return {
|
|
113
|
+
durationFrames: document.panels.reduce((n, p) => Math.max(n, p.startFrame + p.durationFrames), 0),
|
|
114
|
+
frame: (frame) => { select(document.panels.find(p => frame >= p.startFrame && frame < p.startFrame + p.durationFrames)?.id ?? ""); return renderFrameCanvas(document, frame, { cache }); },
|
|
115
|
+
panel: (id, frame) => { select(id); return renderPanelCanvas(document, id, { cache, annotations: false, ...(frame === undefined ? {} : { frame }) }); },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=panel-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-renderer.js","sourceRoot":"","sources":["../../../src/render/panel-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../../src/render/png.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AAExC,0FAA0F;AAC1F,wBAAsB,SAAS,CAAC,MAAM,EAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAG7D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Consumes a private render surface after encoding; never pass a caller-owned canvas. */
|
|
2
|
+
export async function encodePNG(canvas) {
|
|
3
|
+
try {
|
|
4
|
+
return await canvas.toBuffer("png");
|
|
5
|
+
}
|
|
6
|
+
finally {
|
|
7
|
+
canvas.getContext("2d").reset();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=png.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"png.js","sourceRoot":"","sources":["../../../src/render/png.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAa;IAC3C,IAAG,CAAC;QAAA,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAAA,CAAC;YAClC,CAAC;QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAAA,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type RenderSource } from "./panel-renderer.js";
|
|
2
|
+
export interface CompositionGuides {
|
|
3
|
+
frame?: number;
|
|
4
|
+
thirds?: boolean;
|
|
5
|
+
/** Fraction of frame width/height inset on each edge; not a broadcast standard. */
|
|
6
|
+
safeInset?: number;
|
|
7
|
+
/** Output-frame pixel coordinates, after camera placement. */
|
|
8
|
+
horizonY?: number;
|
|
9
|
+
vanishingPoints?: readonly {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export declare function renderCompositionGuides(source: RenderSource, panelId: string, options?: CompositionGuides): Promise<Buffer>;
|
|
15
|
+
export declare function renderContactSheet(source: RenderSource, options?: {
|
|
16
|
+
columns?: number;
|
|
17
|
+
thumbnailWidth?: number;
|
|
18
|
+
panelIds?: readonly string[];
|
|
19
|
+
}): Promise<Buffer>;
|
|
20
|
+
export declare function renderDetail(source: RenderSource, panelId: string, crop: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}, frame?: number): Promise<Buffer>;
|
|
26
|
+
export interface OnionSkinSample {
|
|
27
|
+
panelId: string;
|
|
28
|
+
frame?: number;
|
|
29
|
+
layerIds?: readonly string[];
|
|
30
|
+
tint?: string;
|
|
31
|
+
opacity?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function renderOnionSkin(source: RenderSource, samples: readonly OnionSkinSample[], options?: {
|
|
34
|
+
opacity?: number;
|
|
35
|
+
camera?: boolean;
|
|
36
|
+
}): Promise<Buffer>;
|
|
37
|
+
/** Timeline samples in caller order, including drawing substitutions and shot transitions. */
|
|
38
|
+
export declare function renderFrameSheet(source: RenderSource, frames: readonly number[], options?: {
|
|
39
|
+
columns?: number;
|
|
40
|
+
thumbnailWidth?: number;
|
|
41
|
+
}): Promise<Buffer>;
|
|
42
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/render/review.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6D,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAC,MAAM,CAAC;IACd,MAAM,CAAC,EAAC,OAAO,CAAC;IAChB,mFAAmF;IACnF,SAAS,CAAC,EAAC,MAAM,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAC,MAAM,CAAC;IACjB,eAAe,CAAC,EAAC,SAAS;QAAC,CAAC,EAAC,MAAM,CAAC;QAAA,CAAC,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;CACjD;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,MAAM,EAAC,OAAO,GAAC,iBAAoB,GAAE,OAAO,CAAC,MAAM,CAAC,CAoB7H;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,cAAc,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,SAAS,MAAM,EAAE,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CAsB5J;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,MAAM,EAAC,IAAI,EAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAA;CAAC,EAAC,KAAK,CAAC,EAAC,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,CAWvJ;AAED,MAAM,WAAW,eAAe;IAAE,OAAO,EAAC,MAAM,CAAC;IAAA,KAAK,CAAC,EAAC,MAAM,CAAC;IAAA,QAAQ,CAAC,EAAC,SAAS,MAAM,EAAE,CAAC;IAAA,IAAI,CAAC,EAAC,MAAM,CAAC;IAAA,OAAO,CAAC,EAAC,MAAM,CAAA;CAAC;AAExH,wBAAsB,eAAe,CAAC,MAAM,EAAC,YAAY,EAAC,OAAO,EAAC,SAAS,eAAe,EAAE,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,EAAC,OAAO,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CA8BzJ;AAED,8FAA8F;AAC9F,wBAAsB,gBAAgB,CAAC,MAAM,EAAC,YAAY,EAAC,MAAM,EAAC,SAAS,MAAM,EAAE,EAAC,OAAO,GAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAC;IAAA,cAAc,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CAwBvJ"}
|