@remotion/effects 4.0.464 → 4.0.466

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 (40) hide show
  1. package/README.md +13 -2
  2. package/dist/barrel-distortion/barrel-distortion-runtime.d.ts +21 -0
  3. package/dist/barrel-distortion/barrel-distortion-shaders.d.ts +2 -0
  4. package/dist/barrel-distortion/index.d.ts +7 -0
  5. package/dist/barrel-distortion.d.ts +1 -0
  6. package/dist/blur/blur-runtime.d.ts +4 -1
  7. package/dist/blur/index.d.ts +4 -0
  8. package/dist/blur.d.ts +1 -0
  9. package/dist/brightness.d.ts +7 -0
  10. package/dist/color-utils.d.ts +37 -0
  11. package/dist/effect-internals.d.ts +8 -0
  12. package/dist/esm/barrel-distortion.mjs +329 -0
  13. package/dist/esm/blur.mjs +107 -44
  14. package/dist/esm/brightness.mjs +138 -0
  15. package/dist/esm/grayscale.mjs +128 -0
  16. package/dist/esm/halftone.mjs +150 -20
  17. package/dist/esm/hue.mjs +126 -0
  18. package/dist/esm/index.mjs +0 -1
  19. package/dist/esm/invert.mjs +128 -0
  20. package/dist/esm/mirror.mjs +358 -0
  21. package/dist/esm/saturation.mjs +128 -0
  22. package/dist/esm/scale.mjs +103 -0
  23. package/dist/esm/tint.mjs +72 -14
  24. package/dist/esm/wave.mjs +289 -55
  25. package/dist/grayscale.d.ts +7 -0
  26. package/dist/halftone.d.ts +19 -7
  27. package/dist/hue.d.ts +7 -0
  28. package/dist/invert.d.ts +7 -0
  29. package/dist/mirror/index.d.ts +13 -0
  30. package/dist/mirror/mirror-runtime.d.ts +26 -0
  31. package/dist/mirror/mirror-shaders.d.ts +2 -0
  32. package/dist/mirror.d.ts +1 -0
  33. package/dist/saturation.d.ts +7 -0
  34. package/dist/scale/index.d.ts +11 -0
  35. package/dist/scale.d.ts +1 -0
  36. package/dist/wave/index.d.ts +12 -0
  37. package/dist/wave/wave-runtime.d.ts +29 -0
  38. package/dist/wave/wave-shaders.d.ts +2 -0
  39. package/dist/wave.d.ts +1 -46
  40. package/package.json +77 -12
