@flighthq/effects-canvas 0.2.0 → 0.2.1-next.410.a23f189
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/canvasDropShadowEffect.d.ts +2 -1
- package/dist/canvasDropShadowEffect.d.ts.map +1 -1
- package/dist/canvasDropShadowEffect.js +33 -7
- package/dist/canvasDropShadowEffect.js.map +1 -1
- package/dist/canvasEffectDropShadowCss.js +4 -4
- package/dist/canvasEffectDropShadowCss.js.map +1 -1
- package/dist/canvasOuterGlowEffect.d.ts +2 -1
- package/dist/canvasOuterGlowEffect.d.ts.map +1 -1
- package/dist/canvasOuterGlowEffect.js +29 -7
- package/dist/canvasOuterGlowEffect.js.map +1 -1
- package/dist/canvasRenderEffectPipeline.d.ts.map +1 -1
- package/dist/canvasRenderEffectPipeline.js +5 -7
- package/dist/canvasRenderEffectPipeline.js.map +1 -1
- package/dist/canvasRenderEffectRegistration.d.ts.map +1 -1
- package/dist/canvasRenderEffectRegistration.js +3 -2
- package/dist/canvasRenderEffectRegistration.js.map +1 -1
- package/dist/canvasSourceModeCompositing.d.ts +7 -0
- package/dist/canvasSourceModeCompositing.d.ts.map +1 -0
- package/dist/canvasSourceModeCompositing.js +47 -0
- package/dist/canvasSourceModeCompositing.js.map +1 -0
- package/package.json +6 -6
- package/src/canvasDropShadowEffect.test.ts +75 -0
- package/src/canvasEffectDropShadowCss.test.ts +13 -0
- package/src/canvasOuterGlowEffect.test.ts +75 -0
- package/src/canvasSourceModeCompositing.test.ts +30 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CanvasRenderEffectRunner, CanvasRenderTarget, DropShadowEffect } from '@flighthq/types';
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, CanvasRenderTargetPool, DropShadowEffect } from '@flighthq/types';
|
|
2
2
|
export declare function applyDropShadowEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, effect: Readonly<DropShadowEffect>): void;
|
|
3
|
+
export declare function applyDropShadowEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, pool: CanvasRenderTargetPool, effect: Readonly<DropShadowEffect>): void;
|
|
3
4
|
export declare const defaultCanvasDropShadowEffectRunner: CanvasRenderEffectRunner;
|
|
4
5
|
//# sourceMappingURL=canvasDropShadowEffect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasDropShadowEffect.d.ts","sourceRoot":"","sources":["../src/canvasDropShadowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canvasDropShadowEffect.d.ts","sourceRoot":"","sources":["../src/canvasDropShadowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AAmBzB,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAAC;AACR,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAAC;AAkBR,eAAO,MAAM,mCAAmC,EAAE,wBAEjD,CAAC"}
|
|
@@ -1,14 +1,40 @@
|
|
|
1
1
|
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
2
|
import { computeDropShadowEffectCss } from './canvasEffectDropShadowCss';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export function applyDropShadowEffectToCanvas(source, dest, effect) {
|
|
3
|
+
import { acquireCanvasRenderTarget, createCanvasRenderTargetPool, releaseCanvasRenderTarget, } from './canvasRenderEffectPipeline';
|
|
4
|
+
import { clearCanvasTarget, compositeCanvasImage, compositeCanvasSourceMode, drawCanvasTintedAlphaMask, } from './canvasSourceModeCompositing';
|
|
5
|
+
export function applyDropShadowEffectToCanvas(source, dest, poolOrEffect, maybeEffect) {
|
|
6
|
+
const effect = maybeEffect ?? poolOrEffect;
|
|
8
7
|
const css = computeDropShadowEffectCss(effect);
|
|
9
|
-
|
|
8
|
+
if (css !== null) {
|
|
9
|
+
drawCanvasEffectPass(dest, source, css);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const pool = maybeEffect === undefined ? createCanvasRenderTargetPool() : poolOrEffect;
|
|
13
|
+
applyDropShadowEffectToCanvasWithPool(source, dest, pool, effect);
|
|
10
14
|
}
|
|
11
15
|
export const defaultCanvasDropShadowEffectRunner = (ctx, effect) => {
|
|
12
|
-
applyDropShadowEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
16
|
+
applyDropShadowEffectToCanvas(ctx.source, ctx.dest, ctx.pool, effect);
|
|
13
17
|
};
|
|
18
|
+
function applyDropShadowEffectToCanvasWithPool(source, dest, pool, effect) {
|
|
19
|
+
const mask = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
20
|
+
const blurred = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
21
|
+
const angle = ((effect.angle ?? 45) * Math.PI) / 180;
|
|
22
|
+
const distance = effect.distance ?? 4;
|
|
23
|
+
const dx = Math.cos(angle) * distance;
|
|
24
|
+
const dy = Math.sin(angle) * distance;
|
|
25
|
+
const strength = effect.strength ?? 1;
|
|
26
|
+
const tintStrength = Math.min(1, strength);
|
|
27
|
+
const shadowPasses = Math.max(1, Math.floor(strength));
|
|
28
|
+
const blur = Math.max(0, ((effect.blurX ?? 4) + (effect.blurY ?? 4)) / 2);
|
|
29
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
30
|
+
drawCanvasTintedAlphaMask(mask, source, effect.color ?? 0, effect.alpha ?? 1, tintStrength);
|
|
31
|
+
drawCanvasEffectPass(blurred, mask, blur > 0 ? `blur(${blur}px)` : 'none');
|
|
32
|
+
clearCanvasTarget(dest);
|
|
33
|
+
for (let i = 0; i < shadowPasses; i++) {
|
|
34
|
+
compositeCanvasImage(dest, blurred, dx, dy);
|
|
35
|
+
}
|
|
36
|
+
compositeCanvasSourceMode(dest, source, sourceMode);
|
|
37
|
+
releaseCanvasRenderTarget(pool, mask);
|
|
38
|
+
releaseCanvasRenderTarget(pool, blurred);
|
|
39
|
+
}
|
|
14
40
|
//# sourceMappingURL=canvasDropShadowEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasDropShadowEffect.js","sourceRoot":"","sources":["../src/canvasDropShadowEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvasDropShadowEffect.js","sourceRoot":"","sources":["../src/canvasDropShadowEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AAgBvC,MAAM,UAAU,6BAA6B,CAC3C,MAAoC,EACpC,IAAkC,EAClC,YAAiE,EACjE,WAAwC;IAExC,MAAM,MAAM,GAAG,WAAW,IAAK,YAA2C,CAAC;IAC3E,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAE,YAAuC,CAAC;IACnH,qCAAqC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC3F,6BAA6B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AAC5F,CAAC,CAAC;AAEF,SAAS,qCAAqC,CAC5C,MAAoC,EACpC,IAAkC,EAClC,IAA4B,EAC5B,MAAkC;IAElC,MAAM,IAAI,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7E,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;IAE/C,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5F,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE3E,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEpD,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Drop-shadow composite effect as a CSS `drop-shadow()` string (the same string the DOM backend emits).
|
|
2
|
-
//
|
|
2
|
+
// Only sourceMode 'draw' and isotropic blur can be represented by CSS-only drop-shadow().
|
|
3
3
|
// Offset is derived from angle (degrees, default 45) and distance (default 4), rounded to whole pixels.
|
|
4
4
|
export function computeDropShadowEffectCss(effect) {
|
|
5
|
-
if (effect.
|
|
5
|
+
if ((effect.sourceMode ?? 'draw') !== 'draw')
|
|
6
6
|
return null;
|
|
7
7
|
const blurX = effect.blurX ?? 4;
|
|
8
8
|
const blurY = effect.blurY ?? 4;
|
|
@@ -16,9 +16,9 @@ export function computeDropShadowEffectCss(effect) {
|
|
|
16
16
|
return `drop-shadow(${dx}px ${dy}px ${blurX}px ${cssRgbaFromColor(effect.color ?? 0, effect.alpha ?? 1)})`;
|
|
17
17
|
}
|
|
18
18
|
// Outer-glow composite effect as a centered (no offset) CSS `drop-shadow()` string.
|
|
19
|
-
//
|
|
19
|
+
// Only sourceMode 'draw' and isotropic blur can be represented by CSS-only drop-shadow().
|
|
20
20
|
export function computeOuterGlowEffectCss(effect) {
|
|
21
|
-
if (effect.
|
|
21
|
+
if ((effect.sourceMode ?? 'draw') !== 'draw')
|
|
22
22
|
return null;
|
|
23
23
|
const blurX = effect.blurX ?? 6;
|
|
24
24
|
const blurY = effect.blurY ?? 6;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasEffectDropShadowCss.js","sourceRoot":"","sources":["../src/canvasEffectDropShadowCss.ts"],"names":[],"mappings":"AAEA,wGAAwG;AACxG,
|
|
1
|
+
{"version":3,"file":"canvasEffectDropShadowCss.js","sourceRoot":"","sources":["../src/canvasEffectDropShadowCss.ts"],"names":[],"mappings":"AAEA,wGAAwG;AACxG,0FAA0F;AAC1F,wGAAwG;AACxG,MAAM,UAAU,0BAA0B,CAAC,MAAkC;IAC3E,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACpD,OAAO,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;AAC7G,CAAC;AAED,oFAAoF;AACpF,0FAA0F;AAC1F,MAAM,UAAU,yBAAyB,CAAC,MAAiC;IACzE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,uBAAuB,KAAK,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;AAC5G,CAAC;AAED,iGAAiG;AACjG,SAAS,gBAAgB,CAAC,KAAa,EAAE,KAAa;IACpD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;IACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CanvasRenderEffectRunner, CanvasRenderTarget, OuterGlowEffect } from '@flighthq/types';
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, CanvasRenderTargetPool, OuterGlowEffect } from '@flighthq/types';
|
|
2
2
|
export declare function applyOuterGlowEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, effect: Readonly<OuterGlowEffect>): void;
|
|
3
|
+
export declare function applyOuterGlowEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, pool: CanvasRenderTargetPool, effect: Readonly<OuterGlowEffect>): void;
|
|
3
4
|
export declare const defaultCanvasOuterGlowEffectRunner: CanvasRenderEffectRunner;
|
|
4
5
|
//# sourceMappingURL=canvasOuterGlowEffect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasOuterGlowEffect.d.ts","sourceRoot":"","sources":["../src/canvasOuterGlowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canvasOuterGlowEffect.d.ts","sourceRoot":"","sources":["../src/canvasOuterGlowEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAmBzB,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAAC;AACR,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAAC;AAkBR,eAAO,MAAM,kCAAkC,EAAE,wBAEhD,CAAC"}
|
|
@@ -1,14 +1,36 @@
|
|
|
1
1
|
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
2
|
import { computeOuterGlowEffectCss } from './canvasEffectDropShadowCss';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export function applyOuterGlowEffectToCanvas(source, dest, effect) {
|
|
3
|
+
import { acquireCanvasRenderTarget, createCanvasRenderTargetPool, releaseCanvasRenderTarget, } from './canvasRenderEffectPipeline';
|
|
4
|
+
import { clearCanvasTarget, compositeCanvasImage, compositeCanvasSourceMode, drawCanvasTintedAlphaMask, } from './canvasSourceModeCompositing';
|
|
5
|
+
export function applyOuterGlowEffectToCanvas(source, dest, poolOrEffect, maybeEffect) {
|
|
6
|
+
const effect = maybeEffect ?? poolOrEffect;
|
|
8
7
|
const css = computeOuterGlowEffectCss(effect);
|
|
9
|
-
|
|
8
|
+
if (css !== null) {
|
|
9
|
+
drawCanvasEffectPass(dest, source, css);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const pool = maybeEffect === undefined ? createCanvasRenderTargetPool() : poolOrEffect;
|
|
13
|
+
applyOuterGlowEffectToCanvasWithPool(source, dest, pool, effect);
|
|
10
14
|
}
|
|
11
15
|
export const defaultCanvasOuterGlowEffectRunner = (ctx, effect) => {
|
|
12
|
-
applyOuterGlowEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
16
|
+
applyOuterGlowEffectToCanvas(ctx.source, ctx.dest, ctx.pool, effect);
|
|
13
17
|
};
|
|
18
|
+
function applyOuterGlowEffectToCanvasWithPool(source, dest, pool, effect) {
|
|
19
|
+
const mask = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
20
|
+
const blurred = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
21
|
+
const strength = effect.strength ?? 1;
|
|
22
|
+
const tintStrength = Math.min(1, strength);
|
|
23
|
+
const glowPasses = Math.max(1, Math.floor(strength));
|
|
24
|
+
const blur = Math.max(0, ((effect.blurX ?? 6) + (effect.blurY ?? 6)) / 2);
|
|
25
|
+
const sourceMode = effect.sourceMode ?? 'draw';
|
|
26
|
+
drawCanvasTintedAlphaMask(mask, source, effect.color ?? 0xff0000, effect.alpha ?? 1, tintStrength);
|
|
27
|
+
drawCanvasEffectPass(blurred, mask, blur > 0 ? `blur(${blur}px)` : 'none');
|
|
28
|
+
clearCanvasTarget(dest);
|
|
29
|
+
for (let i = 0; i < glowPasses; i++) {
|
|
30
|
+
compositeCanvasImage(dest, blurred);
|
|
31
|
+
}
|
|
32
|
+
compositeCanvasSourceMode(dest, source, sourceMode);
|
|
33
|
+
releaseCanvasRenderTarget(pool, mask);
|
|
34
|
+
releaseCanvasRenderTarget(pool, blurred);
|
|
35
|
+
}
|
|
14
36
|
//# sourceMappingURL=canvasOuterGlowEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasOuterGlowEffect.js","sourceRoot":"","sources":["../src/canvasOuterGlowEffect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvasOuterGlowEffect.js","sourceRoot":"","sources":["../src/canvasOuterGlowEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AAgBvC,MAAM,UAAU,4BAA4B,CAC1C,MAAoC,EACpC,IAAkC,EAClC,YAAgE,EAChE,WAAuC;IAEvC,MAAM,MAAM,GAAG,WAAW,IAAK,YAA0C,CAAC;IAC1E,MAAM,GAAG,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAE,YAAuC,CAAC;IACnH,oCAAoC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,kCAAkC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC1F,4BAA4B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AAC1F,CAAC,CAAC;AAEF,SAAS,oCAAoC,CAC3C,MAAoC,EACpC,IAAkC,EAClC,IAA4B,EAC5B,MAAiC;IAEjC,MAAM,IAAI,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;IAE/C,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;IACnG,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE3E,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEpD,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/canvasRenderEffectPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canvasRenderEffectPipeline.d.ts","sourceRoot":"","sources":["../src/canvasRenderEffectPipeline.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,UAAU,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAgBzB,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,sBAAsB,EAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,kBAAkB,CAOpB;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAYpH;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,QAAQ,CAAC,2BAA2B,CAAM,GAClD,0BAA0B,CAO5B;AAED,wBAAgB,4BAA4B,IAAI,sBAAsB,CAErE;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,0BAA0B,GACnC,IAAI,CAQN;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,0BAA0B,EACpC,UAAU,EAAE,aAAa,CAAC,YAAY,GAAG,UAAU,CAAC,GACnD,IAAI,CAyDN;AAID,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAIxG"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { bakeColorLutForRun, createColorLutCache, fuseColorMatrices, getAdjustmentColorMatrix, isColorLutAdjustment, } from '@flighthq/adjustments';
|
|
2
|
-
import {
|
|
3
|
-
import { createMatrix } from '@flighthq/geometry';
|
|
2
|
+
import { beginCanvasRenderPass, createCanvasRenderTarget, endCanvasRenderPass, resizeCanvasRenderTarget, } from '@flighthq/displayobject-canvas';
|
|
4
3
|
import { applyColorLutPassToCanvas } from './canvasColorLutPass';
|
|
5
4
|
import { applyColorMatrixPassToCanvas } from './canvasColorMatrixPass';
|
|
6
5
|
import { getCanvasRenderEffectRunner } from './canvasRenderEffectRegistry';
|
|
@@ -31,10 +30,9 @@ export function beginCanvasRenderEffectPipeline(state, pipeline) {
|
|
|
31
30
|
else {
|
|
32
31
|
resizeCanvasRenderTarget(pipeline.sceneTarget, w, h);
|
|
33
32
|
}
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
beginCanvasRenderTarget(state, pipeline.sceneTarget, state.renderTransform2D ?? createMatrix());
|
|
33
|
+
// beginCanvasRenderPass clears the offscreen scene canvas by default (an unchanged size would keep last
|
|
34
|
+
// frame's pixels otherwise); the current 2D transform is inherited rather than passed.
|
|
35
|
+
beginCanvasRenderPass(state, pipeline.sceneTarget);
|
|
38
36
|
}
|
|
39
37
|
export function createCanvasRenderEffectPipeline(_state, options = {}) {
|
|
40
38
|
return {
|
|
@@ -60,7 +58,7 @@ export function endCanvasRenderEffectPipeline(state, pipeline, operations) {
|
|
|
60
58
|
const scene = pipeline.sceneTarget;
|
|
61
59
|
if (scene === null)
|
|
62
60
|
return;
|
|
63
|
-
|
|
61
|
+
endCanvasRenderPass(state);
|
|
64
62
|
const pool = pipeline.pool;
|
|
65
63
|
let source = scene;
|
|
66
64
|
let scratchA = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderEffectPipeline.js","sourceRoot":"","sources":["../src/canvasRenderEffectPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"canvasRenderEffectPipeline.js","sourceRoot":"","sources":["../src/canvasRenderEffectPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderEffectRegistration.d.ts","sourceRoot":"","sources":["../src/canvasRenderEffectRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AA4CnF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAM7E;AAOD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAI9E;AASD,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIpF;
|
|
1
|
+
{"version":3,"file":"canvasRenderEffectRegistration.d.ts","sourceRoot":"","sources":["../src/canvasRenderEffectRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AA4CnF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAM7E;AAOD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAI9E;AASD,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIpF;AAQD,wBAAgB,oCAAoC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAInF;AAOD,wBAAgB,sCAAsC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIrF;AAOD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAIjF"}
|
|
@@ -69,8 +69,9 @@ export function registerColorGradeCanvasRenderEffects(state) {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
// Registers the composite-family default runners realizable on Canvas 2D: DropShadowEffect and
|
|
72
|
-
// OuterGlowEffect
|
|
73
|
-
// composites (bevel, inner glow/shadow, gradient glow/bevel)
|
|
72
|
+
// OuterGlowEffect. Their simple draw mode uses CSS `drop-shadow()`, while hide/knockout use explicit
|
|
73
|
+
// Canvas compositing. The other former-filter composites (bevel, inner glow/shadow, gradient glow/bevel)
|
|
74
|
+
// have no Canvas 2D realization — they
|
|
74
75
|
// require the multi-target tint/blur/offset GPU recipe — so they are intentionally omitted here (the
|
|
75
76
|
// pipeline skips unregistered kinds). Symmetric with registerCompositeGlRenderEffects.
|
|
76
77
|
export function registerCompositeCanvasRenderEffects(state) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasRenderEffectRegistration.js","sourceRoot":"","sources":["../src/canvasRenderEffectRegistration.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"canvasRenderEffectRegistration.js","sourceRoot":"","sources":["../src/canvasRenderEffectRegistration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CanvasRenderTarget } from '@flighthq/types';
|
|
2
|
+
export type CanvasEffectSourceMode = 'draw' | 'hide' | 'knockout';
|
|
3
|
+
export declare function clearCanvasTarget(dest: Readonly<CanvasRenderTarget>): void;
|
|
4
|
+
export declare function compositeCanvasImage(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, dx?: number, dy?: number, compositeOperation?: GlobalCompositeOperation): void;
|
|
5
|
+
export declare function compositeCanvasSourceMode(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, sourceMode: CanvasEffectSourceMode): void;
|
|
6
|
+
export declare function drawCanvasTintedAlphaMask(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, color: number, alpha: number, strength: number): void;
|
|
7
|
+
//# sourceMappingURL=canvasSourceModeCompositing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasSourceModeCompositing.d.ts","sourceRoot":"","sources":["../src/canvasSourceModeCompositing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAElE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAS1E;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,EAAE,SAAI,EACN,EAAE,SAAI,EACN,kBAAkB,GAAE,wBAAwC,GAC3D,IAAI,CASN;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,UAAU,EAAE,sBAAsB,GACjC,IAAI,CAGN;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,IAAI,CAaN"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export function clearCanvasTarget(dest) {
|
|
2
|
+
const ctx = dest.context;
|
|
3
|
+
ctx.save();
|
|
4
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
5
|
+
ctx.globalAlpha = 1;
|
|
6
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
7
|
+
ctx.filter = 'none';
|
|
8
|
+
ctx.clearRect(0, 0, dest.width, dest.height);
|
|
9
|
+
ctx.restore();
|
|
10
|
+
}
|
|
11
|
+
export function compositeCanvasImage(dest, source, dx = 0, dy = 0, compositeOperation = 'source-over') {
|
|
12
|
+
const ctx = dest.context;
|
|
13
|
+
ctx.save();
|
|
14
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
15
|
+
ctx.globalAlpha = 1;
|
|
16
|
+
ctx.globalCompositeOperation = compositeOperation;
|
|
17
|
+
ctx.filter = 'none';
|
|
18
|
+
ctx.drawImage(source.canvas, dx, dy);
|
|
19
|
+
ctx.restore();
|
|
20
|
+
}
|
|
21
|
+
export function compositeCanvasSourceMode(dest, source, sourceMode) {
|
|
22
|
+
if (sourceMode === 'hide')
|
|
23
|
+
return;
|
|
24
|
+
compositeCanvasImage(dest, source, 0, 0, sourceMode === 'knockout' ? 'destination-out' : 'source-over');
|
|
25
|
+
}
|
|
26
|
+
export function drawCanvasTintedAlphaMask(dest, source, color, alpha, strength) {
|
|
27
|
+
const ctx = dest.context;
|
|
28
|
+
ctx.save();
|
|
29
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
30
|
+
ctx.globalAlpha = 1;
|
|
31
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
32
|
+
ctx.filter = 'none';
|
|
33
|
+
ctx.clearRect(0, 0, dest.width, dest.height);
|
|
34
|
+
ctx.drawImage(source.canvas, 0, 0);
|
|
35
|
+
ctx.globalCompositeOperation = 'source-in';
|
|
36
|
+
ctx.fillStyle = cssRgbaFromColor(color, alpha * strength);
|
|
37
|
+
ctx.fillRect(0, 0, dest.width, dest.height);
|
|
38
|
+
ctx.restore();
|
|
39
|
+
}
|
|
40
|
+
function cssRgbaFromColor(color, alpha) {
|
|
41
|
+
const r = (color >> 16) & 0xff;
|
|
42
|
+
const g = (color >> 8) & 0xff;
|
|
43
|
+
const b = color & 0xff;
|
|
44
|
+
const a = Math.max(0, Math.min(1, alpha));
|
|
45
|
+
return `rgba(${r},${g},${b},${a.toFixed(3)})`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=canvasSourceModeCompositing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasSourceModeCompositing.js","sourceRoot":"","sources":["../src/canvasSourceModeCompositing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/effects-canvas",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1-next.410.a23f189",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@flighthq/adjustments": "0.2.
|
|
36
|
-
"@flighthq/displayobject-canvas": "0.2.
|
|
37
|
-
"@flighthq/effects": "0.2.
|
|
38
|
-
"@flighthq/geometry": "0.2.
|
|
39
|
-
"@flighthq/types": "0.2.
|
|
35
|
+
"@flighthq/adjustments": "0.2.1-next.410.a23f189",
|
|
36
|
+
"@flighthq/displayobject-canvas": "0.2.1-next.410.a23f189",
|
|
37
|
+
"@flighthq/effects": "0.2.1-next.410.a23f189",
|
|
38
|
+
"@flighthq/geometry": "0.2.1-next.410.a23f189",
|
|
39
|
+
"@flighthq/types": "0.2.1-next.410.a23f189"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"typescript": "^5.3.0"
|
|
@@ -1,9 +1,69 @@
|
|
|
1
|
+
vi.hoisted(() => {
|
|
2
|
+
vi.resetModules();
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
vi.mock('./canvasEffectCompositing', () => ({
|
|
6
|
+
drawCanvasEffectPass: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
vi.mock('./canvasRenderEffectPipeline', () => {
|
|
10
|
+
let nextTargetId = 0;
|
|
11
|
+
return {
|
|
12
|
+
acquireCanvasRenderTarget: vi.fn((_pool, width, height) => ({
|
|
13
|
+
id: `scratch-${nextTargetId++}`,
|
|
14
|
+
canvas: {},
|
|
15
|
+
context: {},
|
|
16
|
+
width,
|
|
17
|
+
height,
|
|
18
|
+
})),
|
|
19
|
+
createCanvasRenderTargetPool: vi.fn(() => ({ free: [], inUse: [] })),
|
|
20
|
+
releaseCanvasRenderTarget: vi.fn(),
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
vi.mock('./canvasSourceModeCompositing', () => ({
|
|
25
|
+
clearCanvasTarget: vi.fn(),
|
|
26
|
+
compositeCanvasImage: vi.fn(),
|
|
27
|
+
compositeCanvasSourceMode: vi.fn(),
|
|
28
|
+
drawCanvasTintedAlphaMask: vi.fn(),
|
|
29
|
+
}));
|
|
30
|
+
|
|
1
31
|
import { applyDropShadowEffectToCanvas, defaultCanvasDropShadowEffectRunner } from './canvasDropShadowEffect';
|
|
32
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
33
|
+
import { compositeCanvasSourceMode } from './canvasSourceModeCompositing';
|
|
2
34
|
|
|
3
35
|
describe('applyDropShadowEffectToCanvas', () => {
|
|
4
36
|
it('is a function', () => {
|
|
5
37
|
expect(typeof applyDropShadowEffectToCanvas).toBe('function');
|
|
6
38
|
});
|
|
39
|
+
|
|
40
|
+
it('uses the CSS drop-shadow path for default draw mode', () => {
|
|
41
|
+
const source = createTarget('source');
|
|
42
|
+
const dest = createTarget('dest');
|
|
43
|
+
|
|
44
|
+
applyDropShadowEffectToCanvas(source, dest, { kind: 'DropShadowEffect' });
|
|
45
|
+
|
|
46
|
+
expect(drawCanvasEffectPass).toHaveBeenCalledWith(dest, source, 'drop-shadow(3px 3px 4px rgba(0,0,0,1.000))');
|
|
47
|
+
expect(compositeCanvasSourceMode).not.toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('routes hide mode through explicit source-mode compositing', () => {
|
|
51
|
+
const source = createTarget('source');
|
|
52
|
+
const dest = createTarget('dest');
|
|
53
|
+
|
|
54
|
+
applyDropShadowEffectToCanvas(source, dest, { kind: 'DropShadowEffect', sourceMode: 'hide' });
|
|
55
|
+
|
|
56
|
+
expect(compositeCanvasSourceMode).toHaveBeenCalledWith(dest, source, 'hide');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('routes knockout mode through explicit source-mode compositing', () => {
|
|
60
|
+
const source = createTarget('source');
|
|
61
|
+
const dest = createTarget('dest');
|
|
62
|
+
|
|
63
|
+
applyDropShadowEffectToCanvas(source, dest, { kind: 'DropShadowEffect', sourceMode: 'knockout' });
|
|
64
|
+
|
|
65
|
+
expect(compositeCanvasSourceMode).toHaveBeenCalledWith(dest, source, 'knockout');
|
|
66
|
+
});
|
|
7
67
|
});
|
|
8
68
|
|
|
9
69
|
describe('defaultCanvasDropShadowEffectRunner', () => {
|
|
@@ -11,3 +71,18 @@ describe('defaultCanvasDropShadowEffectRunner', () => {
|
|
|
11
71
|
expect(typeof defaultCanvasDropShadowEffectRunner).toBe('function');
|
|
12
72
|
});
|
|
13
73
|
});
|
|
74
|
+
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
vi.clearAllMocks();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
afterAll(() => {
|
|
80
|
+
vi.doUnmock('./canvasEffectCompositing');
|
|
81
|
+
vi.doUnmock('./canvasRenderEffectPipeline');
|
|
82
|
+
vi.doUnmock('./canvasSourceModeCompositing');
|
|
83
|
+
vi.resetModules();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
function createTarget(id: string, width = 32, height = 16): never {
|
|
87
|
+
return { id, canvas: {}, context: {}, width, height } as never;
|
|
88
|
+
}
|
|
@@ -8,6 +8,14 @@ describe('computeDropShadowEffectCss', () => {
|
|
|
8
8
|
it('emits the default drop-shadow string', () => {
|
|
9
9
|
expect(computeDropShadowEffectCss({ kind: 'DropShadowEffect' })).toBe('drop-shadow(3px 3px 4px rgba(0,0,0,1.000))');
|
|
10
10
|
});
|
|
11
|
+
|
|
12
|
+
it('returns null for hide because CSS drop-shadow includes the source object', () => {
|
|
13
|
+
expect(computeDropShadowEffectCss({ kind: 'DropShadowEffect', sourceMode: 'hide' })).toBeNull();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('returns null for knockout because CSS drop-shadow includes the source object', () => {
|
|
17
|
+
expect(computeDropShadowEffectCss({ kind: 'DropShadowEffect', sourceMode: 'knockout' })).toBeNull();
|
|
18
|
+
});
|
|
11
19
|
});
|
|
12
20
|
|
|
13
21
|
describe('computeOuterGlowEffectCss', () => {
|
|
@@ -18,4 +26,9 @@ describe('computeOuterGlowEffectCss', () => {
|
|
|
18
26
|
it('emits the default outer-glow string', () => {
|
|
19
27
|
expect(computeOuterGlowEffectCss({ kind: 'OuterGlowEffect' })).toBe('drop-shadow(0px 0px 6px rgba(255,0,0,1.000))');
|
|
20
28
|
});
|
|
29
|
+
|
|
30
|
+
it('returns null for non-draw source modes', () => {
|
|
31
|
+
expect(computeOuterGlowEffectCss({ kind: 'OuterGlowEffect', sourceMode: 'hide' })).toBeNull();
|
|
32
|
+
expect(computeOuterGlowEffectCss({ kind: 'OuterGlowEffect', sourceMode: 'knockout' })).toBeNull();
|
|
33
|
+
});
|
|
21
34
|
});
|
|
@@ -1,9 +1,69 @@
|
|
|
1
|
+
vi.hoisted(() => {
|
|
2
|
+
vi.resetModules();
|
|
3
|
+
});
|
|
4
|
+
|
|
5
|
+
vi.mock('./canvasEffectCompositing', () => ({
|
|
6
|
+
drawCanvasEffectPass: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
vi.mock('./canvasRenderEffectPipeline', () => {
|
|
10
|
+
let nextTargetId = 0;
|
|
11
|
+
return {
|
|
12
|
+
acquireCanvasRenderTarget: vi.fn((_pool, width, height) => ({
|
|
13
|
+
id: `scratch-${nextTargetId++}`,
|
|
14
|
+
canvas: {},
|
|
15
|
+
context: {},
|
|
16
|
+
width,
|
|
17
|
+
height,
|
|
18
|
+
})),
|
|
19
|
+
createCanvasRenderTargetPool: vi.fn(() => ({ free: [], inUse: [] })),
|
|
20
|
+
releaseCanvasRenderTarget: vi.fn(),
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
vi.mock('./canvasSourceModeCompositing', () => ({
|
|
25
|
+
clearCanvasTarget: vi.fn(),
|
|
26
|
+
compositeCanvasImage: vi.fn(),
|
|
27
|
+
compositeCanvasSourceMode: vi.fn(),
|
|
28
|
+
drawCanvasTintedAlphaMask: vi.fn(),
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
1
32
|
import { applyOuterGlowEffectToCanvas, defaultCanvasOuterGlowEffectRunner } from './canvasOuterGlowEffect';
|
|
33
|
+
import { compositeCanvasSourceMode } from './canvasSourceModeCompositing';
|
|
2
34
|
|
|
3
35
|
describe('applyOuterGlowEffectToCanvas', () => {
|
|
4
36
|
it('is a function', () => {
|
|
5
37
|
expect(typeof applyOuterGlowEffectToCanvas).toBe('function');
|
|
6
38
|
});
|
|
39
|
+
|
|
40
|
+
it('uses the CSS drop-shadow path for default draw mode', () => {
|
|
41
|
+
const source = createTarget('source');
|
|
42
|
+
const dest = createTarget('dest');
|
|
43
|
+
|
|
44
|
+
applyOuterGlowEffectToCanvas(source, dest, { kind: 'OuterGlowEffect' });
|
|
45
|
+
|
|
46
|
+
expect(drawCanvasEffectPass).toHaveBeenCalledWith(dest, source, 'drop-shadow(0px 0px 6px rgba(255,0,0,1.000))');
|
|
47
|
+
expect(compositeCanvasSourceMode).not.toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('routes hide mode through explicit source-mode compositing', () => {
|
|
51
|
+
const source = createTarget('source');
|
|
52
|
+
const dest = createTarget('dest');
|
|
53
|
+
|
|
54
|
+
applyOuterGlowEffectToCanvas(source, dest, { kind: 'OuterGlowEffect', sourceMode: 'hide' });
|
|
55
|
+
|
|
56
|
+
expect(compositeCanvasSourceMode).toHaveBeenCalledWith(dest, source, 'hide');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('routes knockout mode through explicit source-mode compositing', () => {
|
|
60
|
+
const source = createTarget('source');
|
|
61
|
+
const dest = createTarget('dest');
|
|
62
|
+
|
|
63
|
+
applyOuterGlowEffectToCanvas(source, dest, { kind: 'OuterGlowEffect', sourceMode: 'knockout' });
|
|
64
|
+
|
|
65
|
+
expect(compositeCanvasSourceMode).toHaveBeenCalledWith(dest, source, 'knockout');
|
|
66
|
+
});
|
|
7
67
|
});
|
|
8
68
|
|
|
9
69
|
describe('defaultCanvasOuterGlowEffectRunner', () => {
|
|
@@ -11,3 +71,18 @@ describe('defaultCanvasOuterGlowEffectRunner', () => {
|
|
|
11
71
|
expect(typeof defaultCanvasOuterGlowEffectRunner).toBe('function');
|
|
12
72
|
});
|
|
13
73
|
});
|
|
74
|
+
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
vi.clearAllMocks();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
afterAll(() => {
|
|
80
|
+
vi.doUnmock('./canvasEffectCompositing');
|
|
81
|
+
vi.doUnmock('./canvasRenderEffectPipeline');
|
|
82
|
+
vi.doUnmock('./canvasSourceModeCompositing');
|
|
83
|
+
vi.resetModules();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
function createTarget(id: string, width = 32, height = 16): never {
|
|
87
|
+
return { id, canvas: {}, context: {}, width, height } as never;
|
|
88
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clearCanvasTarget,
|
|
3
|
+
compositeCanvasImage,
|
|
4
|
+
compositeCanvasSourceMode,
|
|
5
|
+
drawCanvasTintedAlphaMask,
|
|
6
|
+
} from './canvasSourceModeCompositing';
|
|
7
|
+
|
|
8
|
+
describe('clearCanvasTarget', () => {
|
|
9
|
+
it('is a function', () => {
|
|
10
|
+
expect(typeof clearCanvasTarget).toBe('function');
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe('compositeCanvasImage', () => {
|
|
15
|
+
it('is a function', () => {
|
|
16
|
+
expect(typeof compositeCanvasImage).toBe('function');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('compositeCanvasSourceMode', () => {
|
|
21
|
+
it('is a function', () => {
|
|
22
|
+
expect(typeof compositeCanvasSourceMode).toBe('function');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('drawCanvasTintedAlphaMask', () => {
|
|
27
|
+
it('is a function', () => {
|
|
28
|
+
expect(typeof drawCanvasTintedAlphaMask).toBe('function');
|
|
29
|
+
});
|
|
30
|
+
});
|