@remotion/effects 4.0.465 → 4.0.467
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/barrel-distortion/barrel-distortion-runtime.d.ts +21 -0
- package/dist/barrel-distortion/barrel-distortion-shaders.d.ts +2 -0
- package/dist/barrel-distortion/index.d.ts +7 -0
- package/dist/barrel-distortion.d.ts +1 -0
- package/dist/brightness.d.ts +7 -0
- package/dist/chromatic-aberration/chromatic-aberration-runtime.d.ts +22 -0
- package/dist/chromatic-aberration/chromatic-aberration-shaders.d.ts +2 -0
- package/dist/chromatic-aberration/index.d.ts +9 -0
- package/dist/chromatic-aberration.d.ts +1 -0
- package/dist/color-utils.d.ts +37 -0
- package/dist/contrast.d.ts +7 -0
- package/dist/esm/barrel-distortion.mjs +329 -0
- package/dist/esm/blur.mjs +2 -1
- package/dist/esm/brightness.mjs +138 -0
- package/dist/esm/chromatic-aberration.mjs +330 -0
- package/dist/esm/contrast.mjs +138 -0
- package/dist/esm/grayscale.mjs +128 -0
- package/dist/esm/halftone.mjs +178 -25
- package/dist/esm/hue.mjs +126 -0
- package/dist/esm/index.mjs +0 -428
- package/dist/esm/invert.mjs +128 -0
- package/dist/esm/mirror.mjs +358 -0
- package/dist/esm/saturation.mjs +128 -0
- package/dist/esm/scale.mjs +103 -0
- package/dist/esm/tint.mjs +72 -14
- package/dist/esm/translate.mjs +205 -0
- package/dist/esm/wave.mjs +1 -0
- package/dist/grayscale.d.ts +7 -0
- package/dist/halftone.d.ts +39 -10
- package/dist/hue.d.ts +7 -0
- package/dist/index.d.ts +1 -3
- package/dist/invert.d.ts +7 -0
- package/dist/mirror/index.d.ts +13 -0
- package/dist/mirror/mirror-runtime.d.ts +26 -0
- package/dist/mirror/mirror-shaders.d.ts +2 -0
- package/dist/mirror.d.ts +1 -0
- package/dist/saturation.d.ts +7 -0
- package/dist/scale/index.d.ts +11 -0
- package/dist/scale.d.ts +1 -0
- package/dist/translate/index.d.ts +18 -0
- package/dist/translate.d.ts +1 -0
- package/package.json +107 -3
package/dist/esm/halftone.mjs
CHANGED
|
@@ -1,18 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
// src/halftone.ts
|
|
2
|
+
import { Internals } from "remotion";
|
|
3
|
+
|
|
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
|
+
|
|
21
|
+
// src/color-utils.ts
|
|
22
|
+
var DEFAULT_AMOUNT = 1;
|
|
23
|
+
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
24
|
+
var DEFAULT_HUE_DEGREES = 0;
|
|
25
|
+
var colorAmountSchema = {
|
|
26
|
+
type: "number",
|
|
27
|
+
min: 0,
|
|
28
|
+
max: 1,
|
|
29
|
+
step: 0.01,
|
|
30
|
+
default: DEFAULT_AMOUNT,
|
|
31
|
+
description: "Amount"
|
|
32
|
+
};
|
|
33
|
+
var colorMultiplierSchema = {
|
|
34
|
+
type: "number",
|
|
35
|
+
min: 0,
|
|
36
|
+
step: 0.01,
|
|
37
|
+
default: DEFAULT_AMOUNT,
|
|
38
|
+
description: "Amount"
|
|
39
|
+
};
|
|
40
|
+
var brightnessAmountSchema = {
|
|
41
|
+
type: "number",
|
|
42
|
+
min: -1,
|
|
43
|
+
max: 1,
|
|
44
|
+
step: 0.01,
|
|
45
|
+
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
46
|
+
description: "Amount"
|
|
47
|
+
};
|
|
48
|
+
var hueDegreesSchema = {
|
|
49
|
+
type: "number",
|
|
50
|
+
step: 1,
|
|
51
|
+
default: DEFAULT_HUE_DEGREES,
|
|
52
|
+
description: "Degrees"
|
|
53
|
+
};
|
|
54
|
+
var assertOptionalFiniteNumber = (value, name) => {
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
assertRequiredFiniteNumber(value, name);
|
|
59
|
+
};
|
|
60
|
+
var validateUnitInterval = (value, name) => {
|
|
61
|
+
if (value < 0) {
|
|
62
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
63
|
+
}
|
|
64
|
+
if (value > 1) {
|
|
65
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var validateNonNegative = (value, name) => {
|
|
69
|
+
if (value < 0) {
|
|
70
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var validateSignedUnitInterval = (value, name) => {
|
|
74
|
+
if (value < -1) {
|
|
75
|
+
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
76
|
+
}
|
|
77
|
+
if (value > 1) {
|
|
78
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var clampColorChannel = (value) => {
|
|
82
|
+
return Math.max(0, Math.min(255, value));
|
|
10
83
|
};
|
|
11
84
|
|
|
12
85
|
// src/halftone.ts
|
|
13
|
-
import { Internals } from "remotion";
|
|
14
86
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
15
|
-
var
|
|
87
|
+
var HALFTONE_SHAPES = ["circle", "square", "line"];
|
|
88
|
+
var HALFTONE_SAMPLING = ["bilinear", "nearest"];
|
|
89
|
+
var HALFTONE_COLOR_MODES = ["solid", "source"];
|
|
16
90
|
var halftoneSchema = {
|
|
17
91
|
dotSize: {
|
|
18
92
|
type: "number",
|
|
@@ -59,6 +133,56 @@ var halftoneSchema = {
|
|
|
59
133
|
},
|
|
60
134
|
default: "circle",
|
|
61
135
|
description: "Shape"
|
|
136
|
+
},
|
|
137
|
+
invert: {
|
|
138
|
+
type: "boolean",
|
|
139
|
+
default: false,
|
|
140
|
+
description: "Invert"
|
|
141
|
+
},
|
|
142
|
+
colorMode: {
|
|
143
|
+
type: "enum",
|
|
144
|
+
default: "solid",
|
|
145
|
+
description: "Color mode",
|
|
146
|
+
variants: {
|
|
147
|
+
solid: {
|
|
148
|
+
dotColor: {
|
|
149
|
+
type: "color",
|
|
150
|
+
default: "red",
|
|
151
|
+
description: "Dot color"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
source: {}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
var formatEnum = (variants) => {
|
|
159
|
+
if (variants.length === 2) {
|
|
160
|
+
return `"${variants[0]}" or "${variants[1]}"`;
|
|
161
|
+
}
|
|
162
|
+
return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
|
|
163
|
+
};
|
|
164
|
+
var assertOptionalEnum = (value, name, variants) => {
|
|
165
|
+
if (value === undefined) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (typeof value !== "string" || !variants.includes(value)) {
|
|
169
|
+
throw new TypeError(`"${name}" must be ${formatEnum(variants)}`);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var assertOptionalBoolean = (value, name) => {
|
|
173
|
+
if (value === undefined) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (typeof value !== "boolean") {
|
|
177
|
+
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
var assertOptionalColor = (value, name) => {
|
|
181
|
+
if (value === undefined) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
185
|
+
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
62
186
|
}
|
|
63
187
|
};
|
|
64
188
|
var resolve = (p) => ({
|
|
@@ -69,9 +193,35 @@ var resolve = (p) => ({
|
|
|
69
193
|
offsetX: p.offsetX ?? 0,
|
|
70
194
|
offsetY: p.offsetY ?? 0,
|
|
71
195
|
sampling: p.sampling ?? "bilinear",
|
|
72
|
-
|
|
73
|
-
|
|
196
|
+
colorMode: p.colorMode ?? "solid",
|
|
197
|
+
dotColor: "dotColor" in p ? p.dotColor ?? "red" : "red",
|
|
198
|
+
invert: p.invert ?? false
|
|
74
199
|
});
|
|
200
|
+
var validateHalftoneParams = (params) => {
|
|
201
|
+
assertEffectParamsObject(params, "Halftone");
|
|
202
|
+
assertOptionalFiniteNumber(params.dotSize, "dotSize");
|
|
203
|
+
assertOptionalFiniteNumber(params.dotSpacing, "dotSpacing");
|
|
204
|
+
assertOptionalFiniteNumber(params.rotation, "rotation");
|
|
205
|
+
assertOptionalFiniteNumber(params.offsetX, "offsetX");
|
|
206
|
+
assertOptionalFiniteNumber(params.offsetY, "offsetY");
|
|
207
|
+
assertOptionalEnum(params.shape, "shape", HALFTONE_SHAPES);
|
|
208
|
+
assertOptionalEnum(params.sampling, "sampling", HALFTONE_SAMPLING);
|
|
209
|
+
assertOptionalEnum(params.colorMode, "colorMode", HALFTONE_COLOR_MODES);
|
|
210
|
+
if ("color" in params && params.color !== undefined) {
|
|
211
|
+
throw new TypeError('"color" has been renamed to "dotColor"');
|
|
212
|
+
}
|
|
213
|
+
if (params.colorMode === "source" && "dotColor" in params) {
|
|
214
|
+
throw new TypeError('"dotColor" can only be set when "colorMode" is "solid"');
|
|
215
|
+
}
|
|
216
|
+
assertOptionalColor("dotColor" in params ? params.dotColor : undefined, "dotColor");
|
|
217
|
+
assertOptionalBoolean(params.invert, "invert");
|
|
218
|
+
if (params.dotSize !== undefined && params.dotSize < 1) {
|
|
219
|
+
throw new TypeError(`"dotSize" must be >= 1, but got ${JSON.stringify(params.dotSize)}`);
|
|
220
|
+
}
|
|
221
|
+
if (params.dotSpacing !== undefined && params.dotSpacing < 1) {
|
|
222
|
+
throw new TypeError(`"dotSpacing" must be >= 1, but got ${JSON.stringify(params.dotSpacing)}`);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
75
225
|
var HALFTONE_VS = `#version 300 es
|
|
76
226
|
in vec2 aPos;
|
|
77
227
|
in vec2 aUv;
|
|
@@ -96,8 +246,7 @@ uniform vec2 uOffset;
|
|
|
96
246
|
uniform vec4 uColor;
|
|
97
247
|
uniform int uShape;
|
|
98
248
|
uniform bool uShadeOutside;
|
|
99
|
-
|
|
100
|
-
const float SHADE_OUTSIDE_SCALE = ${SHADE_OUTSIDE_DOT_SCALE.toFixed(1)};
|
|
249
|
+
uniform bool uUseSourceColor;
|
|
101
250
|
|
|
102
251
|
void main() {
|
|
103
252
|
vec2 fragPos = vUv * uResolution;
|
|
@@ -130,7 +279,7 @@ void main() {
|
|
|
130
279
|
|
|
131
280
|
float lumDefault = lum * alpha + (1.0 - alpha);
|
|
132
281
|
float dotScale = uShadeOutside
|
|
133
|
-
?
|
|
282
|
+
? lumDefault
|
|
134
283
|
: 1.0 - lumDefault;
|
|
135
284
|
|
|
136
285
|
if (dotScale <= 0.01) {
|
|
@@ -156,7 +305,7 @@ void main() {
|
|
|
156
305
|
* (1.0 - smoothstep(lineHalf - 0.5, lineHalf + 0.5, abs(diff.y)));
|
|
157
306
|
}
|
|
158
307
|
|
|
159
|
-
fragColor = uColor * coverage;
|
|
308
|
+
fragColor = (uUseSourceColor ? texColor : uColor) * coverage;
|
|
160
309
|
}
|
|
161
310
|
`;
|
|
162
311
|
var SHAPE_INDEX = {
|
|
@@ -203,10 +352,11 @@ var parseColorRgba = (ctx, color) => {
|
|
|
203
352
|
var halftone = createEffect({
|
|
204
353
|
type: "remotion/halftone",
|
|
205
354
|
label: "Halftone",
|
|
355
|
+
documentationLink: "https://www.remotion.dev/docs/effects/halftone",
|
|
206
356
|
backend: "webgl2",
|
|
207
357
|
calculateKey: (params) => {
|
|
208
358
|
const r = resolve(params);
|
|
209
|
-
return `halftone-${r.shape}-${r.dotSize}-${r.dotSpacing}-${r.rotation}-${r.offsetX}-${r.offsetY}-${r.sampling}-${r.
|
|
359
|
+
return `halftone-${r.shape}-${r.dotSize}-${r.dotSpacing}-${r.rotation}-${r.offsetX}-${r.offsetY}-${r.sampling}-${r.colorMode}-${r.dotColor}-${r.invert ? 1 : 0}`;
|
|
210
360
|
},
|
|
211
361
|
setup: (target) => {
|
|
212
362
|
const gl = target.getContext("webgl2", {
|
|
@@ -218,7 +368,6 @@ var halftone = createEffect({
|
|
|
218
368
|
throw createWebGL2ContextError("halftone effect");
|
|
219
369
|
}
|
|
220
370
|
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
221
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
222
371
|
const vs = compileShader(gl, gl.VERTEX_SHADER, HALFTONE_VS);
|
|
223
372
|
const fs = compileShader(gl, gl.FRAGMENT_SHADER, HALFTONE_FS);
|
|
224
373
|
const program = linkProgram(gl, vs, fs);
|
|
@@ -290,17 +439,18 @@ var halftone = createEffect({
|
|
|
290
439
|
uColor: gl.getUniformLocation(program, "uColor"),
|
|
291
440
|
uShape: gl.getUniformLocation(program, "uShape"),
|
|
292
441
|
uShadeOutside: gl.getUniformLocation(program, "uShadeOutside"),
|
|
442
|
+
uUseSourceColor: gl.getUniformLocation(program, "uUseSourceColor"),
|
|
293
443
|
colorCtx,
|
|
294
444
|
cachedColorStr: "",
|
|
295
445
|
cachedColorRgba: [0, 0, 0, 1]
|
|
296
446
|
};
|
|
297
447
|
},
|
|
298
|
-
apply: ({ source, width, height, params, state }) => {
|
|
448
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
299
449
|
const r = resolve(params);
|
|
300
450
|
const { gl, program, vao, texture } = state;
|
|
301
|
-
if (state.cachedColorStr !== r.
|
|
302
|
-
state.cachedColorStr = r.
|
|
303
|
-
state.cachedColorRgba = parseColorRgba(state.colorCtx, r.
|
|
451
|
+
if (state.cachedColorStr !== r.dotColor) {
|
|
452
|
+
state.cachedColorStr = r.dotColor;
|
|
453
|
+
state.cachedColorRgba = parseColorRgba(state.colorCtx, r.dotColor);
|
|
304
454
|
}
|
|
305
455
|
const [cr, cg, cb, ca] = state.cachedColorRgba;
|
|
306
456
|
const filter = r.sampling === "nearest" ? gl.NEAREST : gl.LINEAR;
|
|
@@ -313,6 +463,7 @@ var halftone = createEffect({
|
|
|
313
463
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
314
464
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
|
|
315
465
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
|
|
466
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
316
467
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
317
468
|
if (state.uSource)
|
|
318
469
|
gl.uniform1i(state.uSource, 0);
|
|
@@ -331,7 +482,9 @@ var halftone = createEffect({
|
|
|
331
482
|
if (state.uShape)
|
|
332
483
|
gl.uniform1i(state.uShape, SHAPE_INDEX[r.shape]);
|
|
333
484
|
if (state.uShadeOutside)
|
|
334
|
-
gl.uniform1i(state.uShadeOutside, r.
|
|
485
|
+
gl.uniform1i(state.uShadeOutside, r.invert ? 1 : 0);
|
|
486
|
+
if (state.uUseSourceColor)
|
|
487
|
+
gl.uniform1i(state.uUseSourceColor, r.colorMode === "source" ? 1 : 0);
|
|
335
488
|
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
336
489
|
gl.bindVertexArray(null);
|
|
337
490
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
@@ -344,7 +497,7 @@ var halftone = createEffect({
|
|
|
344
497
|
gl.deleteTexture(texture);
|
|
345
498
|
},
|
|
346
499
|
schema: halftoneSchema,
|
|
347
|
-
validateParams:
|
|
500
|
+
validateParams: validateHalftoneParams
|
|
348
501
|
});
|
|
349
502
|
export {
|
|
350
503
|
halftoneSchema,
|
package/dist/esm/hue.mjs
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/hue.ts
|
|
2
|
+
import { Internals } from "remotion";
|
|
3
|
+
|
|
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
|
+
|
|
21
|
+
// src/color-utils.ts
|
|
22
|
+
var DEFAULT_AMOUNT = 1;
|
|
23
|
+
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
24
|
+
var DEFAULT_HUE_DEGREES = 0;
|
|
25
|
+
var colorAmountSchema = {
|
|
26
|
+
type: "number",
|
|
27
|
+
min: 0,
|
|
28
|
+
max: 1,
|
|
29
|
+
step: 0.01,
|
|
30
|
+
default: DEFAULT_AMOUNT,
|
|
31
|
+
description: "Amount"
|
|
32
|
+
};
|
|
33
|
+
var colorMultiplierSchema = {
|
|
34
|
+
type: "number",
|
|
35
|
+
min: 0,
|
|
36
|
+
step: 0.01,
|
|
37
|
+
default: DEFAULT_AMOUNT,
|
|
38
|
+
description: "Amount"
|
|
39
|
+
};
|
|
40
|
+
var brightnessAmountSchema = {
|
|
41
|
+
type: "number",
|
|
42
|
+
min: -1,
|
|
43
|
+
max: 1,
|
|
44
|
+
step: 0.01,
|
|
45
|
+
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
46
|
+
description: "Amount"
|
|
47
|
+
};
|
|
48
|
+
var hueDegreesSchema = {
|
|
49
|
+
type: "number",
|
|
50
|
+
step: 1,
|
|
51
|
+
default: DEFAULT_HUE_DEGREES,
|
|
52
|
+
description: "Degrees"
|
|
53
|
+
};
|
|
54
|
+
var assertOptionalFiniteNumber = (value, name) => {
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
assertRequiredFiniteNumber(value, name);
|
|
59
|
+
};
|
|
60
|
+
var validateUnitInterval = (value, name) => {
|
|
61
|
+
if (value < 0) {
|
|
62
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
63
|
+
}
|
|
64
|
+
if (value > 1) {
|
|
65
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
var validateNonNegative = (value, name) => {
|
|
69
|
+
if (value < 0) {
|
|
70
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var validateSignedUnitInterval = (value, name) => {
|
|
74
|
+
if (value < -1) {
|
|
75
|
+
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
76
|
+
}
|
|
77
|
+
if (value > 1) {
|
|
78
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var clampColorChannel = (value) => {
|
|
82
|
+
return Math.max(0, Math.min(255, value));
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/hue.ts
|
|
86
|
+
var { createEffect } = Internals;
|
|
87
|
+
var hueSchema = {
|
|
88
|
+
degrees: hueDegreesSchema
|
|
89
|
+
};
|
|
90
|
+
var resolve = (p) => ({
|
|
91
|
+
degrees: p.degrees ?? DEFAULT_HUE_DEGREES
|
|
92
|
+
});
|
|
93
|
+
var validateHueParams = (params) => {
|
|
94
|
+
assertEffectParamsObject(params, "Hue");
|
|
95
|
+
assertOptionalFiniteNumber(params.degrees, "degrees");
|
|
96
|
+
};
|
|
97
|
+
var hue = createEffect({
|
|
98
|
+
type: "remotion/hue",
|
|
99
|
+
label: "Hue",
|
|
100
|
+
documentationLink: "https://www.remotion.dev/docs/effects/hue",
|
|
101
|
+
backend: "2d",
|
|
102
|
+
calculateKey: (params) => {
|
|
103
|
+
const r = resolve(params);
|
|
104
|
+
return `hue-${r.degrees}`;
|
|
105
|
+
},
|
|
106
|
+
setup: () => null,
|
|
107
|
+
apply: ({ source, target, width, height, params }) => {
|
|
108
|
+
const ctx = target.getContext("2d");
|
|
109
|
+
if (!ctx) {
|
|
110
|
+
throw new Error("Failed to acquire 2D context for hue effect. The canvas may have been assigned a different context type.");
|
|
111
|
+
}
|
|
112
|
+
const r = resolve(params);
|
|
113
|
+
ctx.clearRect(0, 0, width, height);
|
|
114
|
+
ctx.filter = `hue-rotate(${r.degrees}deg)`;
|
|
115
|
+
ctx.drawImage(source, 0, 0, width, height);
|
|
116
|
+
ctx.filter = "none";
|
|
117
|
+
},
|
|
118
|
+
cleanup: () => {
|
|
119
|
+
return;
|
|
120
|
+
},
|
|
121
|
+
schema: hueSchema,
|
|
122
|
+
validateParams: validateHueParams
|
|
123
|
+
});
|
|
124
|
+
export {
|
|
125
|
+
hue
|
|
126
|
+
};
|