@flighthq/effects-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/canvasBloomEffect.d.ts +4 -0
- package/dist/canvasBloomEffect.d.ts.map +1 -0
- package/dist/canvasBloomEffect.js +43 -0
- package/dist/canvasBloomEffect.js.map +1 -0
- package/dist/canvasBokehDepthOfFieldEffect.d.ts +4 -0
- package/dist/canvasBokehDepthOfFieldEffect.d.ts.map +1 -0
- package/dist/canvasBokehDepthOfFieldEffect.js +10 -0
- package/dist/canvasBokehDepthOfFieldEffect.js.map +1 -0
- package/dist/canvasBrightnessContrastEffect.d.ts +4 -0
- package/dist/canvasBrightnessContrastEffect.d.ts.map +1 -0
- package/dist/canvasBrightnessContrastEffect.js +13 -0
- package/dist/canvasBrightnessContrastEffect.js.map +1 -0
- package/dist/canvasCameraMotionBlurEffect.d.ts +4 -0
- package/dist/canvasCameraMotionBlurEffect.d.ts.map +1 -0
- package/dist/canvasCameraMotionBlurEffect.js +11 -0
- package/dist/canvasCameraMotionBlurEffect.js.map +1 -0
- package/dist/canvasChannelMixerEffect.d.ts +4 -0
- package/dist/canvasChannelMixerEffect.d.ts.map +1 -0
- package/dist/canvasChannelMixerEffect.js +11 -0
- package/dist/canvasChannelMixerEffect.js.map +1 -0
- package/dist/canvasChromaticAberrationEffect.d.ts +4 -0
- package/dist/canvasChromaticAberrationEffect.d.ts.map +1 -0
- package/dist/canvasChromaticAberrationEffect.js +11 -0
- package/dist/canvasChromaticAberrationEffect.js.map +1 -0
- package/dist/canvasColorGradeEffect.d.ts +4 -0
- package/dist/canvasColorGradeEffect.d.ts.map +1 -0
- package/dist/canvasColorGradeEffect.js +21 -0
- package/dist/canvasColorGradeEffect.js.map +1 -0
- package/dist/canvasCrtEffect.d.ts +4 -0
- package/dist/canvasCrtEffect.d.ts.map +1 -0
- package/dist/canvasCrtEffect.js +11 -0
- package/dist/canvasCrtEffect.js.map +1 -0
- package/dist/canvasDirectionalBlurEffect.d.ts +4 -0
- package/dist/canvasDirectionalBlurEffect.d.ts.map +1 -0
- package/dist/canvasDirectionalBlurEffect.js +11 -0
- package/dist/canvasDirectionalBlurEffect.js.map +1 -0
- package/dist/canvasDisplacementEffect.d.ts +4 -0
- package/dist/canvasDisplacementEffect.d.ts.map +1 -0
- package/dist/canvasDisplacementEffect.js +10 -0
- package/dist/canvasDisplacementEffect.js.map +1 -0
- package/dist/canvasDitherEffect.d.ts +4 -0
- package/dist/canvasDitherEffect.d.ts.map +1 -0
- package/dist/canvasDitherEffect.js +11 -0
- package/dist/canvasDitherEffect.js.map +1 -0
- package/dist/canvasEffectCompositing.d.ts +6 -0
- package/dist/canvasEffectCompositing.d.ts.map +1 -0
- package/dist/canvasEffectCompositing.js +77 -0
- package/dist/canvasEffectCompositing.js.map +1 -0
- package/dist/canvasExposureEffect.d.ts +4 -0
- package/dist/canvasExposureEffect.d.ts.map +1 -0
- package/dist/canvasExposureEffect.js +11 -0
- package/dist/canvasExposureEffect.js.map +1 -0
- package/dist/canvasFilmGrainEffect.d.ts +4 -0
- package/dist/canvasFilmGrainEffect.d.ts.map +1 -0
- package/dist/canvasFilmGrainEffect.js +50 -0
- package/dist/canvasFilmGrainEffect.js.map +1 -0
- package/dist/canvasFxaaEffect.d.ts +4 -0
- package/dist/canvasFxaaEffect.d.ts.map +1 -0
- package/dist/canvasFxaaEffect.js +11 -0
- package/dist/canvasFxaaEffect.js.map +1 -0
- package/dist/canvasGlitchEffect.d.ts +4 -0
- package/dist/canvasGlitchEffect.d.ts.map +1 -0
- package/dist/canvasGlitchEffect.js +11 -0
- package/dist/canvasGlitchEffect.js.map +1 -0
- package/dist/canvasGodRaysEffect.d.ts +4 -0
- package/dist/canvasGodRaysEffect.d.ts.map +1 -0
- package/dist/canvasGodRaysEffect.js +11 -0
- package/dist/canvasGodRaysEffect.js.map +1 -0
- package/dist/canvasGrayscaleEffect.d.ts +4 -0
- package/dist/canvasGrayscaleEffect.d.ts.map +1 -0
- package/dist/canvasGrayscaleEffect.js +10 -0
- package/dist/canvasGrayscaleEffect.js.map +1 -0
- package/dist/canvasHalftoneEffect.d.ts +4 -0
- package/dist/canvasHalftoneEffect.d.ts.map +1 -0
- package/dist/canvasHalftoneEffect.js +10 -0
- package/dist/canvasHalftoneEffect.js.map +1 -0
- package/dist/canvasHueSaturationEffect.d.ts +4 -0
- package/dist/canvasHueSaturationEffect.d.ts.map +1 -0
- package/dist/canvasHueSaturationEffect.js +13 -0
- package/dist/canvasHueSaturationEffect.js.map +1 -0
- package/dist/canvasInvertEffect.d.ts +4 -0
- package/dist/canvasInvertEffect.d.ts.map +1 -0
- package/dist/canvasInvertEffect.js +10 -0
- package/dist/canvasInvertEffect.js.map +1 -0
- package/dist/canvasKuwaharaEffect.d.ts +4 -0
- package/dist/canvasKuwaharaEffect.d.ts.map +1 -0
- package/dist/canvasKuwaharaEffect.js +11 -0
- package/dist/canvasKuwaharaEffect.js.map +1 -0
- package/dist/canvasLensDirtEffect.d.ts +4 -0
- package/dist/canvasLensDirtEffect.d.ts.map +1 -0
- package/dist/canvasLensDirtEffect.js +11 -0
- package/dist/canvasLensDirtEffect.js.map +1 -0
- package/dist/canvasLensDistortionEffect.d.ts +4 -0
- package/dist/canvasLensDistortionEffect.d.ts.map +1 -0
- package/dist/canvasLensDistortionEffect.js +10 -0
- package/dist/canvasLensDistortionEffect.js.map +1 -0
- package/dist/canvasLensFlareEffect.d.ts +4 -0
- package/dist/canvasLensFlareEffect.d.ts.map +1 -0
- package/dist/canvasLensFlareEffect.js +11 -0
- package/dist/canvasLensFlareEffect.js.map +1 -0
- package/dist/canvasLiftGammaGainEffect.d.ts +4 -0
- package/dist/canvasLiftGammaGainEffect.d.ts.map +1 -0
- package/dist/canvasLiftGammaGainEffect.js +11 -0
- package/dist/canvasLiftGammaGainEffect.js.map +1 -0
- package/dist/canvasLookupTableGradeEffect.d.ts +4 -0
- package/dist/canvasLookupTableGradeEffect.d.ts.map +1 -0
- package/dist/canvasLookupTableGradeEffect.js +10 -0
- package/dist/canvasLookupTableGradeEffect.js.map +1 -0
- package/dist/canvasMotionBlurEffect.d.ts +4 -0
- package/dist/canvasMotionBlurEffect.d.ts.map +1 -0
- package/dist/canvasMotionBlurEffect.js +11 -0
- package/dist/canvasMotionBlurEffect.js.map +1 -0
- package/dist/canvasOutlineEffect.d.ts +4 -0
- package/dist/canvasOutlineEffect.d.ts.map +1 -0
- package/dist/canvasOutlineEffect.js +11 -0
- package/dist/canvasOutlineEffect.js.map +1 -0
- package/dist/canvasPixelateEffect.d.ts +4 -0
- package/dist/canvasPixelateEffect.d.ts.map +1 -0
- package/dist/canvasPixelateEffect.js +36 -0
- package/dist/canvasPixelateEffect.js.map +1 -0
- package/dist/canvasPosterizeEffect.d.ts +4 -0
- package/dist/canvasPosterizeEffect.d.ts.map +1 -0
- package/dist/canvasPosterizeEffect.js +10 -0
- package/dist/canvasPosterizeEffect.js.map +1 -0
- package/dist/canvasRadialBlurEffect.d.ts +4 -0
- package/dist/canvasRadialBlurEffect.d.ts.map +1 -0
- package/dist/canvasRadialBlurEffect.js +11 -0
- package/dist/canvasRadialBlurEffect.js.map +1 -0
- package/dist/canvasRenderEffectPipeline.d.ts +9 -0
- package/dist/canvasRenderEffectPipeline.d.ts.map +1 -0
- package/dist/canvasRenderEffectPipeline.js +97 -0
- package/dist/canvasRenderEffectPipeline.js.map +1 -0
- package/dist/canvasRenderEffectRegistration.d.ts +7 -0
- package/dist/canvasRenderEffectRegistration.d.ts.map +1 -0
- package/dist/canvasRenderEffectRegistration.js +150 -0
- package/dist/canvasRenderEffectRegistration.js.map +1 -0
- package/dist/canvasRenderEffectRegistry.d.ts +5 -0
- package/dist/canvasRenderEffectRegistry.d.ts.map +1 -0
- package/dist/canvasRenderEffectRegistry.js +24 -0
- package/dist/canvasRenderEffectRegistry.js.map +1 -0
- package/dist/canvasScanlinesEffect.d.ts +4 -0
- package/dist/canvasScanlinesEffect.d.ts.map +1 -0
- package/dist/canvasScanlinesEffect.js +28 -0
- package/dist/canvasScanlinesEffect.js.map +1 -0
- package/dist/canvasScreenSpaceFogEffect.d.ts +4 -0
- package/dist/canvasScreenSpaceFogEffect.d.ts.map +1 -0
- package/dist/canvasScreenSpaceFogEffect.js +10 -0
- package/dist/canvasScreenSpaceFogEffect.js.map +1 -0
- package/dist/canvasSepiaEffect.d.ts +4 -0
- package/dist/canvasSepiaEffect.d.ts.map +1 -0
- package/dist/canvasSepiaEffect.js +10 -0
- package/dist/canvasSepiaEffect.js.map +1 -0
- package/dist/canvasSharpenEffect.d.ts +4 -0
- package/dist/canvasSharpenEffect.d.ts.map +1 -0
- package/dist/canvasSharpenEffect.js +11 -0
- package/dist/canvasSharpenEffect.js.map +1 -0
- package/dist/canvasSketchEffect.d.ts +4 -0
- package/dist/canvasSketchEffect.d.ts.map +1 -0
- package/dist/canvasSketchEffect.js +11 -0
- package/dist/canvasSketchEffect.js.map +1 -0
- package/dist/canvasSmaaEffect.d.ts +4 -0
- package/dist/canvasSmaaEffect.d.ts.map +1 -0
- package/dist/canvasSmaaEffect.js +11 -0
- package/dist/canvasSmaaEffect.js.map +1 -0
- package/dist/canvasSsaoEffect.d.ts +4 -0
- package/dist/canvasSsaoEffect.d.ts.map +1 -0
- package/dist/canvasSsaoEffect.js +11 -0
- package/dist/canvasSsaoEffect.js.map +1 -0
- package/dist/canvasSsrEffect.d.ts +4 -0
- package/dist/canvasSsrEffect.d.ts.map +1 -0
- package/dist/canvasSsrEffect.js +11 -0
- package/dist/canvasSsrEffect.js.map +1 -0
- package/dist/canvasTaaEffect.d.ts +4 -0
- package/dist/canvasTaaEffect.d.ts.map +1 -0
- package/dist/canvasTaaEffect.js +11 -0
- package/dist/canvasTaaEffect.js.map +1 -0
- package/dist/canvasTiltShiftEffect.d.ts +4 -0
- package/dist/canvasTiltShiftEffect.d.ts.map +1 -0
- package/dist/canvasTiltShiftEffect.js +11 -0
- package/dist/canvasTiltShiftEffect.js.map +1 -0
- package/dist/canvasToneMapEffect.d.ts +4 -0
- package/dist/canvasToneMapEffect.d.ts.map +1 -0
- package/dist/canvasToneMapEffect.js +12 -0
- package/dist/canvasToneMapEffect.js.map +1 -0
- package/dist/canvasVignetteEffect.d.ts +4 -0
- package/dist/canvasVignetteEffect.d.ts.map +1 -0
- package/dist/canvasVignetteEffect.js +41 -0
- package/dist/canvasVignetteEffect.js.map +1 -0
- package/dist/canvasWhiteBalanceEffect.d.ts +4 -0
- package/dist/canvasWhiteBalanceEffect.d.ts.map +1 -0
- package/dist/canvasWhiteBalanceEffect.js +11 -0
- package/dist/canvasWhiteBalanceEffect.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
- package/src/canvasBloomEffect.test.ts +13 -0
- package/src/canvasBokehDepthOfFieldEffect.test.ts +16 -0
- package/src/canvasBrightnessContrastEffect.test.ts +16 -0
- package/src/canvasCameraMotionBlurEffect.test.ts +16 -0
- package/src/canvasChannelMixerEffect.test.ts +13 -0
- package/src/canvasChromaticAberrationEffect.test.ts +16 -0
- package/src/canvasColorGradeEffect.test.ts +13 -0
- package/src/canvasCrtEffect.test.ts +13 -0
- package/src/canvasDirectionalBlurEffect.test.ts +16 -0
- package/src/canvasDisplacementEffect.test.ts +13 -0
- package/src/canvasDitherEffect.test.ts +13 -0
- package/src/canvasEffectCompositing.test.ts +63 -0
- package/src/canvasExposureEffect.test.ts +13 -0
- package/src/canvasFilmGrainEffect.test.ts +13 -0
- package/src/canvasFxaaEffect.test.ts +13 -0
- package/src/canvasGlitchEffect.test.ts +13 -0
- package/src/canvasGodRaysEffect.test.ts +13 -0
- package/src/canvasGrayscaleEffect.test.ts +13 -0
- package/src/canvasHalftoneEffect.test.ts +13 -0
- package/src/canvasHueSaturationEffect.test.ts +13 -0
- package/src/canvasInvertEffect.test.ts +13 -0
- package/src/canvasKuwaharaEffect.test.ts +13 -0
- package/src/canvasLensDirtEffect.test.ts +13 -0
- package/src/canvasLensDistortionEffect.test.ts +16 -0
- package/src/canvasLensFlareEffect.test.ts +13 -0
- package/src/canvasLiftGammaGainEffect.test.ts +13 -0
- package/src/canvasLookupTableGradeEffect.test.ts +16 -0
- package/src/canvasMotionBlurEffect.test.ts +13 -0
- package/src/canvasOutlineEffect.test.ts +13 -0
- package/src/canvasPixelateEffect.test.ts +13 -0
- package/src/canvasPosterizeEffect.test.ts +13 -0
- package/src/canvasRadialBlurEffect.test.ts +13 -0
- package/src/canvasRenderEffectPipeline.test.ts +66 -0
- package/src/canvasRenderEffectRegistration.test.ts +162 -0
- package/src/canvasRenderEffectRegistry.test.ts +41 -0
- package/src/canvasScanlinesEffect.test.ts +13 -0
- package/src/canvasScreenSpaceFogEffect.test.ts +16 -0
- package/src/canvasSepiaEffect.test.ts +13 -0
- package/src/canvasSharpenEffect.test.ts +13 -0
- package/src/canvasSketchEffect.test.ts +13 -0
- package/src/canvasSmaaEffect.test.ts +13 -0
- package/src/canvasSsaoEffect.test.ts +13 -0
- package/src/canvasSsrEffect.test.ts +13 -0
- package/src/canvasTaaEffect.test.ts +13 -0
- package/src/canvasTiltShiftEffect.test.ts +13 -0
- package/src/canvasToneMapEffect.test.ts +13 -0
- package/src/canvasVignetteEffect.test.ts +13 -0
- package/src/canvasWhiteBalanceEffect.test.ts +13 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BloomEffect, CanvasRenderEffectRunner, CanvasRenderTarget, CanvasRenderTargetPool } from '@flighthq/types';
|
|
2
|
+
export declare function applyBloomEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, pool: CanvasRenderTargetPool, effect: Readonly<BloomEffect>): void;
|
|
3
|
+
export declare const defaultCanvasBloomEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasBloomEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBloomEffect.d.ts","sourceRoot":"","sources":["../src/canvasBloomEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AASzB,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,IAAI,CAkCN;AAED,eAAO,MAAM,8BAA8B,EAAE,wBAE5C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { computeBloomBlurRadius } from '@flighthq/effects';
|
|
2
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
3
|
+
import { acquireCanvasRenderTarget, releaseCanvasRenderTarget } from './canvasRenderEffectPipeline';
|
|
4
|
+
// Bloom (REAL): bright-pass → blur the bright branch → additively composite back. Multi-pass: it
|
|
5
|
+
// acquires a scratch canvas from the pool, isolates bright pixels by pushing contrast hard so dim
|
|
6
|
+
// pixels crush to black, blurs that branch, then draws it over the scene with the 'lighter'
|
|
7
|
+
// (additive) composite op scaled by intensity (applied via the temp canvas's globalAlpha).
|
|
8
|
+
export function applyBloomEffectToCanvas(source, dest, pool, effect) {
|
|
9
|
+
const threshold = effect.threshold ?? 0.8;
|
|
10
|
+
const intensity = effect.intensity ?? 1;
|
|
11
|
+
const radius = computeBloomBlurRadius(effect);
|
|
12
|
+
// Bright pass: crush sub-threshold pixels toward black with a high-contrast / low-brightness CSS
|
|
13
|
+
// chain. contrast amplifies the gap around mid-grey; the brightness shift biases the crush point so
|
|
14
|
+
// a higher threshold keeps fewer pixels lit.
|
|
15
|
+
const contrast = 1 + threshold * 6;
|
|
16
|
+
const brightnessShift = 1 - threshold;
|
|
17
|
+
const bright = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
18
|
+
drawCanvasEffectPass(bright, source, `contrast(${contrast}) brightness(${brightnessShift})`);
|
|
19
|
+
// Blur the bright branch in place via a second scratch canvas (CSS blur draws blurred → blurred2).
|
|
20
|
+
const blurred = acquireCanvasRenderTarget(pool, source.width, source.height);
|
|
21
|
+
if (radius > 0) {
|
|
22
|
+
drawCanvasEffectPass(blurred, bright, `blur(${radius}px)`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
drawCanvasEffectPass(blurred, bright, 'none');
|
|
26
|
+
}
|
|
27
|
+
// Composite: scene first, then the bloom branch added on top (additive 'lighter'), scaled by intensity.
|
|
28
|
+
drawCanvasEffectPass(dest, source, 'none');
|
|
29
|
+
const ctx = dest.context;
|
|
30
|
+
ctx.save();
|
|
31
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
32
|
+
ctx.globalCompositeOperation = 'lighter';
|
|
33
|
+
ctx.globalAlpha = Math.max(0, Math.min(1, intensity));
|
|
34
|
+
ctx.filter = 'none';
|
|
35
|
+
ctx.drawImage(blurred.canvas, 0, 0);
|
|
36
|
+
ctx.restore();
|
|
37
|
+
releaseCanvasRenderTarget(pool, bright);
|
|
38
|
+
releaseCanvasRenderTarget(pool, blurred);
|
|
39
|
+
}
|
|
40
|
+
export const defaultCanvasBloomEffectRunner = (ctx, effect) => {
|
|
41
|
+
applyBloomEffectToCanvas(ctx.source, ctx.dest, ctx.pool, effect);
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=canvasBloomEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBloomEffect.js","sourceRoot":"","sources":["../src/canvasBloomEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEpG,iGAAiG;AACjG,kGAAkG;AAClG,4FAA4F;AAC5F,2FAA2F;AAC3F,MAAM,UAAU,wBAAwB,CACtC,MAAoC,EACpC,IAAkC,EAClC,IAA4B,EAC5B,MAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE9C,iGAAiG;IACjG,oGAAoG;IACpG,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;IACnC,MAAM,eAAe,GAAG,CAAC,GAAG,SAAS,CAAC;IACtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5E,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,QAAQ,gBAAgB,eAAe,GAAG,CAAC,CAAC;IAE7F,mGAAmG;IACnG,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,wGAAwG;IACxG,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;IACzB,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,wBAAwB,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAqB,CAAC,CAAC;AAClF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BokehDepthOfFieldEffect, CanvasRenderEffectRunner, CanvasRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyBokehDepthOfFieldEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<BokehDepthOfFieldEffect>): void;
|
|
3
|
+
export declare const defaultCanvasBokehDepthOfFieldEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasBokehDepthOfFieldEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBokehDepthOfFieldEffect.d.ts","sourceRoot":"","sources":["../src/canvasBokehDepthOfFieldEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAM7G,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACzC,IAAI,CAEN;AAED,eAAO,MAAM,0CAA0C,EAAE,wBAExD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Bokeh depth-of-field (PASSTHROUGH): a per-pixel circle-of-confusion blur driven by a depth buffer.
|
|
3
|
+
// Genuinely unsupportable on Canvas 2D: needs a depth G-buffer the 2D context does not expose. Passthrough.
|
|
4
|
+
export function applyBokehDepthOfFieldEffectToCanvas(source, dest, _effect) {
|
|
5
|
+
passthroughCanvasEffectPass(dest, source);
|
|
6
|
+
}
|
|
7
|
+
export const defaultCanvasBokehDepthOfFieldEffectRunner = (ctx, effect) => {
|
|
8
|
+
applyBokehDepthOfFieldEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=canvasBokehDepthOfFieldEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBokehDepthOfFieldEffect.js","sourceRoot":"","sources":["../src/canvasBokehDepthOfFieldEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,qGAAqG;AACrG,4GAA4G;AAC5G,MAAM,UAAU,oCAAoC,CAClD,MAAoC,EACpC,IAAkC,EAClC,OAA0C;IAE1C,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,0CAA0C,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAClG,oCAAoC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAiC,CAAC,CAAC;AAChG,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BrightnessContrastEffect, CanvasRenderEffectRunner, CanvasRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyBrightnessContrastEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, effect: Readonly<BrightnessContrastEffect>): void;
|
|
3
|
+
export declare const defaultCanvasBrightnessContrastEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasBrightnessContrastEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBrightnessContrastEffect.d.ts","sourceRoot":"","sources":["../src/canvasBrightnessContrastEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAO9G,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GACzC,IAAI,CAIN;AAED,eAAO,MAAM,2CAA2C,EAAE,wBAEzD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Brightness/contrast (REAL): CSS brightness()/contrast(). The intent's brightness is an additive
|
|
3
|
+
// offset around 0 (neutral 0) and contrast a multiplier around 1 (neutral 1); CSS brightness()/
|
|
4
|
+
// contrast() are both multipliers around 1, so brightness is mapped to 1 + offset.
|
|
5
|
+
export function applyBrightnessContrastEffectToCanvas(source, dest, effect) {
|
|
6
|
+
const brightness = 1 + (effect.brightness ?? 0);
|
|
7
|
+
const contrast = effect.contrast ?? 1;
|
|
8
|
+
drawCanvasEffectPass(dest, source, `brightness(${brightness}) contrast(${contrast})`);
|
|
9
|
+
}
|
|
10
|
+
export const defaultCanvasBrightnessContrastEffectRunner = (ctx, effect) => {
|
|
11
|
+
applyBrightnessContrastEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=canvasBrightnessContrastEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasBrightnessContrastEffect.js","sourceRoot":"","sources":["../src/canvasBrightnessContrastEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,kGAAkG;AAClG,gGAAgG;AAChG,mFAAmF;AACnF,MAAM,UAAU,qCAAqC,CACnD,MAAoC,EACpC,IAAkC,EAClC,MAA0C;IAE1C,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,UAAU,cAAc,QAAQ,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,MAAM,2CAA2C,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnG,qCAAqC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAkC,CAAC,CAAC;AAClG,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CameraMotionBlurEffect, CanvasRenderEffectRunner, CanvasRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function applyCameraMotionBlurEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<CameraMotionBlurEffect>): void;
|
|
3
|
+
export declare const defaultCanvasCameraMotionBlurEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasCameraMotionBlurEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasCameraMotionBlurEffect.d.ts","sourceRoot":"","sources":["../src/canvasCameraMotionBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAO5G,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACxC,IAAI,CAEN;AAED,eAAO,MAAM,yCAAyC,EAAE,wBAEvD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Camera motion blur (PASSTHROUGH): a zoom smear accumulating taps toward screen center.
|
|
3
|
+
// Genuinely unsupportable on Canvas 2D: needs camera velocity/depth reprojection the 2D context does not
|
|
4
|
+
// expose. Passthrough.
|
|
5
|
+
export function applyCameraMotionBlurEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasCameraMotionBlurEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyCameraMotionBlurEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasCameraMotionBlurEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasCameraMotionBlurEffect.js","sourceRoot":"","sources":["../src/canvasCameraMotionBlurEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,yFAAyF;AACzF,yGAAyG;AACzG,uBAAuB;AACvB,MAAM,UAAU,mCAAmC,CACjD,MAAoC,EACpC,IAAkC,EAClC,OAAyC;IAEzC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,yCAAyC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjG,mCAAmC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAgC,CAAC,CAAC;AAC9F,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, ChannelMixerEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyChannelMixerEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<ChannelMixerEffect>): void;
|
|
3
|
+
export declare const defaultCanvasChannelMixerEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasChannelMixerEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasChannelMixerEffect.d.ts","sourceRoot":"","sources":["../src/canvasChannelMixerEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAOxG,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,IAAI,CAEN;AAED,eAAO,MAAM,qCAAqC,EAAE,wBAEnD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Channel mixer (PASSTHROUGH): an arbitrary 3x4 RGB->RGB matrix applied per pixel. No CSS filter
|
|
3
|
+
// equivalent, but expressible per-pixel via getImageData/putImageData; not yet implemented — passthrough
|
|
4
|
+
// for now.
|
|
5
|
+
export function applyChannelMixerEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasChannelMixerEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyChannelMixerEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasChannelMixerEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasChannelMixerEffect.js","sourceRoot":"","sources":["../src/canvasChannelMixerEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,iGAAiG;AACjG,yGAAyG;AACzG,WAAW;AACX,MAAM,UAAU,+BAA+B,CAC7C,MAAoC,EACpC,IAAkC,EAClC,OAAqC;IAErC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,qCAAqC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC7F,+BAA+B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AACtF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, ChromaticAberrationEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyChromaticAberrationEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<ChromaticAberrationEffect>): void;
|
|
3
|
+
export declare const defaultCanvasChromaticAberrationEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasChromaticAberrationEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasChromaticAberrationEffect.d.ts","sourceRoot":"","sources":["../src/canvasChromaticAberrationEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAO/G,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC3C,IAAI,CAEN;AAED,eAAO,MAAM,4CAA4C,EAAE,wBAE1D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Chromatic aberration (PASSTHROUGH): splitting R/G/B channels at offset positions, which a 2D drawImage
|
|
3
|
+
// cannot address. No CSS filter equivalent, but expressible per-pixel via getImageData/putImageData; not
|
|
4
|
+
// yet implemented — passthrough for now.
|
|
5
|
+
export function applyChromaticAberrationEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasChromaticAberrationEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyChromaticAberrationEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasChromaticAberrationEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasChromaticAberrationEffect.js","sourceRoot":"","sources":["../src/canvasChromaticAberrationEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,yGAAyG;AACzG,yGAAyG;AACzG,yCAAyC;AACzC,MAAM,UAAU,sCAAsC,CACpD,MAAoC,EACpC,IAAkC,EAClC,OAA4C;IAE5C,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,4CAA4C,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpG,sCAAsC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmC,CAAC,CAAC;AACpG,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, ColorGradeEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyColorGradeEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, effect: Readonly<ColorGradeEffect>): void;
|
|
3
|
+
export declare const defaultCanvasColorGradeEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasColorGradeEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasColorGradeEffect.d.ts","sourceRoot":"","sources":["../src/canvasColorGradeEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQtG,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,CAeN;AAED,eAAO,MAAM,mCAAmC,EAAE,wBAEjD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Color grade (REAL): compose CSS brightness/contrast/saturate/hue-rotate. Exposure maps to a
|
|
3
|
+
// brightness multiplier (2^exposure), saturation to saturate(), contrast to contrast(). Temperature and
|
|
4
|
+
// tint are approximated as a small hue rotation — Canvas/CSS has no per-channel temperature primitive,
|
|
5
|
+
// so the warm/cool shift is a coarse approximation of the Gl recipe.
|
|
6
|
+
export function applyColorGradeEffectToCanvas(source, dest, effect) {
|
|
7
|
+
const exposure = Math.pow(2, effect.exposure ?? 0);
|
|
8
|
+
const brightness = exposure + (effect.brightness ?? 0);
|
|
9
|
+
const contrast = effect.contrast ?? 1;
|
|
10
|
+
const saturation = effect.saturation ?? 1;
|
|
11
|
+
const temperature = effect.temperature ?? 0;
|
|
12
|
+
const tint = effect.tint ?? 0;
|
|
13
|
+
// Approximate temperature/tint as a hue rotation: warm (+temperature) skews toward red/orange,
|
|
14
|
+
// tint toward green/magenta. Coarse but keeps the look directionally consistent with Gl.
|
|
15
|
+
const hueDegrees = -temperature * 20 + tint * 10;
|
|
16
|
+
drawCanvasEffectPass(dest, source, `brightness(${brightness}) contrast(${contrast}) saturate(${saturation}) hue-rotate(${hueDegrees}deg)`);
|
|
17
|
+
}
|
|
18
|
+
export const defaultCanvasColorGradeEffectRunner = (ctx, effect) => {
|
|
19
|
+
applyColorGradeEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=canvasColorGradeEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasColorGradeEffect.js","sourceRoot":"","sources":["../src/canvasColorGradeEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,8FAA8F;AAC9F,wGAAwG;AACxG,uGAAuG;AACvG,qEAAqE;AACrE,MAAM,UAAU,6BAA6B,CAC3C,MAAoC,EACpC,IAAkC,EAClC,MAAkC;IAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,+FAA+F;IAC/F,yFAAyF;IACzF,MAAM,UAAU,GAAG,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;IACjD,oBAAoB,CAClB,IAAI,EACJ,MAAM,EACN,cAAc,UAAU,cAAc,QAAQ,cAAc,UAAU,gBAAgB,UAAU,MAAM,CACvG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC3F,6BAA6B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AAClF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, CrtEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyCrtEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<CrtEffect>): void;
|
|
3
|
+
export declare const defaultCanvasCrtEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasCrtEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasCrtEffect.d.ts","sourceRoot":"","sources":["../src/canvasCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAO/F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC3B,IAAI,CAEN;AAED,eAAO,MAAM,4BAA4B,EAAE,wBAE1C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// CRT (PASSTHROUGH): barrel distortion + channel split + scanlines + vignette as one pass. No CSS filter
|
|
3
|
+
// equivalent, but expressible per-pixel via getImageData/putImageData; not yet implemented — passthrough
|
|
4
|
+
// for now. (Scanlines alone is realized separately by applyScanlinesEffectToCanvas.)
|
|
5
|
+
export function applyCrtEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasCrtEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyCrtEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasCrtEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasCrtEffect.js","sourceRoot":"","sources":["../src/canvasCrtEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,yGAAyG;AACzG,yGAAyG;AACzG,qFAAqF;AACrF,MAAM,UAAU,sBAAsB,CACpC,MAAoC,EACpC,IAAkC,EAClC,OAA4B;IAE5B,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpF,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AACpE,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, DirectionalBlurEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyDirectionalBlurEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<DirectionalBlurEffect>): void;
|
|
3
|
+
export declare const defaultCanvasDirectionalBlurEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasDirectionalBlurEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/canvasDirectionalBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAO3G,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACvC,IAAI,CAEN;AAED,eAAO,MAAM,wCAAwC,EAAE,wBAEtD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Directional blur (PASSTHROUGH): accumulating taps stepped along an angle is a per-pixel multi-tap
|
|
3
|
+
// gather. No CSS filter equivalent, but expressible per-pixel via getImageData/putImageData; not yet
|
|
4
|
+
// implemented — passthrough for now.
|
|
5
|
+
export function applyDirectionalBlurEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasDirectionalBlurEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyDirectionalBlurEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasDirectionalBlurEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDirectionalBlurEffect.js","sourceRoot":"","sources":["../src/canvasDirectionalBlurEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,oGAAoG;AACpG,qGAAqG;AACrG,qCAAqC;AACrC,MAAM,UAAU,kCAAkC,CAChD,MAAoC,EACpC,IAAkC,EAClC,OAAwC;IAExC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,wCAAwC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChG,kCAAkC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA+B,CAAC,CAAC;AAC5F,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, DisplacementEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyDisplacementEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<DisplacementEffect>): void;
|
|
3
|
+
export declare const defaultCanvasDisplacementEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasDisplacementEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDisplacementEffect.d.ts","sourceRoot":"","sources":["../src/canvasDisplacementEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAMxG,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,IAAI,CAEN;AAED,eAAO,MAAM,qCAAqC,EAAE,wBAEnD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Displacement / heat-haze (PASSTHROUGH): a per-pixel uv warp. No CSS filter equivalent, but expressible
|
|
3
|
+
// per-pixel via getImageData/putImageData; not yet implemented — passthrough for now.
|
|
4
|
+
export function applyDisplacementEffectToCanvas(source, dest, _effect) {
|
|
5
|
+
passthroughCanvasEffectPass(dest, source);
|
|
6
|
+
}
|
|
7
|
+
export const defaultCanvasDisplacementEffectRunner = (ctx, effect) => {
|
|
8
|
+
applyDisplacementEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=canvasDisplacementEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDisplacementEffect.js","sourceRoot":"","sources":["../src/canvasDisplacementEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,yGAAyG;AACzG,sFAAsF;AACtF,MAAM,UAAU,+BAA+B,CAC7C,MAAoC,EACpC,IAAkC,EAClC,OAAqC;IAErC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,qCAAqC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC7F,+BAA+B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AACtF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, DitherEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyDitherEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<DitherEffect>): void;
|
|
3
|
+
export declare const defaultCanvasDitherEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasDitherEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDitherEffect.d.ts","sourceRoot":"","sources":["../src/canvasDitherEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOlG,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC9B,IAAI,CAEN;AAED,eAAO,MAAM,+BAA+B,EAAE,wBAE7C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Dither (PASSTHROUGH): ordered-Bayer quantization is per-pixel threshold math. No CSS filter
|
|
3
|
+
// equivalent, but expressible per-pixel via getImageData/putImageData; not yet implemented — passthrough
|
|
4
|
+
// for now.
|
|
5
|
+
export function applyDitherEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasDitherEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyDitherEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasDitherEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasDitherEffect.js","sourceRoot":"","sources":["../src/canvasDitherEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,8FAA8F;AAC9F,yGAAyG;AACzG,WAAW;AACX,MAAM,UAAU,yBAAyB,CACvC,MAAoC,EACpC,IAAkC,EAClC,OAA+B;IAE/B,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACvF,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AAC1E,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CanvasRenderTarget } from '@flighthq/types';
|
|
2
|
+
export declare function drawCanvasAccumulationPass(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, samples: number, perSampleTransform: (ctx: CanvasRenderingContext2D, index: number, total: number) => void): void;
|
|
3
|
+
export declare function drawCanvasEffectPass(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, filter: string, compositeOperation?: GlobalCompositeOperation): void;
|
|
4
|
+
export declare function drawCanvasImageDataPass(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>, transform: (data: Uint8ClampedArray, pixelCount: number) => void): void;
|
|
5
|
+
export declare function passthroughCanvasEffectPass(dest: Readonly<CanvasRenderTarget>, source: Readonly<CanvasRenderTarget>): void;
|
|
6
|
+
//# sourceMappingURL=canvasEffectCompositing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasEffectCompositing.d.ts","sourceRoot":"","sources":["../src/canvasEffectCompositing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAY1D,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACxF,IAAI,CAgBN;AAMD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,wBAAwC,GAC3D,IAAI,CAYN;AAOD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAC/D,IAAI,CAkBN;AAOD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAEN"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Shared Canvas 2D draw helpers for effect recipes. These keep every recipe's compositing boilerplate
|
|
2
|
+
// — save/restore, transform reset, alpha/filter reset, clearing — in one place so each apply* function
|
|
3
|
+
// is just its own filter string or draw-op logic.
|
|
4
|
+
// Accumulates `samples` draws of `source` into `dest` using overlapping globalAlpha, where each draw
|
|
5
|
+
// is positioned / scaled by `perSampleTransform`. The shared primitive behind directional blur, radial
|
|
6
|
+
// blur, motion blur, and god-rays. `dest` is cleared before the first draw. Each sample draws with
|
|
7
|
+
// alpha = 1/samples so that the accumulated result integrates to ~1 over the full sample count.
|
|
8
|
+
// `perSampleTransform` receives the zero-based sample index and the total sample count and must apply
|
|
9
|
+
// any 2D transform to `ctx` (translate, scale, rotate) before the drawImage call.
|
|
10
|
+
export function drawCanvasAccumulationPass(dest, source, samples, perSampleTransform) {
|
|
11
|
+
const clampedSamples = Math.max(1, Math.round(samples));
|
|
12
|
+
const ctx = dest.context;
|
|
13
|
+
ctx.save();
|
|
14
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
15
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
16
|
+
ctx.filter = 'none';
|
|
17
|
+
ctx.clearRect(0, 0, dest.width, dest.height);
|
|
18
|
+
ctx.globalAlpha = 1 / clampedSamples;
|
|
19
|
+
for (let i = 0; i < clampedSamples; i++) {
|
|
20
|
+
ctx.save();
|
|
21
|
+
perSampleTransform(ctx, i, clampedSamples);
|
|
22
|
+
ctx.drawImage(source.canvas, 0, 0);
|
|
23
|
+
ctx.restore();
|
|
24
|
+
}
|
|
25
|
+
ctx.restore();
|
|
26
|
+
}
|
|
27
|
+
// Draws `source` into `dest` 1:1 with an optional CSS filter chain and globalCompositeOperation,
|
|
28
|
+
// resetting transform/alpha/filter first so a recipe never inherits a caller's canvas state. `dest` is
|
|
29
|
+
// cleared before drawing so the result is exactly `source` under the given filter, not blended over
|
|
30
|
+
// stale pixels.
|
|
31
|
+
export function drawCanvasEffectPass(dest, source, filter, compositeOperation = 'source-over') {
|
|
32
|
+
const ctx = dest.context;
|
|
33
|
+
ctx.save();
|
|
34
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
35
|
+
ctx.globalAlpha = 1;
|
|
36
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
37
|
+
ctx.filter = 'none';
|
|
38
|
+
ctx.clearRect(0, 0, dest.width, dest.height);
|
|
39
|
+
ctx.globalCompositeOperation = compositeOperation;
|
|
40
|
+
ctx.filter = filter;
|
|
41
|
+
ctx.drawImage(source.canvas, 0, 0);
|
|
42
|
+
ctx.restore();
|
|
43
|
+
}
|
|
44
|
+
// Reads all pixels from `source` into an ImageData buffer, applies `transform` over the raw RGBA
|
|
45
|
+
// bytes, then writes the result into `dest`. `transform` receives the RGBA Uint8ClampedArray and
|
|
46
|
+
// the pixel count; it should mutate the array in place. `dest` is cleared before writing. This is
|
|
47
|
+
// the per-pixel pass primitive for effects that have no CSS filter equivalent but are expressible
|
|
48
|
+
// via getImageData / putImageData on Canvas 2D.
|
|
49
|
+
export function drawCanvasImageDataPass(dest, source, transform) {
|
|
50
|
+
const w = source.width;
|
|
51
|
+
const h = source.height;
|
|
52
|
+
if (w <= 0 || h <= 0)
|
|
53
|
+
return;
|
|
54
|
+
const srcCtx = source.context;
|
|
55
|
+
const imageData = srcCtx.getImageData(0, 0, w, h);
|
|
56
|
+
const data = imageData.data;
|
|
57
|
+
const pixelCount = w * h;
|
|
58
|
+
transform(data, pixelCount);
|
|
59
|
+
const dstCtx = dest.context;
|
|
60
|
+
dstCtx.save();
|
|
61
|
+
dstCtx.setTransform(1, 0, 0, 1, 0, 0);
|
|
62
|
+
dstCtx.globalAlpha = 1;
|
|
63
|
+
dstCtx.globalCompositeOperation = 'source-over';
|
|
64
|
+
dstCtx.filter = 'none';
|
|
65
|
+
dstCtx.clearRect(0, 0, dest.width, dest.height);
|
|
66
|
+
dstCtx.putImageData(imageData, 0, 0);
|
|
67
|
+
dstCtx.restore();
|
|
68
|
+
}
|
|
69
|
+
// Copies `source` into `dest` unchanged. The Canvas realization for effects not carried out on Canvas 2D
|
|
70
|
+
// — either genuinely unsupportable here (they need a depth/normal, velocity, or temporal-history buffer the
|
|
71
|
+
// 2D context does not expose) or expressible per-pixel via getImageData/putImageData but not yet
|
|
72
|
+
// implemented. Either way the pipeline stage is preserved so the registry stays populated for parity, but
|
|
73
|
+
// the image is untouched.
|
|
74
|
+
export function passthroughCanvasEffectPass(dest, source) {
|
|
75
|
+
drawCanvasEffectPass(dest, source, 'none');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=canvasEffectCompositing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasEffectCompositing.js","sourceRoot":"","sources":["../src/canvasEffectCompositing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, ExposureEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyExposureEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<ExposureEffect>): void;
|
|
3
|
+
export declare const defaultCanvasExposureEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasExposureEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasExposureEffect.d.ts","sourceRoot":"","sources":["../src/canvasExposureEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOpG,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAChC,IAAI,CAEN;AAED,eAAO,MAAM,iCAAiC,EAAE,wBAE/C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Exposure (PASSTHROUGH): scaling color by 2^stops. No CSS filter equivalent, but expressible per-pixel
|
|
3
|
+
// via getImageData/putImageData; not yet implemented — passthrough for now. (Operates on already-clamped
|
|
4
|
+
// 8-bit input, with no HDR headroom above 1.0, so the result is approximate.)
|
|
5
|
+
export function applyExposureEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasExposureEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyExposureEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasExposureEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasExposureEffect.js","sourceRoot":"","sources":["../src/canvasExposureEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,wGAAwG;AACxG,yGAAyG;AACzG,8EAA8E;AAC9E,MAAM,UAAU,2BAA2B,CACzC,MAAoC,EACpC,IAAkC,EAClC,OAAiC;IAEjC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,iCAAiC,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,2BAA2B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AAC9E,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, CanvasRenderTargetPool, FilmGrainEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyFilmGrainEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, pool: CanvasRenderTargetPool, effect: Readonly<FilmGrainEffect>): void;
|
|
3
|
+
export declare const defaultCanvasFilmGrainEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasFilmGrainEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasFilmGrainEffect.d.ts","sourceRoot":"","sources":["../src/canvasFilmGrainEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAQzB,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,CA4CN;AAED,eAAO,MAAM,kCAAkC,EAAE,wBAEhD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { drawCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
import { acquireCanvasRenderTarget, releaseCanvasRenderTarget } from './canvasRenderEffectPipeline';
|
|
3
|
+
// Film grain (REAL): draw the scene, then overlay a tiled noise pattern at `intensity` via the
|
|
4
|
+
// 'overlay' composite op. The noise is generated once into a small scratch canvas (cell size from
|
|
5
|
+
// `size`, jittered by `seed`) and tiled across the frame as a repeating fill pattern.
|
|
6
|
+
export function applyFilmGrainEffectToCanvas(source, dest, pool, effect) {
|
|
7
|
+
const intensity = effect.intensity ?? 0.1;
|
|
8
|
+
const size = Math.max(1, Math.round(effect.size ?? 1));
|
|
9
|
+
const seed = effect.seed ?? 0;
|
|
10
|
+
drawCanvasEffectPass(dest, source, 'none');
|
|
11
|
+
// Build a tileable noise patch. A 64-cell square keeps the pattern allocation small while large
|
|
12
|
+
// enough to avoid an obvious repeat.
|
|
13
|
+
const cells = 64;
|
|
14
|
+
const patchSize = cells * size;
|
|
15
|
+
const noise = acquireCanvasRenderTarget(pool, patchSize, patchSize);
|
|
16
|
+
const nctx = noise.context;
|
|
17
|
+
nctx.save();
|
|
18
|
+
nctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
19
|
+
nctx.globalCompositeOperation = 'source-over';
|
|
20
|
+
nctx.filter = 'none';
|
|
21
|
+
nctx.clearRect(0, 0, patchSize, patchSize);
|
|
22
|
+
let s = seed;
|
|
23
|
+
for (let y = 0; y < cells; y++) {
|
|
24
|
+
for (let x = 0; x < cells; x++) {
|
|
25
|
+
// Cheap deterministic hash so the grain is stable for a given seed and animatable by changing it.
|
|
26
|
+
s = (s * 1103515245 + 12345) & 0x7fffffff;
|
|
27
|
+
const v = Math.floor((s / 0x7fffffff) * 255);
|
|
28
|
+
nctx.fillStyle = `rgb(${v},${v},${v})`;
|
|
29
|
+
nctx.fillRect(x * size, y * size, size, size);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
nctx.restore();
|
|
33
|
+
const ctx = dest.context;
|
|
34
|
+
ctx.save();
|
|
35
|
+
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
36
|
+
ctx.filter = 'none';
|
|
37
|
+
ctx.globalCompositeOperation = 'overlay';
|
|
38
|
+
ctx.globalAlpha = Math.max(0, Math.min(1, intensity));
|
|
39
|
+
const pattern = ctx.createPattern(noise.canvas, 'repeat');
|
|
40
|
+
if (pattern !== null) {
|
|
41
|
+
ctx.fillStyle = pattern;
|
|
42
|
+
ctx.fillRect(0, 0, dest.width, dest.height);
|
|
43
|
+
}
|
|
44
|
+
ctx.restore();
|
|
45
|
+
releaseCanvasRenderTarget(pool, noise);
|
|
46
|
+
}
|
|
47
|
+
export const defaultCanvasFilmGrainEffectRunner = (ctx, effect) => {
|
|
48
|
+
applyFilmGrainEffectToCanvas(ctx.source, ctx.dest, ctx.pool, effect);
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=canvasFilmGrainEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasFilmGrainEffect.js","sourceRoot":"","sources":["../src/canvasFilmGrainEffect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, FxaaEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyFxaaEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<FxaaEffect>): void;
|
|
3
|
+
export declare const defaultCanvasFxaaEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasFxaaEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasFxaaEffect.d.ts","sourceRoot":"","sources":["../src/canvasFxaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOhG,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC5B,IAAI,CAEN;AAED,eAAO,MAAM,6BAA6B,EAAE,wBAE3C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// FXAA (PASSTHROUGH): luminance edge detection + directional blend is per-pixel neighbor sampling. No
|
|
3
|
+
// CSS filter equivalent, but expressible per-pixel via getImageData/putImageData; not yet implemented —
|
|
4
|
+
// passthrough for now.
|
|
5
|
+
export function applyFxaaEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasFxaaEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyFxaaEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasFxaaEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasFxaaEffect.js","sourceRoot":"","sources":["../src/canvasFxaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,sGAAsG;AACtG,wGAAwG;AACxG,uBAAuB;AACvB,MAAM,UAAU,uBAAuB,CACrC,MAAoC,EACpC,IAAkC,EAClC,OAA6B;IAE7B,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AACtE,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CanvasRenderEffectRunner, CanvasRenderTarget, GlitchEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyGlitchEffectToCanvas(source: Readonly<CanvasRenderTarget>, dest: Readonly<CanvasRenderTarget>, _effect: Readonly<GlitchEffect>): void;
|
|
3
|
+
export declare const defaultCanvasGlitchEffectRunner: CanvasRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=canvasGlitchEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasGlitchEffect.d.ts","sourceRoot":"","sources":["../src/canvasGlitchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOlG,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAClC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC9B,IAAI,CAEN;AAED,eAAO,MAAM,+BAA+B,EAAE,wBAE7C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { passthroughCanvasEffectPass } from './canvasEffectCompositing';
|
|
2
|
+
// Glitch (PASSTHROUGH): per-pixel RGB channel separation and hashed block tears (like
|
|
3
|
+
// chromaticAberration). No CSS filter equivalent, but expressible per-pixel via getImageData/putImageData;
|
|
4
|
+
// not yet implemented — passthrough for now.
|
|
5
|
+
export function applyGlitchEffectToCanvas(source, dest, _effect) {
|
|
6
|
+
passthroughCanvasEffectPass(dest, source);
|
|
7
|
+
}
|
|
8
|
+
export const defaultCanvasGlitchEffectRunner = (ctx, effect) => {
|
|
9
|
+
applyGlitchEffectToCanvas(ctx.source, ctx.dest, effect);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=canvasGlitchEffect.js.map
|