@@ -0,0 +1,138 @@
1
+ // src/brightness.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/brightness.ts
86
+ var { createEffect } = Internals;
87
+ var brightnessSchema = {
88
+ amount: brightnessAmountSchema
89
+ };
90
+ var resolve = (p) => ({
91
+ amount: p.amount ?? DEFAULT_BRIGHTNESS_AMOUNT
92
+ });
93
+ var validateBrightnessParams = (params) => {
94
+ assertEffectParamsObject(params, "Brightness");
95
+ assertOptionalFiniteNumber(params.amount, "amount");
96
+ const { amount } = resolve(params);
97
+ validateSignedUnitInterval(amount, "amount");
98
+ };
99
+ var brightness = createEffect({
100
+ type: "remotion/brightness",
101
+ label: "Brightness",
102
+ documentationLink: "https://www.remotion.dev/docs/effects/brightness",
103
+ backend: "2d",
104
+ calculateKey: (params) => {
105
+ const r = resolve(params);
106
+ return `brightness-${r.amount}`;
107
+ },
108
+ setup: () => null,
109
+ apply: ({ source, target, width, height, params }) => {
110
+ const ctx = target.getContext("2d");
111
+ if (!ctx) {
112
+ throw new Error("Failed to acquire 2D context for brightness effect. The canvas may have been assigned a different context type.");
113
+ }
114
+ const r = resolve(params);
115
+ ctx.clearRect(0, 0, width, height);
116
+ ctx.drawImage(source, 0, 0, width, height);
117
+ if (r.amount === 0) {
118
+ return;
119
+ }
120
+ const imageData = ctx.getImageData(0, 0, width, height);
121
+ const delta = Math.round(r.amount * 255);
122
+ const { data } = imageData;
123
+ for (let i = 0;i < data.length; i += 4) {
124
+ data[i] = clampColorChannel(data[i] + delta);
125
+ data[i + 1] = clampColorChannel(data[i + 1] + delta);
126
+ data[i + 2] = clampColorChannel(data[i + 2] + delta);
127
+ }
128
+ ctx.putImageData(imageData, 0, 0);
129
+ },
130
+ cleanup: () => {
131
+ return;
132
+ },
133
+ schema: brightnessSchema,
134
+ validateParams: validateBrightnessParams
135
+ });
136
+ export {
137
+ brightness
138
+ };
@@ -0,0 +1,128 @@
1
+ // src/grayscale.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/grayscale.ts
86
+ var { createEffect } = Internals;
87
+ var grayscaleSchema = {
88
+ amount: colorAmountSchema
89
+ };
90
+ var resolve = (p) => ({
91
+ amount: p.amount ?? DEFAULT_AMOUNT
92
+ });
93
+ var validateGrayscaleParams = (params) => {
94
+ assertEffectParamsObject(params, "Grayscale");
95
+ assertOptionalFiniteNumber(params.amount, "amount");
96
+ const { amount } = resolve(params);
97
+ validateUnitInterval(amount, "amount");
98
+ };
99
+ var grayscale = createEffect({
100
+ type: "remotion/grayscale",
101
+ label: "Grayscale",
102
+ documentationLink: "https://www.remotion.dev/docs/effects/grayscale",
103
+ backend: "2d",
104
+ calculateKey: (params) => {
105
+ const r = resolve(params);
106
+ return `grayscale-${r.amount}`;
107
+ },
108
+ setup: () => null,
109
+ apply: ({ source, target, width, height, params }) => {
110
+ const ctx = target.getContext("2d");
111
+ if (!ctx) {
112
+ throw new Error("Failed to acquire 2D context for grayscale effect. The canvas may have been assigned a different context type.");
113
+ }
114
+ const r = resolve(params);
115
+ ctx.clearRect(0, 0, width, height);
116
+ ctx.filter = `grayscale(${r.amount * 100}%)`;
117
+ ctx.drawImage(source, 0, 0, width, height);
118
+ ctx.filter = "none";
119
+ },
120
+ cleanup: () => {
121
+ return;
122
+ },
123
+ schema: grayscaleSchema,
124
+ validateParams: validateGrayscaleParams
125
+ });
126
+ export {
127
+ grayscale
128
+ };
@@ -1,18 +1,91 @@
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"];
16
89
  var halftoneSchema = {
17
90
  dotSize: {
18
91
  type: "number",
@@ -59,6 +132,46 @@ var halftoneSchema = {
59
132
  },
60
133
  default: "circle",
61
134
  description: "Shape"
135
+ },
136
+ invert: {
137
+ type: "boolean",
138
+ default: false,
139
+ description: "Invert"
140
+ },
141
+ color: {
142
+ type: "color",
143
+ default: "black",
144
+ description: "Color"
145
+ }
146
+ };
147
+ var formatEnum = (variants) => {
148
+ if (variants.length === 2) {
149
+ return `"${variants[0]}" or "${variants[1]}"`;
150
+ }
151
+ return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
152
+ };
153
+ var assertOptionalEnum = (value, name, variants) => {
154
+ if (value === undefined) {
155
+ return;
156
+ }
157
+ if (typeof value !== "string" || !variants.includes(value)) {
158
+ throw new TypeError(`"${name}" must be ${formatEnum(variants)}`);
159
+ }
160
+ };
161
+ var assertOptionalBoolean = (value, name) => {
162
+ if (value === undefined) {
163
+ return;
164
+ }
165
+ if (typeof value !== "boolean") {
166
+ throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
167
+ }
168
+ };
169
+ var assertOptionalColor = (value, name) => {
170
+ if (value === undefined) {
171
+ return;
172
+ }
173
+ if (typeof value !== "string" || value.length === 0) {
174
+ throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
62
175
  }
63
176
  };
