@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.
Files changed (42) hide show
  1. package/dist/barrel-distortion/barrel-distortion-runtime.d.ts +21 -0
  2. package/dist/barrel-distortion/barrel-distortion-shaders.d.ts +2 -0
  3. package/dist/barrel-distortion/index.d.ts +7 -0
  4. package/dist/barrel-distortion.d.ts +1 -0
  5. package/dist/brightness.d.ts +7 -0
  6. package/dist/chromatic-aberration/chromatic-aberration-runtime.d.ts +22 -0
  7. package/dist/chromatic-aberration/chromatic-aberration-shaders.d.ts +2 -0
  8. package/dist/chromatic-aberration/index.d.ts +9 -0
  9. package/dist/chromatic-aberration.d.ts +1 -0
  10. package/dist/color-utils.d.ts +37 -0
  11. package/dist/contrast.d.ts +7 -0
  12. package/dist/esm/barrel-distortion.mjs +329 -0
  13. package/dist/esm/blur.mjs +2 -1
  14. package/dist/esm/brightness.mjs +138 -0
  15. package/dist/esm/chromatic-aberration.mjs +330 -0
  16. package/dist/esm/contrast.mjs +138 -0
  17. package/dist/esm/grayscale.mjs +128 -0
  18. package/dist/esm/halftone.mjs +178 -25
  19. package/dist/esm/hue.mjs +126 -0
  20. package/dist/esm/index.mjs +0 -428
  21. package/dist/esm/invert.mjs +128 -0
  22. package/dist/esm/mirror.mjs +358 -0
  23. package/dist/esm/saturation.mjs +128 -0
  24. package/dist/esm/scale.mjs +103 -0
  25. package/dist/esm/tint.mjs +72 -14
  26. package/dist/esm/translate.mjs +205 -0
  27. package/dist/esm/wave.mjs +1 -0
  28. package/dist/grayscale.d.ts +7 -0
  29. package/dist/halftone.d.ts +39 -10
  30. package/dist/hue.d.ts +7 -0
  31. package/dist/index.d.ts +1 -3
  32. package/dist/invert.d.ts +7 -0
  33. package/dist/mirror/index.d.ts +13 -0
  34. package/dist/mirror/mirror-runtime.d.ts +26 -0
  35. package/dist/mirror/mirror-shaders.d.ts +2 -0
  36. package/dist/mirror.d.ts +1 -0
  37. package/dist/saturation.d.ts +7 -0
  38. package/dist/scale/index.d.ts +11 -0
  39. package/dist/scale.d.ts +1 -0
  40. package/dist/translate/index.d.ts +18 -0
  41. package/dist/translate.d.ts +1 -0
  42. package/package.json +107 -3
@@ -1,18 +1,92 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, {
5
- get: all[name],
6
- enumerable: true,
7
- configurable: true,
8
- set: (newValue) => all[name] = () => newValue
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 SHADE_OUTSIDE_DOT_SCALE = 0.5;
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
- color: p.color ?? "black",
73
- shadeOutside: p.shadeOutside ?? false
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
- ? (1.0 - alpha) * SHADE_OUTSIDE_SCALE
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.color}-${r.shadeOutside ? 1 : 0}`;
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.color) {
302
- state.cachedColorStr = r.color;
303
- state.cachedColorRgba = parseColorRgba(state.colorCtx, r.color);
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.shadeOutside ? 1 : 0);
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,
@@ -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
+ };