@remotion/effects 4.0.539 → 4.0.540
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/THIRD_PARTY_LICENSES.md +15 -0
- package/dist/barrel-distortion/webgpu-shader.d.ts +1 -0
- package/dist/bevel-alpha/webgpu-shaders.d.ts +2 -0
- package/dist/burlap-webgpu-shader.d.ts +1 -0
- package/dist/checkerboard-webgpu-shader.d.ts +1 -0
- package/dist/chromatic-aberration/webgpu-shader.d.ts +1 -0
- package/dist/color-correction-webgpu-shader-utils.d.ts +4 -0
- package/dist/color-key-webgpu-shader.d.ts +1 -0
- package/dist/color-matrix-runtime.d.ts +4 -0
- package/dist/contour-lines-webgpu-shader.d.ts +1 -0
- package/dist/corner-pin/webgpu-shader.d.ts +1 -0
- package/dist/cylinder/webgl-shader.d.ts +1 -0
- package/dist/dot-grid-webgpu-shader.d.ts +1 -0
- package/dist/drop-shadow/webgpu-shaders.d.ts +2 -0
- package/dist/emboss-webgpu-shader.d.ts +1 -0
- package/dist/esm/barrel-distortion.mjs +67 -118
- package/dist/esm/bevel-alpha.mjs +247 -196
- package/dist/esm/blur.mjs +101 -115
- package/dist/esm/brightness.mjs +65 -132
- package/dist/esm/burlap.mjs +178 -151
- package/dist/esm/checkerboard.mjs +6 -514
- package/dist/esm/chromatic-aberration.mjs +72 -119
- package/dist/esm/color-correction.mjs +186 -224
- package/dist/esm/color-key.mjs +149 -136
- package/dist/esm/contour-lines.mjs +201 -160
- package/dist/esm/contrast.mjs +65 -132
- package/dist/esm/corner-pin.mjs +4 -390
- package/dist/esm/curves.mjs +195 -211
- package/dist/esm/cylinder.mjs +108 -225
- package/dist/esm/dot-grid.mjs +184 -213
- package/dist/esm/drop-shadow.mjs +162 -180
- package/dist/esm/duotone.mjs +110 -143
- package/dist/esm/emboss.mjs +153 -151
- package/dist/esm/evolve.mjs +228 -154
- package/dist/esm/exposure.mjs +93 -201
- package/dist/esm/film-burn.mjs +298 -0
- package/dist/esm/fisheye.mjs +97 -126
- package/dist/esm/flannel.mjs +158 -156
- package/dist/esm/fractal-noise.mjs +186 -232
- package/dist/esm/glow.mjs +164 -179
- package/dist/esm/grayscale.mjs +56 -122
- package/dist/esm/gridlines.mjs +6 -575
- package/dist/esm/halftone-linear-gradient.mjs +246 -245
- package/dist/esm/halftone.mjs +267 -243
- package/dist/esm/hue.mjs +55 -122
- package/dist/esm/index-00v3hr66.mjs +299 -0
- package/dist/esm/index-0w4eqht8.mjs +351 -0
- package/dist/esm/index-18y0zcy2.mjs +440 -0
- package/dist/esm/index-1m1b1ad7.mjs +520 -0
- package/dist/esm/index-34fxm3ax.mjs +518 -0
- package/dist/esm/index-4fvp93ps.mjs +32 -0
- package/dist/esm/index-4scpn12x.mjs +224 -0
- package/dist/esm/index-4z6pt3ka.mjs +104 -0
- package/dist/esm/index-618ky75w.mjs +51 -0
- package/dist/esm/index-6agxdrvr.mjs +411 -0
- package/dist/esm/index-6jkps947.mjs +120 -0
- package/dist/esm/index-8agtsbw4.mjs +617 -0
- package/dist/esm/index-8jx11jyn.mjs +29 -0
- package/dist/esm/index-8p04sssx.mjs +123 -0
- package/dist/esm/index-afdtmrh2.mjs +596 -0
- package/dist/esm/index-b86qstcs.mjs +18 -0
- package/dist/esm/index-cb77qg3g.mjs +587 -0
- package/dist/esm/index-cdp7tr8x.mjs +122 -0
- package/dist/esm/index-evy8hyah.mjs +55 -0
- package/dist/esm/index-gnsce796.mjs +6 -0
- package/dist/esm/index-kkvzt8b7.mjs +199 -0
- package/dist/esm/index-r0v18b2n.mjs +425 -0
- package/dist/esm/index-rswpzmm5.mjs +926 -0
- package/dist/esm/index-s9mrx750.mjs +97 -0
- package/dist/esm/index-tvfexb7s.mjs +164 -0
- package/dist/esm/index-vp56k1gj.mjs +215 -0
- package/dist/esm/index-wxhvgv2s.mjs +79 -0
- package/dist/esm/index-wy95a41r.mjs +407 -0
- package/dist/esm/index-ysnwfc4t.mjs +306 -0
- package/dist/esm/index.mjs +49 -4053
- package/dist/esm/invert.mjs +54 -122
- package/dist/esm/iris-wipe.mjs +315 -0
- package/dist/esm/lens-blur.mjs +169 -156
- package/dist/esm/levels.mjs +134 -151
- package/dist/esm/light-leak.mjs +6 -416
- package/dist/esm/light-trail.mjs +124 -128
- package/dist/esm/linear-gradient-tint.mjs +4 -424
- package/dist/esm/linear-gradient.mjs +4 -370
- package/dist/esm/linear-progressive-blur.mjs +92 -118
- package/dist/esm/linear-progressive-pixelate.mjs +83 -378
- package/dist/esm/lines.mjs +167 -162
- package/dist/esm/liquid-contours.mjs +192 -153
- package/dist/esm/long-shadows.mjs +278 -251
- package/dist/esm/lut.mjs +123 -23
- package/dist/esm/mirror.mjs +78 -120
- package/dist/esm/noise-displacement.mjs +156 -151
- package/dist/esm/noise.mjs +107 -143
- package/dist/esm/outline.mjs +192 -170
- package/dist/esm/page-turn.mjs +141 -244
- package/dist/esm/paper.mjs +522 -194
- package/dist/esm/pattern.mjs +4 -568
- package/dist/esm/pixel-dissolve.mjs +158 -186
- package/dist/esm/pixelate.mjs +92 -149
- package/dist/esm/radial-progressive-blur.mjs +96 -118
- package/dist/esm/radial-progressive-pixelate.mjs +91 -384
- package/dist/esm/radial-wipe.mjs +224 -0
- package/dist/esm/rain-fall.mjs +114 -0
- package/dist/esm/region-blur.mjs +138 -192
- package/dist/esm/rings.mjs +6 -512
- package/dist/esm/roughen-edges.mjs +180 -156
- package/dist/esm/saturation.mjs +56 -122
- package/dist/esm/scale.mjs +50 -60
- package/dist/esm/scanlines.mjs +115 -149
- package/dist/esm/shadows-highlights.mjs +103 -205
- package/dist/esm/shatter.mjs +133 -153
- package/dist/esm/shine.mjs +192 -227
- package/dist/esm/shrinkwrap.mjs +388 -225
- package/dist/esm/skew.mjs +100 -145
- package/dist/esm/snow-fall.mjs +170 -0
- package/dist/esm/speckle.mjs +192 -210
- package/dist/esm/sphere.mjs +101 -225
- package/dist/esm/starburst.mjs +6 -345
- package/dist/esm/tear.mjs +138 -155
- package/dist/esm/thermal-vision.mjs +135 -152
- package/dist/esm/tile.mjs +5 -184
- package/dist/esm/tint.mjs +80 -132
- package/dist/esm/translate.mjs +55 -137
- package/dist/esm/turbulent-displace.mjs +182 -221
- package/dist/esm/tv-signal-off.mjs +140 -149
- package/dist/esm/venetian-blinds.mjs +91 -140
- package/dist/esm/vibrance.mjs +95 -204
- package/dist/esm/vignette.mjs +136 -155
- package/dist/esm/wave.mjs +88 -47
- package/dist/esm/waves.mjs +181 -169
- package/dist/esm/white-balance.mjs +100 -204
- package/dist/esm/white-noise.mjs +98 -146
- package/dist/esm/zigzag.mjs +6 -575
- package/dist/esm/zoom-blur.mjs +90 -121
- package/dist/evolve.d.ts +46 -10
- package/dist/film-burn-webgpu-shader.d.ts +1 -0
- package/dist/film-burn.d.ts +40 -0
- package/dist/fisheye/webgpu-shader.d.ts +1 -0
- package/dist/flannel-webgpu-shader.d.ts +1 -0
- package/dist/fractal-noise/shader.d.ts +1 -1
- package/dist/fractal-noise/webgpu-shader.d.ts +1 -0
- package/dist/gaussian-blur-webgpu-shader.d.ts +1 -0
- package/dist/glow/webgpu-shaders.d.ts +2 -0
- package/dist/gridlines-webgpu-shader.d.ts +1 -0
- package/dist/halftone-linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/halftone-webgpu-shader.d.ts +1 -0
- package/dist/iris-wipe.d.ts +78 -0
- package/dist/lens-blur/webgpu-shader.d.ts +1 -0
- package/dist/light-leak-webgpu-shader.d.ts +1 -0
- package/dist/light-trail/webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-tint-webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/lines-webgpu-shader.d.ts +1 -0
- package/dist/liquid-contours-webgpu-shader.d.ts +1 -0
- package/dist/long-shadows-webgpu-shaders.d.ts +2 -0
- package/dist/lut/webgpu-shader.d.ts +1 -0
- package/dist/mirror/webgpu-shader.d.ts +1 -0
- package/dist/noise-displacement-webgpu-shader.d.ts +1 -0
- package/dist/noise-webgpu-shader.d.ts +1 -0
- package/dist/outline/webgpu-shader.d.ts +1 -0
- package/dist/page-turn/webgl-shader.d.ts +1 -0
- package/dist/paper-webgpu-shader.d.ts +2 -0
- package/dist/pattern-webgpu-shader.d.ts +1 -0
- package/dist/pixel-dissolve-webgpu-shader.d.ts +1 -0
- package/dist/progressive-pixelate-runtime.d.ts +1 -0
- package/dist/radial-wipe.d.ts +19 -0
- package/dist/rain-fall.d.ts +143 -0
- package/dist/rect-transform-runtime.d.ts +11 -0
- package/dist/region-blur/webgpu-shader.d.ts +1 -0
- package/dist/rings-webgpu-shader.d.ts +1 -0
- package/dist/roughen-edges-webgpu-shader.d.ts +1 -0
- package/dist/shatter/webgpu-shader.d.ts +1 -0
- package/dist/shine-webgpu-shader.d.ts +1 -0
- package/dist/shrinkwrap-webgpu-shader.d.ts +1 -0
- package/dist/single-pass-runtime.d.ts +18 -0
- package/dist/skew-webgpu-shader.d.ts +1 -0
- package/dist/snow-fall.d.ts +208 -0
- package/dist/speckle-webgpu-shader.d.ts +1 -0
- package/dist/sphere/webgl-shader.d.ts +1 -0
- package/dist/starburst-webgpu-shader.d.ts +1 -0
- package/dist/tear-webgpu-shader.d.ts +1 -0
- package/dist/thermal-vision-webgpu-shader.d.ts +1 -0
- package/dist/tile-gpu-runtime.d.ts +24 -0
- package/dist/turbulent-displace/webgpu-shader.d.ts +1 -0
- package/dist/value-noise-webgpu-shader.d.ts +1 -0
- package/dist/vignette-webgpu-shader.d.ts +1 -0
- package/dist/wave/wave-runtime.d.ts +2 -1
- package/dist/wave/webgpu-shader.d.ts +1 -0
- package/dist/waves-webgpu-shader.d.ts +1 -0
- package/dist/weather/params.d.ts +149 -0
- package/dist/weather/runtime.d.ts +52 -0
- package/dist/weather/shaders.d.ts +4 -0
- package/dist/weather/webgpu-runtime.d.ts +36 -0
- package/dist/weather/webgpu-shader.d.ts +1 -0
- package/dist/webgl-projection-runtime.d.ts +18 -0
- package/dist/webgpu-color-state.d.ts +10 -0
- package/dist/webgpu-mesh-runtime.d.ts +46 -0
- package/dist/webgpu-multipass-runtime.d.ts +50 -0
- package/dist/webgpu-projection-runtime.d.ts +9 -5
- package/dist/webgpu-single-pass-runtime.d.ts +47 -0
- package/dist/white-noise-webgpu-shader.d.ts +1 -0
- package/dist/zigzag-webgpu-shader.d.ts +1 -0
- package/dist/zoom-blur/webgpu-shader.d.ts +1 -0
- package/package.json +43 -3
|
@@ -1,111 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateNonNegative
|
|
4
|
+
} from "./index-wxhvgv2s.mjs";
|
|
5
|
+
import {
|
|
6
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
7
|
+
setupWebGpuSinglePass,
|
|
8
|
+
cleanupWebGpuSinglePass,
|
|
9
|
+
applyWebGpuSinglePass
|
|
10
|
+
} from "./index-tvfexb7s.mjs";
|
|
11
|
+
import {
|
|
12
|
+
assertEffectParamsObject
|
|
13
|
+
} from "./index-4fvp93ps.mjs";
|
|
14
|
+
|
|
1
15
|
// src/chromatic-aberration/index.ts
|
|
2
16
|
import { Internals as Internals2 } from "remotion";
|
|
3
17
|
|
|
4
|
-
// src/validate-effect-param.ts
|
|
5
|
-
var assertEffectParamsObject = (params, effectLabel) => {
|
|
6
|
-
if (params === null || typeof params !== "object") {
|
|
7
|
-
throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var assertRequiredFiniteNumber = (value, name) => {
|
|
11
|
-
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
12
|
-
throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
var assertRequiredColor = (value, name) => {
|
|
16
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
17
|
-
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
var assertOptionalColor = (value, name) => {
|
|
21
|
-
if (value === undefined) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
assertRequiredColor(value, name);
|
|
25
|
-
};
|
|
26
|
-
var assertOptionalBoolean = (value, name) => {
|
|
27
|
-
if (value === undefined) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
if (typeof value !== "boolean") {
|
|
31
|
-
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// src/color-utils.ts
|
|
36
|
-
var DEFAULT_AMOUNT = 1;
|
|
37
|
-
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
38
|
-
var DEFAULT_HUE_DEGREES = 0;
|
|
39
|
-
var colorAmountSchema = {
|
|
40
|
-
type: "number",
|
|
41
|
-
min: 0,
|
|
42
|
-
max: 1,
|
|
43
|
-
step: 0.01,
|
|
44
|
-
default: DEFAULT_AMOUNT,
|
|
45
|
-
description: "Amount",
|
|
46
|
-
hiddenFromList: false
|
|
47
|
-
};
|
|
48
|
-
var colorMultiplierSchema = {
|
|
49
|
-
type: "number",
|
|
50
|
-
min: 0,
|
|
51
|
-
step: 0.01,
|
|
52
|
-
default: DEFAULT_AMOUNT,
|
|
53
|
-
description: "Amount",
|
|
54
|
-
hiddenFromList: false
|
|
55
|
-
};
|
|
56
|
-
var brightnessAmountSchema = {
|
|
57
|
-
type: "number",
|
|
58
|
-
min: -1,
|
|
59
|
-
max: 1,
|
|
60
|
-
step: 0.01,
|
|
61
|
-
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
62
|
-
description: "Amount",
|
|
63
|
-
hiddenFromList: false
|
|
64
|
-
};
|
|
65
|
-
var hueDegreesSchema = {
|
|
66
|
-
type: "rotation-degrees",
|
|
67
|
-
step: 1,
|
|
68
|
-
default: DEFAULT_HUE_DEGREES,
|
|
69
|
-
description: "Degrees"
|
|
70
|
-
};
|
|
71
|
-
var assertOptionalFiniteNumber = (value, name) => {
|
|
72
|
-
if (value === undefined) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
assertRequiredFiniteNumber(value, name);
|
|
76
|
-
};
|
|
77
|
-
var validateUnitInterval = (value, name) => {
|
|
78
|
-
if (value < 0) {
|
|
79
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
80
|
-
}
|
|
81
|
-
if (value > 1) {
|
|
82
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
var validateNonNegative = (value, name) => {
|
|
86
|
-
if (value < 0) {
|
|
87
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
var validateSignedUnitInterval = (value, name) => {
|
|
91
|
-
if (value < -1) {
|
|
92
|
-
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
93
|
-
}
|
|
94
|
-
if (value > 1) {
|
|
95
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
var clampColorChannel = (value) => {
|
|
99
|
-
return Math.max(0, Math.min(255, value));
|
|
100
|
-
};
|
|
101
|
-
var parseColorRgba = (ctx, color) => {
|
|
102
|
-
ctx.clearRect(0, 0, 1, 1);
|
|
103
|
-
ctx.fillStyle = color;
|
|
104
|
-
ctx.fillRect(0, 0, 1, 1);
|
|
105
|
-
const { data } = ctx.getImageData(0, 0, 1, 1);
|
|
106
|
-
return [data[0], data[1], data[2], data[3]];
|
|
107
|
-
};
|
|
108
|
-
|
|
109
18
|
// src/chromatic-aberration/chromatic-aberration-runtime.ts
|
|
110
19
|
import { Internals } from "remotion";
|
|
111
20
|
|
|
@@ -292,6 +201,21 @@ var applyChromaticAberration = ({
|
|
|
292
201
|
gl.useProgram(null);
|
|
293
202
|
};
|
|
294
203
|
|
|
204
|
+
// src/chromatic-aberration/webgpu-shader.ts
|
|
205
|
+
var CHROMATIC_ABERRATION_WEBGPU_SHADER = `
|
|
206
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
207
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
208
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
209
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
210
|
+
struct Params { offset: vec4f, }
|
|
211
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
212
|
+
let red = textureSampleLevel(source, sourceSampler, input.uv - params.offset.xy, 0);
|
|
213
|
+
let center = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
214
|
+
let blue = textureSampleLevel(source, sourceSampler, input.uv + params.offset.xy, 0);
|
|
215
|
+
return vec4f(red.r, center.g, blue.b, center.a);
|
|
216
|
+
}
|
|
217
|
+
`;
|
|
218
|
+
|
|
295
219
|
// src/chromatic-aberration/index.ts
|
|
296
220
|
var { createEffect } = Internals2;
|
|
297
221
|
var DEFAULT_CHROMATIC_ABERRATION_AMOUNT = 8;
|
|
@@ -328,25 +252,54 @@ var chromaticAberration = createEffect({
|
|
|
328
252
|
type: "dev.remotion.effects.chromaticAberration",
|
|
329
253
|
label: "chromaticAberration()",
|
|
330
254
|
documentationLink: "https://www.remotion.dev/docs/effects/chromatic-aberration",
|
|
331
|
-
backend: "webgl2",
|
|
332
255
|
calculateKey: (params) => {
|
|
333
256
|
const resolved = resolve(params);
|
|
334
257
|
return `chromatic-aberration-${resolved.amount}-${resolved.angle}`;
|
|
335
258
|
},
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
259
|
+
implementations: {
|
|
260
|
+
webgpu: Internals2.createEffectImplementation({
|
|
261
|
+
setup: (target) => setupWebGpuSinglePass(target, "chromatic-aberration"),
|
|
262
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
263
|
+
if (!gpuDevice) {
|
|
264
|
+
throw new Error("A WebGPU device is required for the chromatic-aberration effect");
|
|
265
|
+
}
|
|
266
|
+
const r = resolve(params);
|
|
267
|
+
const radians = r.angle * Math.PI / 180;
|
|
268
|
+
const uniformData = new Float32Array([
|
|
269
|
+
Math.cos(radians) * r.amount / width,
|
|
270
|
+
-(Math.sin(radians) * r.amount) / height,
|
|
271
|
+
0,
|
|
272
|
+
0
|
|
273
|
+
]);
|
|
274
|
+
applyWebGpuSinglePass({
|
|
275
|
+
state,
|
|
276
|
+
source,
|
|
277
|
+
width,
|
|
278
|
+
height,
|
|
279
|
+
device: gpuDevice,
|
|
280
|
+
shader: CHROMATIC_ABERRATION_WEBGPU_SHADER,
|
|
281
|
+
uniformData
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
cleanup: cleanupWebGpuSinglePass
|
|
285
|
+
}),
|
|
286
|
+
webgl2: Internals2.createEffectImplementation({
|
|
287
|
+
setup: (target) => setupChromaticAberration(target),
|
|
288
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
289
|
+
const resolved = resolve(params);
|
|
290
|
+
applyChromaticAberration({
|
|
291
|
+
state,
|
|
292
|
+
source,
|
|
293
|
+
width,
|
|
294
|
+
height,
|
|
295
|
+
amount: resolved.amount,
|
|
296
|
+
angle: resolved.angle,
|
|
297
|
+
flipSourceY
|
|
298
|
+
});
|
|
299
|
+
},
|
|
300
|
+
cleanup: (state) => cleanupChromaticAberration(state)
|
|
301
|
+
})
|
|
348
302
|
},
|
|
349
|
-
cleanup: (state) => cleanupChromaticAberration(state),
|
|
350
303
|
schema: chromaticAberrationSchema,
|
|
351
304
|
validateParams: validateChromaticAberrationParams
|
|
352
305
|
});
|
|
@@ -1,177 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
`;
|
|
28
|
-
var SHADOWS_HIGHLIGHTS_GLSL = `
|
|
29
|
-
float getShadowsHighlightsStops(
|
|
30
|
-
vec3 color,
|
|
31
|
-
float shadows,
|
|
32
|
-
float highlights
|
|
33
|
-
) {
|
|
34
|
-
float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
|
|
35
|
-
float shadowWeight = 1.0 - smoothstep(0.0, 0.6, luminance);
|
|
36
|
-
float highlightWeight = smoothstep(0.4, 1.0, luminance);
|
|
37
|
-
shadowWeight *= shadowWeight;
|
|
38
|
-
highlightWeight *= highlightWeight;
|
|
39
|
-
return shadows * shadowWeight + highlights * highlightWeight;
|
|
40
|
-
}
|
|
41
|
-
`;
|
|
42
|
-
var VIBRANCE_GLSL = `
|
|
43
|
-
vec3 applyVibrance(vec3 color, float amount) {
|
|
44
|
-
float maximum = max(max(color.r, color.g), color.b);
|
|
45
|
-
float minimum = min(min(color.r, color.g), color.b);
|
|
46
|
-
float lightness = (maximum + minimum) * 0.5;
|
|
47
|
-
float chroma = maximum - minimum;
|
|
48
|
-
float saturationDenominator = 1.0 - abs(2.0 * lightness - 1.0);
|
|
49
|
-
float saturation = saturationDenominator <= 0.0
|
|
50
|
-
? 0.0
|
|
51
|
-
: chroma / saturationDenominator;
|
|
52
|
-
|
|
53
|
-
if (saturation <= 0.000001) {
|
|
54
|
-
return color;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
float targetSaturation = amount >= 0.0
|
|
58
|
-
? saturation + amount * (1.0 - saturation)
|
|
59
|
-
: saturation * (1.0 + amount);
|
|
60
|
-
return clamp(
|
|
61
|
-
vec3(lightness) +
|
|
62
|
-
(color - vec3(lightness)) * (targetSaturation / saturation),
|
|
63
|
-
0.0,
|
|
64
|
-
1.0
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
`;
|
|
68
|
-
|
|
69
|
-
// src/validate-effect-param.ts
|
|
70
|
-
var assertEffectParamsObject = (params, effectLabel) => {
|
|
71
|
-
if (params === null || typeof params !== "object") {
|
|
72
|
-
throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
var assertRequiredFiniteNumber = (value, name) => {
|
|
76
|
-
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
77
|
-
throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
var assertRequiredColor = (value, name) => {
|
|
81
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
82
|
-
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
var assertOptionalColor = (value, name) => {
|
|
86
|
-
if (value === undefined) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
assertRequiredColor(value, name);
|
|
90
|
-
};
|
|
91
|
-
var assertOptionalBoolean = (value, name) => {
|
|
92
|
-
if (value === undefined) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
if (typeof value !== "boolean") {
|
|
96
|
-
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// src/color-utils.ts
|
|
101
|
-
var DEFAULT_AMOUNT = 1;
|
|
102
|
-
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
103
|
-
var DEFAULT_HUE_DEGREES = 0;
|
|
104
|
-
var colorAmountSchema = {
|
|
105
|
-
type: "number",
|
|
106
|
-
min: 0,
|
|
107
|
-
max: 1,
|
|
108
|
-
step: 0.01,
|
|
109
|
-
default: DEFAULT_AMOUNT,
|
|
110
|
-
description: "Amount",
|
|
111
|
-
hiddenFromList: false
|
|
112
|
-
};
|
|
113
|
-
var colorMultiplierSchema = {
|
|
114
|
-
type: "number",
|
|
115
|
-
min: 0,
|
|
116
|
-
step: 0.01,
|
|
117
|
-
default: DEFAULT_AMOUNT,
|
|
118
|
-
description: "Amount",
|
|
119
|
-
hiddenFromList: false
|
|
120
|
-
};
|
|
121
|
-
var brightnessAmountSchema = {
|
|
122
|
-
type: "number",
|
|
123
|
-
min: -1,
|
|
124
|
-
max: 1,
|
|
125
|
-
step: 0.01,
|
|
126
|
-
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
127
|
-
description: "Amount",
|
|
128
|
-
hiddenFromList: false
|
|
129
|
-
};
|
|
130
|
-
var hueDegreesSchema = {
|
|
131
|
-
type: "rotation-degrees",
|
|
132
|
-
step: 1,
|
|
133
|
-
default: DEFAULT_HUE_DEGREES,
|
|
134
|
-
description: "Degrees"
|
|
135
|
-
};
|
|
136
|
-
var assertOptionalFiniteNumber = (value, name) => {
|
|
137
|
-
if (value === undefined) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
assertRequiredFiniteNumber(value, name);
|
|
141
|
-
};
|
|
142
|
-
var validateUnitInterval = (value, name) => {
|
|
143
|
-
if (value < 0) {
|
|
144
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
145
|
-
}
|
|
146
|
-
if (value > 1) {
|
|
147
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
var validateNonNegative = (value, name) => {
|
|
151
|
-
if (value < 0) {
|
|
152
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
var validateSignedUnitInterval = (value, name) => {
|
|
156
|
-
if (value < -1) {
|
|
157
|
-
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
158
|
-
}
|
|
159
|
-
if (value > 1) {
|
|
160
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
var clampColorChannel = (value) => {
|
|
164
|
-
return Math.max(0, Math.min(255, value));
|
|
165
|
-
};
|
|
166
|
-
var parseColorRgba = (ctx, color) => {
|
|
167
|
-
ctx.clearRect(0, 0, 1, 1);
|
|
168
|
-
ctx.fillStyle = color;
|
|
169
|
-
ctx.fillRect(0, 0, 1, 1);
|
|
170
|
-
const { data } = ctx.getImageData(0, 0, 1, 1);
|
|
171
|
-
return [data[0], data[1], data[2], data[3]];
|
|
172
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
COLOR_SPACE_GLSL,
|
|
3
|
+
WHITE_BALANCE_GLSL,
|
|
4
|
+
SHADOWS_HIGHLIGHTS_GLSL,
|
|
5
|
+
VIBRANCE_GLSL,
|
|
6
|
+
COLOR_SPACE_WGSL,
|
|
7
|
+
WHITE_BALANCE_WGSL,
|
|
8
|
+
SHADOWS_HIGHLIGHTS_WGSL,
|
|
9
|
+
VIBRANCE_WGSL
|
|
10
|
+
} from "./index-6jkps947.mjs";
|
|
11
|
+
import {
|
|
12
|
+
assertOptionalFiniteNumber,
|
|
13
|
+
validateUnitInterval,
|
|
14
|
+
validateNonNegative,
|
|
15
|
+
validateSignedUnitInterval
|
|
16
|
+
} from "./index-wxhvgv2s.mjs";
|
|
17
|
+
import {
|
|
18
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
19
|
+
setupWebGpuSinglePass,
|
|
20
|
+
cleanupWebGpuSinglePass,
|
|
21
|
+
applyWebGpuSinglePass
|
|
22
|
+
} from "./index-tvfexb7s.mjs";
|
|
23
|
+
import {
|
|
24
|
+
assertEffectParamsObject
|
|
25
|
+
} from "./index-4fvp93ps.mjs";
|
|
173
26
|
|
|
174
27
|
// src/color-correction.ts
|
|
28
|
+
import { Internals } from "remotion";
|
|
175
29
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
176
30
|
var DEFAULT_EXPOSURE = 0;
|
|
177
31
|
var DEFAULT_CONTRAST = 1;
|
|
@@ -394,6 +248,79 @@ void main() {
|
|
|
394
248
|
fragColor = vec4(color * alpha, alpha);
|
|
395
249
|
}
|
|
396
250
|
`;
|
|
251
|
+
var WEBGPU_SHADER = `
|
|
252
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
253
|
+
struct Params {
|
|
254
|
+
exposure: f32,
|
|
255
|
+
contrast: f32,
|
|
256
|
+
pivot: f32,
|
|
257
|
+
shadows: f32,
|
|
258
|
+
highlights: f32,
|
|
259
|
+
whites: f32,
|
|
260
|
+
blacks: f32,
|
|
261
|
+
temperature: f32,
|
|
262
|
+
tint: f32,
|
|
263
|
+
saturation: f32,
|
|
264
|
+
vibrance: f32,
|
|
265
|
+
padding0: f32,
|
|
266
|
+
}
|
|
267
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
268
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
269
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
270
|
+
${COLOR_SPACE_WGSL}
|
|
271
|
+
${WHITE_BALANCE_WGSL}
|
|
272
|
+
${SHADOWS_HIGHLIGHTS_WGSL}
|
|
273
|
+
${VIBRANCE_WGSL}
|
|
274
|
+
|
|
275
|
+
fn applyEndpointTones(inputColor: vec3f, blacks: f32, whites: f32) -> vec3f {
|
|
276
|
+
var color = inputColor;
|
|
277
|
+
let luminance = dot(color, vec3f(0.2126, 0.7152, 0.0722));
|
|
278
|
+
var blackWeight = 1.0 - smoothstep(0.0, 0.35, luminance);
|
|
279
|
+
var whiteWeight = smoothstep(0.65, 1.0, luminance);
|
|
280
|
+
blackWeight *= blackWeight;
|
|
281
|
+
whiteWeight *= whiteWeight;
|
|
282
|
+
if (blacks >= 0.0) {
|
|
283
|
+
color += (vec3f(1.0) - color) * blacks * blackWeight * 0.2;
|
|
284
|
+
} else {
|
|
285
|
+
color *= 1.0 + blacks * blackWeight;
|
|
286
|
+
}
|
|
287
|
+
if (whites >= 0.0) {
|
|
288
|
+
color += (vec3f(1.0) - color) * whites * whiteWeight;
|
|
289
|
+
} else {
|
|
290
|
+
color *= 1.0 + whites * whiteWeight * 0.2;
|
|
291
|
+
}
|
|
292
|
+
return clamp(color, vec3f(0.0), vec3f(1.0));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
296
|
+
let sourceColor = textureSampleLevel(source, sourceSampler, input.uv, 0.0);
|
|
297
|
+
let alpha = sourceColor.a;
|
|
298
|
+
if (alpha <= 0.0) {
|
|
299
|
+
return vec4f(0.0);
|
|
300
|
+
}
|
|
301
|
+
if (
|
|
302
|
+
params.exposure == 0.0 && params.contrast == 1.0 && params.pivot == 0.5 &&
|
|
303
|
+
params.shadows == 0.0 && params.highlights == 0.0 && params.whites == 0.0 &&
|
|
304
|
+
params.blacks == 0.0 && params.temperature == 0.0 && params.tint == 0.0 &&
|
|
305
|
+
params.saturation == 1.0 && params.vibrance == 0.0
|
|
306
|
+
) {
|
|
307
|
+
return sourceColor;
|
|
308
|
+
}
|
|
309
|
+
var color = sourceColor.rgb / alpha;
|
|
310
|
+
var linear = srgbToLinear(color) * exp2(params.exposure);
|
|
311
|
+
linear = applyWhiteBalanceLinear(linear, params.temperature, params.tint);
|
|
312
|
+
color = linearToSrgb(linear);
|
|
313
|
+
let tonalStops = getShadowsHighlightsStops(color, params.shadows, params.highlights);
|
|
314
|
+
linear = srgbToLinear(color) * exp2(tonalStops);
|
|
315
|
+
color = linearToSrgb(linear);
|
|
316
|
+
color = applyEndpointTones(color, params.blacks, params.whites);
|
|
317
|
+
color = clamp((color - vec3f(params.pivot)) * params.contrast + vec3f(params.pivot), vec3f(0.0), vec3f(1.0));
|
|
318
|
+
let luminance = dot(color, vec3f(0.213, 0.715, 0.072));
|
|
319
|
+
color = clamp(vec3f(luminance) + (color - vec3f(luminance)) * params.saturation, vec3f(0.0), vec3f(1.0));
|
|
320
|
+
color = applyVibrance(color, params.vibrance);
|
|
321
|
+
return vec4f(color * alpha, alpha);
|
|
322
|
+
}
|
|
323
|
+
`;
|
|
397
324
|
var compileShader = (gl, type, source) => {
|
|
398
325
|
const shader = gl.createShader(type);
|
|
399
326
|
if (!shader) {
|
|
@@ -495,62 +422,97 @@ var colorCorrection = createEffect({
|
|
|
495
422
|
type: "remotion/color-correction",
|
|
496
423
|
label: "colorCorrection()",
|
|
497
424
|
documentationLink: "https://www.remotion.dev/docs/effects/color-correction",
|
|
498
|
-
backend: "webgl2",
|
|
499
425
|
calculateKey: (params) => {
|
|
500
426
|
const r = resolve(params);
|
|
501
427
|
return `color-correction-${r.exposure}-${r.contrast}-${r.pivot}-${r.shadows}-${r.highlights}-${r.whites}-${r.blacks}-${r.temperature}-${r.tint}-${r.saturation}-${r.vibrance}`;
|
|
502
428
|
},
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
429
|
+
implementations: {
|
|
430
|
+
webgpu: Internals.createEffectImplementation({
|
|
431
|
+
setup: (target) => setupWebGpuSinglePass(target, "color correction"),
|
|
432
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
433
|
+
if (!gpuDevice) {
|
|
434
|
+
throw new Error("A WebGPU device is required for the color correction effect");
|
|
435
|
+
}
|
|
436
|
+
const r = resolve(params);
|
|
437
|
+
applyWebGpuSinglePass({
|
|
438
|
+
state,
|
|
439
|
+
source,
|
|
440
|
+
width,
|
|
441
|
+
height,
|
|
442
|
+
device: gpuDevice,
|
|
443
|
+
shader: WEBGPU_SHADER,
|
|
444
|
+
uniformData: new Float32Array([
|
|
445
|
+
r.exposure,
|
|
446
|
+
r.contrast,
|
|
447
|
+
r.pivot,
|
|
448
|
+
r.shadows,
|
|
449
|
+
r.highlights,
|
|
450
|
+
r.whites,
|
|
451
|
+
r.blacks,
|
|
452
|
+
r.temperature,
|
|
453
|
+
r.tint,
|
|
454
|
+
r.saturation,
|
|
455
|
+
r.vibrance,
|
|
456
|
+
0
|
|
457
|
+
])
|
|
458
|
+
});
|
|
459
|
+
},
|
|
460
|
+
cleanup: cleanupWebGpuSinglePass
|
|
461
|
+
}),
|
|
462
|
+
webgl2: Internals.createEffectImplementation({
|
|
463
|
+
setup: setupColorCorrection,
|
|
464
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
465
|
+
const r = resolve(params);
|
|
466
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
467
|
+
gl.viewport(0, 0, width, height);
|
|
468
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
469
|
+
gl.clearColor(0, 0, 0, 0);
|
|
470
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
471
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
472
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
473
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
474
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
475
|
+
gl.useProgram(program);
|
|
476
|
+
if (uniforms.uSource)
|
|
477
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
478
|
+
if (uniforms.uExposure)
|
|
479
|
+
gl.uniform1f(uniforms.uExposure, r.exposure);
|
|
480
|
+
if (uniforms.uContrast)
|
|
481
|
+
gl.uniform1f(uniforms.uContrast, r.contrast);
|
|
482
|
+
if (uniforms.uPivot)
|
|
483
|
+
gl.uniform1f(uniforms.uPivot, r.pivot);
|
|
484
|
+
if (uniforms.uShadows)
|
|
485
|
+
gl.uniform1f(uniforms.uShadows, r.shadows);
|
|
486
|
+
if (uniforms.uHighlights) {
|
|
487
|
+
gl.uniform1f(uniforms.uHighlights, r.highlights);
|
|
488
|
+
}
|
|
489
|
+
if (uniforms.uWhites)
|
|
490
|
+
gl.uniform1f(uniforms.uWhites, r.whites);
|
|
491
|
+
if (uniforms.uBlacks)
|
|
492
|
+
gl.uniform1f(uniforms.uBlacks, r.blacks);
|
|
493
|
+
if (uniforms.uTemperature) {
|
|
494
|
+
gl.uniform1f(uniforms.uTemperature, r.temperature);
|
|
495
|
+
}
|
|
496
|
+
if (uniforms.uTint)
|
|
497
|
+
gl.uniform1f(uniforms.uTint, r.tint);
|
|
498
|
+
if (uniforms.uSaturation) {
|
|
499
|
+
gl.uniform1f(uniforms.uSaturation, r.saturation);
|
|
500
|
+
}
|
|
501
|
+
if (uniforms.uVibrance)
|
|
502
|
+
gl.uniform1f(uniforms.uVibrance, r.vibrance);
|
|
503
|
+
gl.bindVertexArray(vao);
|
|
504
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
505
|
+
gl.bindVertexArray(null);
|
|
506
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
507
|
+
gl.useProgram(null);
|
|
508
|
+
},
|
|
509
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
510
|
+
gl.deleteTexture(textureSource);
|
|
511
|
+
gl.deleteBuffer(vbo);
|
|
512
|
+
gl.deleteProgram(program);
|
|
513
|
+
gl.deleteVertexArray(vao);
|
|
514
|
+
}
|
|
515
|
+
})
|
|
554
516
|
},
|
|
555
517
|
schema: colorCorrectionSchema,
|
|
556
518
|
validateParams: validateColorCorrectionParams
|