64
177
  var resolve = (p) => ({
@@ -70,8 +183,26 @@ var resolve = (p) => ({
70
183
  offsetY: p.offsetY ?? 0,
71
184
  sampling: p.sampling ?? "bilinear",
72
185
  color: p.color ?? "black",
73
- shadeOutside: p.shadeOutside ?? false
186
+ invert: p.invert ?? false
74
187
  });
188
+ var validateHalftoneParams = (params) => {
189
+ assertEffectParamsObject(params, "Halftone");
190
+ assertOptionalFiniteNumber(params.dotSize, "dotSize");
191
+ assertOptionalFiniteNumber(params.dotSpacing, "dotSpacing");
192
+ assertOptionalFiniteNumber(params.rotation, "rotation");
193
+ assertOptionalFiniteNumber(params.offsetX, "offsetX");
194
+ assertOptionalFiniteNumber(params.offsetY, "offsetY");
195
+ assertOptionalEnum(params.shape, "shape", HALFTONE_SHAPES);
196
+ assertOptionalEnum(params.sampling, "sampling", HALFTONE_SAMPLING);
197
+ assertOptionalColor(params.color, "color");
198
+ assertOptionalBoolean(params.invert, "invert");
199
+ if (params.dotSize !== undefined && params.dotSize < 1) {
200
+ throw new TypeError(`"dotSize" must be >= 1, but got ${JSON.stringify(params.dotSize)}`);
201
+ }
202
+ if (params.dotSpacing !== undefined && params.dotSpacing < 1) {
203
+ throw new TypeError(`"dotSpacing" must be >= 1, but got ${JSON.stringify(params.dotSpacing)}`);
204
+ }
205
+ };
75
206
  var HALFTONE_VS = `#version 300 es
76
207
  in vec2 aPos;
77
208
  in vec2 aUv;
@@ -97,8 +228,6 @@ uniform vec4 uColor;
97
228
  uniform int uShape;
98
229
  uniform bool uShadeOutside;
99
230
 
100
- const float SHADE_OUTSIDE_SCALE = ${SHADE_OUTSIDE_DOT_SCALE.toFixed(1)};
101
-
102
231
  void main() {
103
232
  vec2 fragPos = vUv * uResolution;
104
233
  vec2 center = uResolution * 0.5;
@@ -130,7 +259,7 @@ void main() {
130
259
 
131
260
  float lumDefault = lum * alpha + (1.0 - alpha);
132
261
  float dotScale = uShadeOutside
133
- ? (1.0 - alpha) * SHADE_OUTSIDE_SCALE
262
+ ? lumDefault
134
263
  : 1.0 - lumDefault;
135
264
 
136
265
  if (dotScale <= 0.01) {
@@ -203,10 +332,11 @@ var parseColorRgba = (ctx, color) => {
203
332
  var halftone = createEffect({
204
333
  type: "remotion/halftone",
205
334
  label: "Halftone",
335
+ documentationLink: "https://www.remotion.dev/docs/effects/halftone",
206
336
  backend: "webgl2",
207
337
  calculateKey: (params) => {
208
338
  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}`;
339
+ return `halftone-${r.shape}-${r.dotSize}-${r.dotSpacing}-${r.rotation}-${r.offsetX}-${r.offsetY}-${r.sampling}-${r.color}-${r.invert ? 1 : 0}`;
210
340
  },
211
341
  setup: (target) => {
212
342
  const gl = target.getContext("webgl2", {
@@ -218,7 +348,6 @@ var halftone = createEffect({
218
348
  throw createWebGL2ContextError("halftone effect");
219
349
  }
220
350
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
221
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
222
351
  const vs = compileShader(gl, gl.VERTEX_SHADER, HALFTONE_VS);
223
352
  const fs = compileShader(gl, gl.FRAGMENT_SHADER, HALFTONE_FS);
224
353
  const program = linkProgram(gl, vs, fs);
@@ -295,7 +424,7 @@ var halftone = createEffect({
295
424
  cachedColorRgba: [0, 0, 0, 1]
296
425
  };
297
426
  },
298
- apply: ({ source, width, height, params, state }) => {
427
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
299
428
  const r = resolve(params);
300
429
  const { gl, program, vao, texture } = state;
301
430
  if (state.cachedColorStr !== r.color) {
@@ -313,6 +442,7 @@ var halftone = createEffect({
313
442
  gl.bindTexture(gl.TEXTURE_2D, texture);
314
443
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
315
444
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
445
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
316
446
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
317
447
  if (state.uSource)
318
448
  gl.uniform1i(state.uSource, 0);
@@ -331,7 +461,7 @@ var halftone = createEffect({
331
461
  if (state.uShape)
332
462
  gl.uniform1i(state.uShape, SHAPE_INDEX[r.shape]);
333
463
  if (state.uShadeOutside)
334
- gl.uniform1i(state.uShadeOutside, r.shadeOutside ? 1 : 0);
464
+ gl.uniform1i(state.uShadeOutside, r.invert ? 1 : 0);
335
465
  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
336
466
  gl.bindVertexArray(null);
337
467
  gl.bindTexture(gl.TEXTURE_2D, null);
@@ -344,7 +474,7 @@ var halftone = createEffect({
344
474
  gl.deleteTexture(texture);
345
475
  },
346
476
  schema: halftoneSchema,
347
- validateParams: () => {}
477
+ validateParams: validateHalftoneParams
348
478
  });
349
479
  export {
350
480
  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
+ };
@@ -1 +0,0 @@
1
- export {};