@flighthq/displayobject-canvas 0.1.0
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/dist/canvasBackground.d.ts +3 -0
- package/dist/canvasBackground.d.ts.map +1 -0
- package/dist/canvasBackground.js +19 -0
- package/dist/canvasBackground.js.map +1 -0
- package/dist/canvasBitmap.d.ts +4 -0
- package/dist/canvasBitmap.d.ts.map +1 -0
- package/dist/canvasBitmap.js +32 -0
- package/dist/canvasBitmap.js.map +1 -0
- package/dist/canvasCSSFilterBinding.d.ts +24 -0
- package/dist/canvasCSSFilterBinding.d.ts.map +1 -0
- package/dist/canvasCSSFilterBinding.js +43 -0
- package/dist/canvasCSSFilterBinding.js.map +1 -0
- package/dist/canvasCache.d.ts +33 -0
- package/dist/canvasCache.d.ts.map +1 -0
- package/dist/canvasCache.js +141 -0
- package/dist/canvasCache.js.map +1 -0
- package/dist/canvasClip.d.ts +3 -0
- package/dist/canvasClip.d.ts.map +1 -0
- package/dist/canvasClip.js +38 -0
- package/dist/canvasClip.js.map +1 -0
- package/dist/canvasClipRectangle.d.ts +5 -0
- package/dist/canvasClipRectangle.d.ts.map +1 -0
- package/dist/canvasClipRectangle.js +31 -0
- package/dist/canvasClipRectangle.js.map +1 -0
- package/dist/canvasDisplayObject.d.ts +5 -0
- package/dist/canvasDisplayObject.d.ts.map +1 -0
- package/dist/canvasDisplayObject.js +46 -0
- package/dist/canvasDisplayObject.js.map +1 -0
- package/dist/canvasElement.d.ts +2 -0
- package/dist/canvasElement.d.ts.map +1 -0
- package/dist/canvasElement.js +9 -0
- package/dist/canvasElement.js.map +1 -0
- package/dist/canvasFillPattern.d.ts +4 -0
- package/dist/canvasFillPattern.d.ts.map +1 -0
- package/dist/canvasFillPattern.js +108 -0
- package/dist/canvasFillPattern.js.map +1 -0
- package/dist/canvasMaterialRegistry.d.ts +6 -0
- package/dist/canvasMaterialRegistry.d.ts.map +1 -0
- package/dist/canvasMaterialRegistry.js +42 -0
- package/dist/canvasMaterialRegistry.js.map +1 -0
- package/dist/canvasMaterials.d.ts +5 -0
- package/dist/canvasMaterials.d.ts.map +1 -0
- package/dist/canvasMaterials.js +33 -0
- package/dist/canvasMaterials.js.map +1 -0
- package/dist/canvasParticleEmitter.d.ts +4 -0
- package/dist/canvasParticleEmitter.d.ts.map +1 -0
- package/dist/canvasParticleEmitter.js +64 -0
- package/dist/canvasParticleEmitter.js.map +1 -0
- package/dist/canvasQuadBatch.d.ts +4 -0
- package/dist/canvasQuadBatch.d.ts.map +1 -0
- package/dist/canvasQuadBatch.js +64 -0
- package/dist/canvasQuadBatch.js.map +1 -0
- package/dist/canvasRegistration.d.ts +4 -0
- package/dist/canvasRegistration.d.ts.map +1 -0
- package/dist/canvasRegistration.js +39 -0
- package/dist/canvasRegistration.js.map +1 -0
- package/dist/canvasRenderState.d.ts +5 -0
- package/dist/canvasRenderState.d.ts.map +1 -0
- package/dist/canvasRenderState.js +44 -0
- package/dist/canvasRenderState.js.map +1 -0
- package/dist/canvasRenderTarget.d.ts +16 -0
- package/dist/canvasRenderTarget.d.ts.map +1 -0
- package/dist/canvasRenderTarget.js +66 -0
- package/dist/canvasRenderTarget.js.map +1 -0
- package/dist/canvasRichText.d.ts +7 -0
- package/dist/canvasRichText.d.ts.map +1 -0
- package/dist/canvasRichText.js +127 -0
- package/dist/canvasRichText.js.map +1 -0
- package/dist/canvasScale9Mapper.d.ts +10 -0
- package/dist/canvasScale9Mapper.d.ts.map +1 -0
- package/dist/canvasScale9Mapper.js +148 -0
- package/dist/canvasScale9Mapper.js.map +1 -0
- package/dist/canvasScale9Shape.d.ts +5 -0
- package/dist/canvasScale9Shape.d.ts.map +1 -0
- package/dist/canvasScale9Shape.js +156 -0
- package/dist/canvasScale9Shape.js.map +1 -0
- package/dist/canvasShape.d.ts +5 -0
- package/dist/canvasShape.d.ts.map +1 -0
- package/dist/canvasShape.js +79 -0
- package/dist/canvasShape.js.map +1 -0
- package/dist/canvasShapeCommands.d.ts +19 -0
- package/dist/canvasShapeCommands.d.ts.map +1 -0
- package/dist/canvasShapeCommands.js +352 -0
- package/dist/canvasShapeCommands.js.map +1 -0
- package/dist/canvasShapeRegistry.d.ts +5 -0
- package/dist/canvasShapeRegistry.d.ts.map +1 -0
- package/dist/canvasShapeRegistry.js +17 -0
- package/dist/canvasShapeRegistry.js.map +1 -0
- package/dist/canvasSprite.d.ts +5 -0
- package/dist/canvasSprite.d.ts.map +1 -0
- package/dist/canvasSprite.js +59 -0
- package/dist/canvasSprite.js.map +1 -0
- package/dist/canvasTextInput.d.ts +4 -0
- package/dist/canvasTextInput.d.ts.map +1 -0
- package/dist/canvasTextInput.js +67 -0
- package/dist/canvasTextInput.js.map +1 -0
- package/dist/canvasTextLabel.d.ts +4 -0
- package/dist/canvasTextLabel.d.ts.map +1 -0
- package/dist/canvasTextLabel.js +55 -0
- package/dist/canvasTextLabel.js.map +1 -0
- package/dist/canvasTextMeasure.d.ts +3 -0
- package/dist/canvasTextMeasure.d.ts.map +1 -0
- package/dist/canvasTextMeasure.js +15 -0
- package/dist/canvasTextMeasure.js.map +1 -0
- package/dist/canvasTilemap.d.ts +4 -0
- package/dist/canvasTilemap.d.ts.map +1 -0
- package/dist/canvasTilemap.js +50 -0
- package/dist/canvasTilemap.js.map +1 -0
- package/dist/canvasTransform.d.ts +3 -0
- package/dist/canvasTransform.d.ts.map +1 -0
- package/dist/canvasTransform.js +9 -0
- package/dist/canvasTransform.js.map +1 -0
- package/dist/canvasVideo.d.ts +4 -0
- package/dist/canvasVideo.d.ts.map +1 -0
- package/dist/canvasVideo.js +26 -0
- package/dist/canvasVideo.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
- package/src/canvasBackground.test.ts +65 -0
- package/src/canvasBitmap.test.ts +92 -0
- package/src/canvasCSSFilterBinding.test.ts +86 -0
- package/src/canvasCache.test.ts +189 -0
- package/src/canvasClip.test.ts +12 -0
- package/src/canvasClipRectangle.test.ts +101 -0
- package/src/canvasDisplayObject.test.ts +117 -0
- package/src/canvasElement.test.ts +21 -0
- package/src/canvasFillPattern.test.ts +96 -0
- package/src/canvasMaterialRegistry.test.ts +69 -0
- package/src/canvasMaterials.test.ts +85 -0
- package/src/canvasParticleEmitter.test.ts +105 -0
- package/src/canvasQuadBatch.test.ts +119 -0
- package/src/canvasRegistration.test.ts +57 -0
- package/src/canvasRenderState.test.ts +186 -0
- package/src/canvasRenderTarget.test.ts +154 -0
- package/src/canvasRichText.test.ts +89 -0
- package/src/canvasScale9Mapper.test.ts +53 -0
- package/src/canvasScale9Shape.test.ts +89 -0
- package/src/canvasShape.test.ts +183 -0
- package/src/canvasShapeCommands.test.ts +448 -0
- package/src/canvasShapeRegistry.test.ts +42 -0
- package/src/canvasSprite.test.ts +90 -0
- package/src/canvasTextInput.test.ts +67 -0
- package/src/canvasTextLabel.test.ts +32 -0
- package/src/canvasTextMeasure.test.ts +9 -0
- package/src/canvasTilemap.test.ts +69 -0
- package/src/canvasTransform.test.ts +42 -0
- package/src/canvasVideo.test.ts +43 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
+
// Flash's gradient box is normalized to ±819.2 units.
|
|
3
|
+
const GRADIENT_HALF = 819.2;
|
|
4
|
+
export function createBitmapPattern(context, bitmap, repeat, smooth = false) {
|
|
5
|
+
if (bitmap.source === null)
|
|
6
|
+
return null;
|
|
7
|
+
setSmoothing(context, smooth);
|
|
8
|
+
return context.createPattern(bitmap.source, repeat ? 'repeat' : 'no-repeat');
|
|
9
|
+
}
|
|
10
|
+
export function createGradientPattern(context, gradientType, colors, alphas, ratios, m, spreadMethod, _interpolationMethod, focalPointRatio) {
|
|
11
|
+
const mat = m ?? IDENTITY;
|
|
12
|
+
if (gradientType === 'radial') {
|
|
13
|
+
return createRadialGradient(context, colors, alphas, ratios, mat, focalPointRatio);
|
|
14
|
+
}
|
|
15
|
+
return createLinearGradient(context, colors, alphas, ratios, mat, spreadMethod);
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Private helpers
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const IDENTITY = createMatrix();
|
|
21
|
+
function tp(m, x, y) {
|
|
22
|
+
return [m.a * x + m.c * y + m.tx, m.b * x + m.d * y + m.ty];
|
|
23
|
+
}
|
|
24
|
+
function addColorStops(gradient, colors, alphas, ratios) {
|
|
25
|
+
for (let i = 0; i < colors.length; i++) {
|
|
26
|
+
const ratio = Math.max(0, Math.min(1, ratios[i] / 0xff));
|
|
27
|
+
gradient.addColorStop(ratio, rgbaString(colors[i], alphas[i]));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function createRadialGradient(context, colors, alphas, ratios, m, focalPointRatio) {
|
|
31
|
+
const clampedFocal = Math.max(-1, Math.min(1, focalPointRatio));
|
|
32
|
+
const [fx, fy] = tp(m, clampedFocal * GRADIENT_HALF, 0);
|
|
33
|
+
const [cx, cy] = tp(m, 0, 0);
|
|
34
|
+
const [ex, ey] = tp(m, GRADIENT_HALF, 0);
|
|
35
|
+
const dx = ex - cx;
|
|
36
|
+
const dy = ey - cy;
|
|
37
|
+
const radius = Math.sqrt(dx * dx + dy * dy);
|
|
38
|
+
const gradient = context.createRadialGradient(fx, fy, 0, cx, cy, radius);
|
|
39
|
+
addColorStops(gradient, colors, alphas, ratios);
|
|
40
|
+
return gradient;
|
|
41
|
+
}
|
|
42
|
+
function createLinearGradient(context, colors, alphas, ratios, m, spreadMethod) {
|
|
43
|
+
if (spreadMethod === 'pad') {
|
|
44
|
+
const [x1, y1] = tp(m, -GRADIENT_HALF, 0);
|
|
45
|
+
const [x2, y2] = tp(m, GRADIENT_HALF, 0);
|
|
46
|
+
const gradient = context.createLinearGradient(x1, y1, x2, y2);
|
|
47
|
+
addColorStops(gradient, colors, alphas, ratios);
|
|
48
|
+
return gradient;
|
|
49
|
+
}
|
|
50
|
+
// reflect / repeat: tile the gradient across 25 repetitions using an
|
|
51
|
+
// offscreen canvas, then return a pattern from it.
|
|
52
|
+
const STEPS = 25;
|
|
53
|
+
const step = 1 / STEPS;
|
|
54
|
+
const [x1, y1] = tp(m, -GRADIENT_HALF, 0);
|
|
55
|
+
const [x2, y2] = tp(m, GRADIENT_HALF, 0);
|
|
56
|
+
const dx = x2 - x1;
|
|
57
|
+
const dy = y2 - y1;
|
|
58
|
+
const offscreen = document.createElement('canvas');
|
|
59
|
+
offscreen.width = context.canvas.width;
|
|
60
|
+
offscreen.height = context.canvas.height;
|
|
61
|
+
const octx = offscreen.getContext('2d');
|
|
62
|
+
if (octx === null)
|
|
63
|
+
return null;
|
|
64
|
+
const tiledGradient = octx.createLinearGradient(x1 - dx * ((STEPS - 1) / 2), y1 - dy * ((STEPS - 1) / 2), x2 + dx * ((STEPS - 1) / 2), y2 + dy * ((STEPS - 1) / 2));
|
|
65
|
+
if (spreadMethod === 'reflect') {
|
|
66
|
+
let t = 0;
|
|
67
|
+
while (t < 1) {
|
|
68
|
+
for (let i = 0; i < colors.length; i++) {
|
|
69
|
+
const ratio = Math.max(0, Math.min(1, t + (ratios[i] / 0xff) * step));
|
|
70
|
+
tiledGradient.addColorStop(ratio, rgbaString(colors[i], alphas[i]));
|
|
71
|
+
}
|
|
72
|
+
t += step;
|
|
73
|
+
for (let i = colors.length - 1; i >= 0; i--) {
|
|
74
|
+
const ratio = Math.max(0, Math.min(1, t + (1 - ratios[i] / 0xff) * step));
|
|
75
|
+
tiledGradient.addColorStop(ratio, rgbaString(colors[i], alphas[i]));
|
|
76
|
+
}
|
|
77
|
+
t += step;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
let t = 0;
|
|
82
|
+
while (t < 1) {
|
|
83
|
+
for (let i = 0; i < colors.length; i++) {
|
|
84
|
+
const ratio = Math.max(0, Math.min(1 - 0.001, t + (ratios[i] / 0xff) * step));
|
|
85
|
+
tiledGradient.addColorStop(ratio, rgbaString(colors[i], alphas[i]));
|
|
86
|
+
}
|
|
87
|
+
const seam = Math.max(0, Math.min(1, t + 0.001));
|
|
88
|
+
tiledGradient.addColorStop(seam - 0.001, rgbaString(colors[colors.length - 1], alphas[alphas.length - 1]));
|
|
89
|
+
tiledGradient.addColorStop(seam, rgbaString(colors[0], alphas[0]));
|
|
90
|
+
t += step;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
octx.fillStyle = tiledGradient;
|
|
94
|
+
octx.fillRect(0, 0, offscreen.width, offscreen.height);
|
|
95
|
+
return context.createPattern(offscreen, 'no-repeat');
|
|
96
|
+
}
|
|
97
|
+
function setSmoothing(context, smooth) {
|
|
98
|
+
if (context.imageSmoothingEnabled !== smooth) {
|
|
99
|
+
context.imageSmoothingEnabled = smooth;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function rgbaString(color, alpha) {
|
|
103
|
+
const r = (color >> 16) & 0xff;
|
|
104
|
+
const g = (color >> 8) & 0xff;
|
|
105
|
+
const b = color & 0xff;
|
|
106
|
+
return `rgba(${r},${g},${b},${alpha})`;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=canvasFillPattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasFillPattern.js","sourceRoot":"","sources":["../src/canvasFillPattern.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CanvasMaterialRenderer, CanvasRenderState, Kind, Material } from '@flighthq/types';
|
|
2
|
+
export declare function applyCanvasMaterial(state: CanvasRenderState, material: Material | null): boolean;
|
|
3
|
+
export declare function getCanvasMaterialRenderer(state: CanvasRenderState, kind: Kind): CanvasMaterialRenderer | null;
|
|
4
|
+
export declare function registerCanvasMaterialRenderer(state: CanvasRenderState, kind: Kind, renderer: CanvasMaterialRenderer): void;
|
|
5
|
+
export declare function resolveCanvasMaterialRenderer(state: CanvasRenderState, material: Material | null): CanvasMaterialRenderer | null;
|
|
6
|
+
//# sourceMappingURL=canvasMaterialRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasMaterialRegistry.d.ts","sourceRoot":"","sources":["../src/canvasMaterialRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQjG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAUhG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,GAAG,sBAAsB,GAAG,IAAI,CAE7G;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,sBAAsB,GAC/B,IAAI,CAGN;AAKD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,QAAQ,GAAG,IAAI,GACxB,sBAAsB,GAAG,IAAI,CAQ/B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { DefaultMaterialKind } from '@flighthq/types';
|
|
2
|
+
import { getCanvasRenderStateRuntime } from './canvasRenderState';
|
|
3
|
+
// Applies a node's material draw-state delta before a canvas draw, bracketed with ctx.save().
|
|
4
|
+
// Returns true when it saved and the caller must ctx.restore() after drawing; false (no save) when
|
|
5
|
+
// there is no material or no registered renderer, so the common path pays nothing.
|
|
6
|
+
export function applyCanvasMaterial(state, material) {
|
|
7
|
+
if (material === null)
|
|
8
|
+
return false;
|
|
9
|
+
const renderer = resolveCanvasMaterialRenderer(state, material);
|
|
10
|
+
if (renderer === null)
|
|
11
|
+
return false;
|
|
12
|
+
const drawState = renderer.getState(material);
|
|
13
|
+
const context = state.context;
|
|
14
|
+
context.save();
|
|
15
|
+
if (drawState.composite !== undefined)
|
|
16
|
+
context.globalCompositeOperation = drawState.composite;
|
|
17
|
+
if (drawState.filter !== undefined)
|
|
18
|
+
context.filter = drawState.filter;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
export function getCanvasMaterialRenderer(state, kind) {
|
|
22
|
+
return getCanvasRenderStateRuntime(state).materialRendererMap?.get(kind) ?? null;
|
|
23
|
+
}
|
|
24
|
+
export function registerCanvasMaterialRenderer(state, kind, renderer) {
|
|
25
|
+
const runtime = getCanvasRenderStateRuntime(state);
|
|
26
|
+
(runtime.materialRendererMap ??= new Map()).set(kind, renderer);
|
|
27
|
+
}
|
|
28
|
+
// Resolves a node's material to its Canvas renderer, else the registered default, else null.
|
|
29
|
+
// Unlike Gl there is no built-in fallback: a null result means "draw normally", since the
|
|
30
|
+
// canvas renderer already performs the draw and a material only contributes extra draw state.
|
|
31
|
+
export function resolveCanvasMaterialRenderer(state, material) {
|
|
32
|
+
const map = getCanvasRenderStateRuntime(state).materialRendererMap;
|
|
33
|
+
if (map === undefined)
|
|
34
|
+
return null;
|
|
35
|
+
if (material !== null) {
|
|
36
|
+
const renderer = map.get(material.kind);
|
|
37
|
+
if (renderer !== undefined)
|
|
38
|
+
return renderer;
|
|
39
|
+
}
|
|
40
|
+
return map.get(DefaultMaterialKind) ?? null;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=canvasMaterialRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasMaterialRegistry.js","sourceRoot":"","sources":["../src/canvasMaterialRegistry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,8FAA8F;AAC9F,mGAAmG;AACnG,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,KAAwB,EAAE,QAAyB;IACrF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,6BAA6B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,SAAS,CAAC;IAC9F,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAwB,EAAE,IAAU;IAC5E,OAAO,2BAA2B,CAAC,KAAK,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,IAAU,EACV,QAAgC;IAEhC,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,OAAO,CAAC,mBAAmB,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,6FAA6F;AAC7F,0FAA0F;AAC1F,8FAA8F;AAC9F,MAAM,UAAU,6BAA6B,CAC3C,KAAwB,EACxB,QAAyB;IAEzB,MAAM,GAAG,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC;IACnE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CanvasRenderState } from '@flighthq/types';
|
|
2
|
+
import { BlendMode } from '@flighthq/types';
|
|
3
|
+
export declare function applyCanvasBlendMode(state: CanvasRenderState, value: BlendMode | null): void;
|
|
4
|
+
export declare function enableCanvasBlendMode(state: CanvasRenderState): void;
|
|
5
|
+
//# sourceMappingURL=canvasMaterials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasMaterials.d.ts","sourceRoot":"","sources":["../src/canvasMaterials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAyB5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAEpE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BlendMode } from '@flighthq/types';
|
|
2
|
+
import { getCanvasRenderStateRuntime } from './canvasRenderState';
|
|
3
|
+
// Auditable map from a blend-mode intent to the Canvas2D globalCompositeOperation
|
|
4
|
+
// that realizes it. `null` means there is no faithful Canvas2D equivalent, so the
|
|
5
|
+
// mode degrades to normal ('source-over') compositing.
|
|
6
|
+
const CANVAS_BLEND_MODE = {
|
|
7
|
+
[BlendMode.Add]: 'lighter',
|
|
8
|
+
[BlendMode.Alpha]: 'destination-in',
|
|
9
|
+
[BlendMode.Darken]: 'darken',
|
|
10
|
+
[BlendMode.Difference]: 'difference',
|
|
11
|
+
[BlendMode.Erase]: 'destination-out',
|
|
12
|
+
[BlendMode.Hardlight]: 'hard-light',
|
|
13
|
+
[BlendMode.Invert]: null,
|
|
14
|
+
[BlendMode.Layer]: 'source-over',
|
|
15
|
+
[BlendMode.Lighten]: 'lighten',
|
|
16
|
+
[BlendMode.Multiply]: 'multiply',
|
|
17
|
+
[BlendMode.Normal]: 'source-over',
|
|
18
|
+
[BlendMode.Overlay]: 'overlay',
|
|
19
|
+
[BlendMode.Screen]: 'screen',
|
|
20
|
+
[BlendMode.Shader]: null,
|
|
21
|
+
[BlendMode.Subtract]: null,
|
|
22
|
+
};
|
|
23
|
+
export function applyCanvasBlendMode(state, value) {
|
|
24
|
+
const runtime = getCanvasRenderStateRuntime(state);
|
|
25
|
+
if (value === runtime.currentBlendMode)
|
|
26
|
+
return;
|
|
27
|
+
runtime.currentBlendMode = value;
|
|
28
|
+
state.context.globalCompositeOperation = (value !== null ? CANVAS_BLEND_MODE[value] : null) ?? 'source-over';
|
|
29
|
+
}
|
|
30
|
+
export function enableCanvasBlendMode(state) {
|
|
31
|
+
state.applyBlendMode = applyCanvasBlendMode;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=canvasMaterials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasMaterials.js","sourceRoot":"","sources":["../src/canvasMaterials.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAElE,kFAAkF;AAClF,kFAAkF;AAClF,uDAAuD;AACvD,MAAM,iBAAiB,GAAuD;IAC5E,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,SAAS;IAC1B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,gBAAgB;IACnC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY;IACpC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,iBAAiB;IACpC,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,YAAY;IACnC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;IACxB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,aAAa;IAChC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU;IAChC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa;IACjC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS;IAC9B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC5B,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;IACxB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI;CAC3B,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAwB,EAAE,KAAuB;IACpF,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,KAAK,KAAK,OAAO,CAAC,gBAAgB;QAAE,OAAO;IAC/C,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,wBAAwB,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,KAAK,CAAC,cAAc,GAAG,oBAAoB,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderState, RenderProxy2D, SpriteRenderer } from '@flighthq/types';
|
|
2
|
+
export declare function drawCanvasParticleEmitter(state: CanvasRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultCanvasParticleEmitterRenderer: SpriteRenderer;
|
|
4
|
+
//# sourceMappingURL=canvasParticleEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasParticleEmitter.d.ts","sourceRoot":"","sources":["../src/canvasParticleEmitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMzG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAuDpG;AAED,eAAO,MAAM,oCAAoC,EAAE,cAGlD,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { noopRendererData } from '@flighthq/render';
|
|
2
|
+
// Canvas 2D does not support per-pixel color multiplication, so only alpha
|
|
3
|
+
// and transform (position, rotation, scale) are applied. Color tint values
|
|
4
|
+
// from the emitter config are silently ignored. Use the Gl renderer for
|
|
5
|
+
// full color-over-lifetime support.
|
|
6
|
+
export function drawCanvasParticleEmitter(state, renderProxy) {
|
|
7
|
+
const source = renderProxy.source;
|
|
8
|
+
const { atlas, alphas, ids, particleCount, transforms } = source.data;
|
|
9
|
+
if (atlas === null || atlas.image === null || atlas.image.source === null || particleCount === 0)
|
|
10
|
+
return;
|
|
11
|
+
const regions = atlas.regions;
|
|
12
|
+
const numRegions = regions.length;
|
|
13
|
+
const nodeAlpha = renderProxy.alpha;
|
|
14
|
+
const t = renderProxy.transform2D;
|
|
15
|
+
const imageSource = atlas.image.source;
|
|
16
|
+
const context = state.context;
|
|
17
|
+
state.applyBlendMode?.(state, renderProxy.blendMode);
|
|
18
|
+
if (!state.allowSmoothing)
|
|
19
|
+
context.imageSmoothingEnabled = false;
|
|
20
|
+
for (let i = 0; i < particleCount; i++) {
|
|
21
|
+
const id = ids[i];
|
|
22
|
+
if (id < 0 || id >= numRegions)
|
|
23
|
+
continue;
|
|
24
|
+
const region = regions[id];
|
|
25
|
+
if (region.width <= 0 || region.height <= 0)
|
|
26
|
+
continue;
|
|
27
|
+
const tt = i * 4;
|
|
28
|
+
const px = transforms[tt];
|
|
29
|
+
const py = transforms[tt + 1];
|
|
30
|
+
const rotation = transforms[tt + 2];
|
|
31
|
+
const scale = transforms[tt + 3];
|
|
32
|
+
// Build world matrix. In world-space mode particle positions are already in
|
|
33
|
+
// world (pixel) space, so we skip the node transform.
|
|
34
|
+
const cosR = Math.cos(rotation) * scale;
|
|
35
|
+
const sinR = Math.sin(rotation) * scale;
|
|
36
|
+
let a, b, c, d, tx, ty;
|
|
37
|
+
if (source.data.worldSpace) {
|
|
38
|
+
a = cosR;
|
|
39
|
+
b = sinR;
|
|
40
|
+
c = -sinR;
|
|
41
|
+
d = cosR;
|
|
42
|
+
tx = px;
|
|
43
|
+
ty = py;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
a = t.a * cosR + t.c * sinR;
|
|
47
|
+
b = t.b * cosR + t.d * sinR;
|
|
48
|
+
c = t.a * -sinR + t.c * cosR;
|
|
49
|
+
d = t.b * -sinR + t.d * cosR;
|
|
50
|
+
tx = t.a * px + t.c * py + t.tx;
|
|
51
|
+
ty = t.b * px + t.d * py + t.ty;
|
|
52
|
+
}
|
|
53
|
+
context.globalAlpha = nodeAlpha * alphas[i];
|
|
54
|
+
context.setTransform(a, b, c, d, tx, ty);
|
|
55
|
+
context.drawImage(imageSource, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
|
|
56
|
+
}
|
|
57
|
+
if (!state.allowSmoothing)
|
|
58
|
+
context.imageSmoothingEnabled = true;
|
|
59
|
+
}
|
|
60
|
+
export const defaultCanvasParticleEmitterRenderer = {
|
|
61
|
+
createData: noopRendererData,
|
|
62
|
+
submit: drawCanvasParticleEmitter,
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=canvasParticleEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasParticleEmitter.js","sourceRoot":"","sources":["../src/canvasParticleEmitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderState, RenderProxy2D, SpriteRenderer } from '@flighthq/types';
|
|
2
|
+
export declare function drawCanvasQuadBatch(state: CanvasRenderState, quadBatch: RenderProxy2D): void;
|
|
3
|
+
export declare const defaultCanvasQuadBatchRenderer: SpriteRenderer;
|
|
4
|
+
//# sourceMappingURL=canvasQuadBatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasQuadBatch.d.ts","sourceRoot":"","sources":["../src/canvasQuadBatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAa,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAInG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,CAqF5F;AAED,eAAO,MAAM,8BAA8B,EAAE,cAG5C,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { acquireMatrix, multiplyMatrix, releaseMatrix, setMatrixFromFloat32Array } from '@flighthq/geometry';
|
|
2
|
+
import { noopRendererData } from '@flighthq/render';
|
|
3
|
+
import { applyCanvasMaterial } from './canvasMaterialRegistry';
|
|
4
|
+
export function drawCanvasQuadBatch(state, quadBatch) {
|
|
5
|
+
const source = quadBatch.source;
|
|
6
|
+
const data = source.data;
|
|
7
|
+
const { atlas, instanceCount, ids, transforms } = data;
|
|
8
|
+
if (atlas === null || atlas.image === null || atlas.image.source === null || instanceCount === 0)
|
|
9
|
+
return;
|
|
10
|
+
state.applyBlendMode?.(state, quadBatch.blendMode);
|
|
11
|
+
const context = state.context;
|
|
12
|
+
const image = atlas.image.source;
|
|
13
|
+
const regions = atlas.regions;
|
|
14
|
+
const numRegions = regions.length;
|
|
15
|
+
const transform = quadBatch.transform2D;
|
|
16
|
+
const roundPixels = state.roundPixels;
|
|
17
|
+
const quadTransform = acquireMatrix();
|
|
18
|
+
const stride = data.transformType === 'vector2' ? 2 : 6;
|
|
19
|
+
context.globalAlpha = quadBatch.alpha;
|
|
20
|
+
if (!state.allowSmoothing /*|| !quadBatch.smoothing*/) {
|
|
21
|
+
context.imageSmoothingEnabled = false;
|
|
22
|
+
}
|
|
23
|
+
const restoreMaterial = applyCanvasMaterial(state, quadBatch.material);
|
|
24
|
+
context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);
|
|
25
|
+
for (let i = 0; i < instanceCount; i++) {
|
|
26
|
+
const id = ids[i];
|
|
27
|
+
if (id < 0 || id >= numRegions)
|
|
28
|
+
continue;
|
|
29
|
+
const region = regions[id];
|
|
30
|
+
if (region.width <= 0 || region.height <= 0) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const offset = i * stride;
|
|
34
|
+
if (stride === 2) {
|
|
35
|
+
const dx = transforms[offset];
|
|
36
|
+
const dy = transforms[offset + 1];
|
|
37
|
+
context.drawImage(image, region.x, region.y, region.width, region.height, roundPixels ? dx | 0 : dx, roundPixels ? dy | 0 : dy, region.width, region.height);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
setMatrixFromFloat32Array(quadTransform, offset, transforms);
|
|
41
|
+
multiplyMatrix(quadTransform, transform, quadTransform);
|
|
42
|
+
if (roundPixels) {
|
|
43
|
+
quadTransform.tx = Math.round(quadTransform.tx);
|
|
44
|
+
quadTransform.ty = Math.round(quadTransform.ty);
|
|
45
|
+
}
|
|
46
|
+
context.setTransform(quadTransform.a, quadTransform.b, quadTransform.c, quadTransform.d, quadTransform.tx, quadTransform.ty);
|
|
47
|
+
context.drawImage(image, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (restoreMaterial)
|
|
51
|
+
context.restore();
|
|
52
|
+
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
53
|
+
releaseMatrix(quadTransform);
|
|
54
|
+
if (!state.allowSmoothing /*|| !quadBatch.smoothing*/) {
|
|
55
|
+
context.imageSmoothingEnabled = true;
|
|
56
|
+
}
|
|
57
|
+
// popClip(state);
|
|
58
|
+
// rectanglePool.releaseMatrix(rect);
|
|
59
|
+
}
|
|
60
|
+
export const defaultCanvasQuadBatchRenderer = {
|
|
61
|
+
createData: noopRendererData,
|
|
62
|
+
submit: drawCanvasQuadBatch,
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=canvasQuadBatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasQuadBatch.js","sourceRoot":"","sources":["../src/canvasQuadBatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,KAAwB,EAAE,SAAwB;IACpF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAmB,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACvD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,aAAa,KAAK,CAAC;QAAE,OAAO;IAEzG,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC;IACxC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IAEtC,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;IAEtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,2BAA2B,EAAE,CAAC;QACtD,OAAO,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACxC,CAAC;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAErG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU;YAAE,SAAS;QAEzC,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;QAC1B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,SAAS,CACf,KAAK,EACL,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,CAAC,EACR,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,EACb,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EACzB,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EACzB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,CACd,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC7D,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YAExD,IAAI,WAAW,EAAE,CAAC;gBAChB,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBAChD,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,OAAO,CAAC,YAAY,CAClB,aAAa,CAAC,CAAC,EACf,aAAa,CAAC,CAAC,EACf,aAAa,CAAC,CAAC,EACf,aAAa,CAAC,CAAC,EACf,aAAa,CAAC,EAAE,EAChB,aAAa,CAAC,EAAE,CACjB,CAAC;YAEF,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED,IAAI,eAAe;QAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAEvC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,aAAa,CAAC,aAAa,CAAC,CAAC;IAE7B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,2BAA2B,EAAE,CAAC;QACtD,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,kBAAkB;IAClB,qCAAqC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAmB;IAC5D,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,mBAAmB;CAC5B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderState, Kind, Renderer } from '@flighthq/types';
|
|
2
|
+
export declare const canvasDisplayObjectRendererEntries: ReadonlyArray<readonly [Kind, Renderer]>;
|
|
3
|
+
export declare function registerCanvasDisplayObjectRenderers(state: CanvasRenderState): void;
|
|
4
|
+
//# sourceMappingURL=canvasRegistration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRegistration.d.ts","sourceRoot":"","sources":["../src/canvasRegistration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA8BzE,eAAO,MAAM,kCAAkC,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAYvF,CAAC;AAMF,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAInF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { registerRenderer } from '@flighthq/render';
|
|
2
|
+
import { BitmapKind, DisplayObjectKind, ParticleEmitterKind, QuadBatchKind, RichTextKind, Scale9ShapeKind, ShapeKind, SpriteKind, TextLabelKind, TilemapKind, VideoKind, } from '@flighthq/types';
|
|
3
|
+
import { defaultCanvasBitmapRenderer } from './canvasBitmap';
|
|
4
|
+
import { defaultCanvasDisplayObjectRenderer } from './canvasDisplayObject';
|
|
5
|
+
import { defaultCanvasParticleEmitterRenderer } from './canvasParticleEmitter';
|
|
6
|
+
import { defaultCanvasQuadBatchRenderer } from './canvasQuadBatch';
|
|
7
|
+
import { defaultCanvasRichTextRenderer } from './canvasRichText';
|
|
8
|
+
import { defaultCanvasScale9ShapeRenderer } from './canvasScale9Shape';
|
|
9
|
+
import { defaultCanvasShapeRenderer } from './canvasShape';
|
|
10
|
+
import { defaultCanvasSpriteRenderer } from './canvasSprite';
|
|
11
|
+
import { defaultCanvasTextLabelRenderer } from './canvasTextLabel';
|
|
12
|
+
import { defaultCanvasTilemapRenderer } from './canvasTilemap';
|
|
13
|
+
import { defaultCanvasVideoRenderer } from './canvasVideo';
|
|
14
|
+
// Ordered list of [kind, renderer] pairs for every 2D display-object kind the Canvas backend
|
|
15
|
+
// supports. Exported as a data array so GL/WGPU backends can mirror the same shape without
|
|
16
|
+
// hardcoding the full kind list independently.
|
|
17
|
+
export const canvasDisplayObjectRendererEntries = [
|
|
18
|
+
[BitmapKind, defaultCanvasBitmapRenderer],
|
|
19
|
+
[DisplayObjectKind, defaultCanvasDisplayObjectRenderer],
|
|
20
|
+
[ParticleEmitterKind, defaultCanvasParticleEmitterRenderer],
|
|
21
|
+
[QuadBatchKind, defaultCanvasQuadBatchRenderer],
|
|
22
|
+
[RichTextKind, defaultCanvasRichTextRenderer],
|
|
23
|
+
[Scale9ShapeKind, defaultCanvasScale9ShapeRenderer],
|
|
24
|
+
[ShapeKind, defaultCanvasShapeRenderer],
|
|
25
|
+
[SpriteKind, defaultCanvasSpriteRenderer],
|
|
26
|
+
[TextLabelKind, defaultCanvasTextLabelRenderer],
|
|
27
|
+
[TilemapKind, defaultCanvasTilemapRenderer],
|
|
28
|
+
[VideoKind, defaultCanvasVideoRenderer],
|
|
29
|
+
];
|
|
30
|
+
// Registers every default Canvas 2D display-object renderer into `state` in one call,
|
|
31
|
+
// replacing the ~11 individual registerRenderer calls a consumer would otherwise need.
|
|
32
|
+
// Tree-shakable: importing this is the opt-in; unused renderers in the entries array
|
|
33
|
+
// will be eliminated by the bundler if canvasDisplayObjectRendererEntries itself is tree-shaken.
|
|
34
|
+
export function registerCanvasDisplayObjectRenderers(state) {
|
|
35
|
+
for (const [kind, renderer] of canvasDisplayObjectRendererEntries) {
|
|
36
|
+
registerRenderer(state, kind, renderer);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=canvasRegistration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRegistration.js","sourceRoot":"","sources":["../src/canvasRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,WAAW,EACX,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,oCAAoC,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,6FAA6F;AAC7F,2FAA2F;AAC3F,+CAA+C;AAC/C,MAAM,CAAC,MAAM,kCAAkC,GAA6C;IAC1F,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACzC,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;IACvD,CAAC,mBAAmB,EAAE,oCAAoC,CAAC;IAC3D,CAAC,aAAa,EAAE,8BAA8B,CAAC;IAC/C,CAAC,YAAY,EAAE,6BAA6B,CAAC;IAC7C,CAAC,eAAe,EAAE,gCAAgC,CAAC;IACnD,CAAC,SAAS,EAAE,0BAA0B,CAAC;IACvC,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACzC,CAAC,aAAa,EAAE,8BAA8B,CAAC;IAC/C,CAAC,WAAW,EAAE,4BAA4B,CAAC;IAC3C,CAAC,SAAS,EAAE,0BAA0B,CAAC;CACxC,CAAC;AAEF,sFAAsF;AACtF,uFAAuF;AACvF,qFAAqF;AACrF,iGAAiG;AACjG,MAAM,UAAU,oCAAoC,CAAC,KAAwB;IAC3E,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,kCAAkC,EAAE,CAAC;QAClE,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CanvasRenderOptions, CanvasRenderState, CanvasRenderStateRuntime } from '@flighthq/types';
|
|
2
|
+
export declare function createCanvasRenderState(canvas: HTMLCanvasElement, options?: Partial<CanvasRenderOptions>): CanvasRenderState;
|
|
3
|
+
export declare function createCanvasRenderStateRuntime(): CanvasRenderStateRuntime;
|
|
4
|
+
export declare function getCanvasRenderStateRuntime(state: CanvasRenderState): CanvasRenderStateRuntime;
|
|
5
|
+
//# sourceMappingURL=canvasRenderState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderState.d.ts","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAGxG,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,OAAO,CAAC,mBAAmB,CAAM,GACzC,iBAAiB,CA8BnB;AAMD,wBAAgB,8BAA8B,IAAI,wBAAwB,CAEzE;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,wBAAwB,CAE9F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
+
import { createRenderState as _createRenderState, createRenderStateRuntime, setRenderStateBackgroundColor, } from '@flighthq/render';
|
|
3
|
+
import { EntityRuntimeKey } from '@flighthq/types';
|
|
4
|
+
export function createCanvasRenderState(canvas, options = {}) {
|
|
5
|
+
const context = canvas.getContext('2d', options.contextAttributes || undefined);
|
|
6
|
+
if (!context)
|
|
7
|
+
throw new Error('Failed to get context for canvas.');
|
|
8
|
+
const state = _createRenderState({
|
|
9
|
+
pixelRatio: options.pixelRatio ?? 1,
|
|
10
|
+
renderTransform2D: options.renderTransform ?? createMatrix(),
|
|
11
|
+
roundPixels: options.roundPixels ?? false,
|
|
12
|
+
sceneGraphSyncPolicy: options.sceneGraphSyncPolicy,
|
|
13
|
+
});
|
|
14
|
+
if (options.backgroundColor != null)
|
|
15
|
+
setRenderStateBackgroundColor(state, options.backgroundColor);
|
|
16
|
+
// canvas/context/contextAttributes are readonly handles on the entity; written once here at the
|
|
17
|
+
// construction boundary.
|
|
18
|
+
state.applyBlendMode = null;
|
|
19
|
+
state.canvasCssFilterResolver = null;
|
|
20
|
+
state.canvas = canvas;
|
|
21
|
+
state.context = context;
|
|
22
|
+
state.contextAttributes = context.getContextAttributes();
|
|
23
|
+
const runtime = createCanvasRenderStateRuntime();
|
|
24
|
+
state[EntityRuntimeKey] = runtime;
|
|
25
|
+
runtime.currentBlendMode = null;
|
|
26
|
+
runtime.imageSmoothingEnabled = options.imageSmoothingEnabled ?? true;
|
|
27
|
+
runtime.imageSmoothingQuality = options.imageSmoothingQuality ?? 'high';
|
|
28
|
+
context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
|
|
29
|
+
context.imageSmoothingQuality = runtime.imageSmoothingQuality;
|
|
30
|
+
return state;
|
|
31
|
+
}
|
|
32
|
+
// Allocates the package-private 2D-canvas runtime for a CanvasRenderState. createCanvasRenderState
|
|
33
|
+
// attaches one to each state under EntityRuntimeKey and populates its fields;
|
|
34
|
+
// getCanvasRenderStateRuntime reads it back. The render path writes the returned object every frame,
|
|
35
|
+
// so the return is intentionally mutable (not Readonly).
|
|
36
|
+
export function createCanvasRenderStateRuntime() {
|
|
37
|
+
return createRenderStateRuntime();
|
|
38
|
+
}
|
|
39
|
+
// Resolves the package-private 2D-canvas runtime attached to a CanvasRenderState. Mutable by design:
|
|
40
|
+
// the render path writes its fields every frame.
|
|
41
|
+
export function getCanvasRenderStateRuntime(state) {
|
|
42
|
+
return state[EntityRuntimeKey];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=canvasRenderState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderState.js","sourceRoot":"","sources":["../src/canvasRenderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CACrC,MAAyB,EACzB,UAAwC,EAAE;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,iBAAiB,IAAI,SAAS,CAAC,CAAC;IAChF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;QACnC,iBAAiB,EAAE,OAAO,CAAC,eAAe,IAAI,YAAY,EAAE;QAC5D,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;KACnD,CAAsB,CAAC;IAExB,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI;QAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnG,gGAAgG;IAChG,yBAAyB;IACzB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACpC,KAAuC,CAAC,MAAM,GAAG,MAAM,CAAC;IACxD,KAA+C,CAAC,OAAO,GAAG,OAAO,CAAC;IAClE,KAAiE,CAAC,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEtH,MAAM,OAAO,GAAG,8BAA8B,EAAE,CAAC;IACjD,KAAK,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,IAAI,CAAC;IACtE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC;IAExE,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC9D,OAAO,CAAC,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mGAAmG;AACnG,8EAA8E;AAC9E,qGAAqG;AACrG,yDAAyD;AACzD,MAAM,UAAU,8BAA8B;IAC5C,OAAO,wBAAwB,EAA8B,CAAC;AAChE,CAAC;AAED,qGAAqG;AACrG,iDAAiD;AACjD,MAAM,UAAU,2BAA2B,CAAC,KAAwB;IAClE,OAAO,KAAK,CAAC,gBAAgB,CAA6B,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CanvasRenderState, CanvasRenderTarget, Matrix } from '@flighthq/types';
|
|
2
|
+
/**
|
|
3
|
+
* Redirects subsequent canvas rendering into `target`. Saves the state's current
|
|
4
|
+
* canvas, context, and renderTransform2D so they can be fully restored by
|
|
5
|
+
* `endCanvasRenderTarget`. Supports nesting — each begin/end pair is independent.
|
|
6
|
+
*/
|
|
7
|
+
export declare function beginCanvasRenderTarget(state: CanvasRenderState, target: CanvasRenderTarget, renderTransform: Readonly<Matrix>): void;
|
|
8
|
+
export declare function createCanvasRenderTarget(width: number, height: number): CanvasRenderTarget;
|
|
9
|
+
export declare function destroyCanvasRenderTarget(target: CanvasRenderTarget): void;
|
|
10
|
+
/**
|
|
11
|
+
* Restores the canvas, context, and renderTransform2D saved by the matching
|
|
12
|
+
* `beginCanvasRenderTarget` call.
|
|
13
|
+
*/
|
|
14
|
+
export declare function endCanvasRenderTarget(state: CanvasRenderState): void;
|
|
15
|
+
export declare function resizeCanvasRenderTarget(target: CanvasRenderTarget, width: number, height: number): void;
|
|
16
|
+
//# sourceMappingURL=canvasRenderTarget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderTarget.d.ts","sourceRoot":"","sources":["../src/canvasRenderTarget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAoBrF;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,kBAAkB,EAC1B,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,GAChC,IAAI,CA0BN;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAM1F;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAO1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAOpE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAKxG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { copyMatrix, createMatrix } from '@flighthq/geometry';
|
|
2
|
+
import { getCanvasRenderStateRuntime } from './canvasRenderState';
|
|
3
|
+
const _targetStack = new WeakMap();
|
|
4
|
+
/**
|
|
5
|
+
* Redirects subsequent canvas rendering into `target`. Saves the state's current
|
|
6
|
+
* canvas, context, and renderTransform2D so they can be fully restored by
|
|
7
|
+
* `endCanvasRenderTarget`. Supports nesting — each begin/end pair is independent.
|
|
8
|
+
*/
|
|
9
|
+
export function beginCanvasRenderTarget(state, target, renderTransform) {
|
|
10
|
+
const handles = state;
|
|
11
|
+
const runtime = getCanvasRenderStateRuntime(state);
|
|
12
|
+
let stack = _targetStack.get(state);
|
|
13
|
+
if (stack === undefined) {
|
|
14
|
+
stack = [];
|
|
15
|
+
_targetStack.set(state, stack);
|
|
16
|
+
}
|
|
17
|
+
stack.push({
|
|
18
|
+
canvas: handles.canvas,
|
|
19
|
+
context: handles.context,
|
|
20
|
+
renderTransform2D: handles.renderTransform2D,
|
|
21
|
+
});
|
|
22
|
+
handles.canvas = target.canvas;
|
|
23
|
+
handles.context = target.context;
|
|
24
|
+
handles.context.imageSmoothingEnabled = runtime.imageSmoothingEnabled;
|
|
25
|
+
handles.context.imageSmoothingQuality = runtime.imageSmoothingQuality;
|
|
26
|
+
// Always create a new matrix for this target so restoring the saved reference
|
|
27
|
+
// on end leaves the outer renderTransform2D unmodified.
|
|
28
|
+
const newTransform = createMatrix();
|
|
29
|
+
copyMatrix(newTransform, renderTransform);
|
|
30
|
+
handles.renderTransform2D = newTransform;
|
|
31
|
+
}
|
|
32
|
+
export function createCanvasRenderTarget(width, height) {
|
|
33
|
+
const canvas = document.createElement('canvas');
|
|
34
|
+
canvas.width = Math.max(1, Math.ceil(width));
|
|
35
|
+
canvas.height = Math.max(1, Math.ceil(height));
|
|
36
|
+
const context = canvas.getContext('2d');
|
|
37
|
+
return { canvas, context, width: canvas.width, height: canvas.height };
|
|
38
|
+
}
|
|
39
|
+
export function destroyCanvasRenderTarget(target) {
|
|
40
|
+
// Collapse the canvas to zero size so the browser can reclaim its backing store now.
|
|
41
|
+
// Setting width/height to 0 also implicitly resets the context state.
|
|
42
|
+
target.canvas.width = 0;
|
|
43
|
+
target.canvas.height = 0;
|
|
44
|
+
target.width = 0;
|
|
45
|
+
target.height = 0;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Restores the canvas, context, and renderTransform2D saved by the matching
|
|
49
|
+
* `beginCanvasRenderTarget` call.
|
|
50
|
+
*/
|
|
51
|
+
export function endCanvasRenderTarget(state) {
|
|
52
|
+
const handles = state;
|
|
53
|
+
const saved = _targetStack.get(state)?.pop();
|
|
54
|
+
if (saved === undefined)
|
|
55
|
+
return;
|
|
56
|
+
handles.canvas = saved.canvas;
|
|
57
|
+
handles.context = saved.context;
|
|
58
|
+
handles.renderTransform2D = saved.renderTransform2D;
|
|
59
|
+
}
|
|
60
|
+
export function resizeCanvasRenderTarget(target, width, height) {
|
|
61
|
+
target.canvas.width = Math.max(1, Math.ceil(width));
|
|
62
|
+
target.canvas.height = Math.max(1, Math.ceil(height));
|
|
63
|
+
target.width = target.canvas.width;
|
|
64
|
+
target.height = target.canvas.height;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=canvasRenderTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRenderTarget.js","sourceRoot":"","sources":["../src/canvasRenderTarget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CanvasRenderState, DisplayObjectRenderer, RenderProxy2D } from '@flighthq/types';
|
|
2
|
+
export declare function drawCanvasRichText(state: CanvasRenderState, renderProxy: RenderProxy2D): void;
|
|
3
|
+
export type CanvasTextInputOverlay = (state: CanvasRenderState, renderProxy: RenderProxy2D) => void;
|
|
4
|
+
export declare function drawCanvasRichTextMask(state: CanvasRenderState, data: RenderProxy2D): void;
|
|
5
|
+
export declare function registerCanvasTextInputOverlay(overlay: CanvasTextInputOverlay): void;
|
|
6
|
+
export declare const defaultCanvasRichTextRenderer: DisplayObjectRenderer;
|
|
7
|
+
//# sourceMappingURL=canvasRichText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasRichText.d.ts","sourceRoot":"","sources":["../src/canvasRichText.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EAKd,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAS7F;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,KAAK,IAAI,CAAC;AAEpG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAE1F;AAqHD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAEpF;AASD,eAAO,MAAM,6BAA6B,EAAE,qBAG3C,CAAC"}
|