@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.
- package/README.md +13 -2
- 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/blur/blur-runtime.d.ts +4 -1
- package/dist/blur/index.d.ts +4 -0
- package/dist/blur.d.ts +1 -0
- package/dist/brightness.d.ts +7 -0
- package/dist/color-utils.d.ts +37 -0
- package/dist/effect-internals.d.ts +8 -0
- package/dist/esm/barrel-distortion.mjs +329 -0
- package/dist/esm/blur.mjs +107 -44
- package/dist/esm/brightness.mjs +138 -0
- package/dist/esm/grayscale.mjs +128 -0
- package/dist/esm/halftone.mjs +150 -20
- package/dist/esm/hue.mjs +126 -0
- package/dist/esm/index.mjs +0 -1
- 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/wave.mjs +289 -55
- package/dist/grayscale.d.ts +7 -0
- package/dist/halftone.d.ts +19 -7
- package/dist/hue.d.ts +7 -0
- 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/wave/index.d.ts +12 -0
- package/dist/wave/wave-runtime.d.ts +29 -0
- package/dist/wave/wave-shaders.d.ts +2 -0
- package/dist/wave.d.ts +1 -46
- 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
|
+
};
|
package/dist/esm/halftone.mjs
CHANGED
|
@@ -1,18 +1,91 @@
|
|
|
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"];
|
|
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
|
-
|
|
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
|
-
?
|
|
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.
|
|
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.
|
|
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,
|
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
|
+
};
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|