@remotion/effects 4.0.538 → 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 +19 -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/curves.d.ts +65 -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 +357 -0
- 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 +204 -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 +868 -0
- 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/levels.d.ts +69 -2
- 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/geometry.d.ts +19 -0
- package/dist/shatter/index.d.ts +39 -0
- package/dist/shatter/runtime.d.ts +19 -0
- package/dist/shatter/webgpu-shader.d.ts +1 -0
- package/dist/shatter.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 +59 -3
package/dist/esm/levels.mjs
CHANGED
|
@@ -1,126 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateUnitInterval
|
|
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";
|
|
108
14
|
|
|
109
15
|
// src/levels.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
110
17
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
18
|
var DEFAULT_BLACK_POINT = 0;
|
|
112
19
|
var DEFAULT_WHITE_POINT = 1;
|
|
113
20
|
var DEFAULT_GAMMA = 1;
|
|
21
|
+
var DEFAULT_OUTPUT_BLACK = 0;
|
|
22
|
+
var DEFAULT_OUTPUT_WHITE = 1;
|
|
23
|
+
var DEFAULT_CHANNEL = "rgb";
|
|
24
|
+
var LEVELS_CHANNELS = ["rgb", "red", "green", "blue"];
|
|
114
25
|
var MIN_GAMMA = 0.01;
|
|
115
26
|
var MAX_GAMMA = 10;
|
|
116
27
|
var levelsSchema = {
|
|
28
|
+
channel: {
|
|
29
|
+
type: "enum",
|
|
30
|
+
variants: {
|
|
31
|
+
rgb: {},
|
|
32
|
+
red: {},
|
|
33
|
+
green: {},
|
|
34
|
+
blue: {}
|
|
35
|
+
},
|
|
36
|
+
default: DEFAULT_CHANNEL,
|
|
37
|
+
description: "Channel"
|
|
38
|
+
},
|
|
117
39
|
blackPoint: {
|
|
118
40
|
type: "number",
|
|
119
41
|
min: 0,
|
|
120
42
|
max: 1,
|
|
121
43
|
step: 0.01,
|
|
122
44
|
default: DEFAULT_BLACK_POINT,
|
|
123
|
-
description: "
|
|
45
|
+
description: "Input black",
|
|
124
46
|
hiddenFromList: false
|
|
125
47
|
},
|
|
126
48
|
whitePoint: {
|
|
@@ -129,7 +51,7 @@ var levelsSchema = {
|
|
|
129
51
|
max: 1,
|
|
130
52
|
step: 0.01,
|
|
131
53
|
default: DEFAULT_WHITE_POINT,
|
|
132
|
-
description: "
|
|
54
|
+
description: "Input white",
|
|
133
55
|
hiddenFromList: false
|
|
134
56
|
},
|
|
135
57
|
gamma: {
|
|
@@ -140,21 +62,49 @@ var levelsSchema = {
|
|
|
140
62
|
default: DEFAULT_GAMMA,
|
|
141
63
|
description: "Gamma",
|
|
142
64
|
hiddenFromList: false
|
|
65
|
+
},
|
|
66
|
+
outputBlack: {
|
|
67
|
+
type: "number",
|
|
68
|
+
min: 0,
|
|
69
|
+
max: 1,
|
|
70
|
+
step: 0.01,
|
|
71
|
+
default: DEFAULT_OUTPUT_BLACK,
|
|
72
|
+
description: "Output black",
|
|
73
|
+
hiddenFromList: false
|
|
74
|
+
},
|
|
75
|
+
outputWhite: {
|
|
76
|
+
type: "number",
|
|
77
|
+
min: 0,
|
|
78
|
+
max: 1,
|
|
79
|
+
step: 0.01,
|
|
80
|
+
default: DEFAULT_OUTPUT_WHITE,
|
|
81
|
+
description: "Output white",
|
|
82
|
+
hiddenFromList: false
|
|
143
83
|
}
|
|
144
84
|
};
|
|
145
85
|
var resolve = (params) => ({
|
|
86
|
+
channel: params.channel ?? DEFAULT_CHANNEL,
|
|
146
87
|
blackPoint: params.blackPoint ?? DEFAULT_BLACK_POINT,
|
|
147
88
|
whitePoint: params.whitePoint ?? DEFAULT_WHITE_POINT,
|
|
148
|
-
gamma: params.gamma ?? DEFAULT_GAMMA
|
|
89
|
+
gamma: params.gamma ?? DEFAULT_GAMMA,
|
|
90
|
+
outputBlack: params.outputBlack ?? DEFAULT_OUTPUT_BLACK,
|
|
91
|
+
outputWhite: params.outputWhite ?? DEFAULT_OUTPUT_WHITE
|
|
149
92
|
});
|
|
150
93
|
var validateLevelsParams = (params) => {
|
|
151
94
|
assertEffectParamsObject(params, "Levels");
|
|
152
95
|
assertOptionalFiniteNumber(params.blackPoint, "blackPoint");
|
|
153
96
|
assertOptionalFiniteNumber(params.whitePoint, "whitePoint");
|
|
154
97
|
assertOptionalFiniteNumber(params.gamma, "gamma");
|
|
155
|
-
|
|
98
|
+
assertOptionalFiniteNumber(params.outputBlack, "outputBlack");
|
|
99
|
+
assertOptionalFiniteNumber(params.outputWhite, "outputWhite");
|
|
100
|
+
if (params.channel !== undefined && !LEVELS_CHANNELS.includes(params.channel)) {
|
|
101
|
+
throw new TypeError(`"channel" must be "rgb", "red", "green" or "blue", but got ${JSON.stringify(params.channel)}`);
|
|
102
|
+
}
|
|
103
|
+
const { blackPoint, whitePoint, gamma, outputBlack, outputWhite } = resolve(params);
|
|
156
104
|
validateUnitInterval(blackPoint, "blackPoint");
|
|
157
105
|
validateUnitInterval(whitePoint, "whitePoint");
|
|
106
|
+
validateUnitInterval(outputBlack, "outputBlack");
|
|
107
|
+
validateUnitInterval(outputWhite, "outputWhite");
|
|
158
108
|
if (blackPoint >= whitePoint) {
|
|
159
109
|
throw new TypeError(`"blackPoint" must be less than "whitePoint", but got ${JSON.stringify(blackPoint)} and ${JSON.stringify(whitePoint)}`);
|
|
160
110
|
}
|
|
@@ -185,6 +135,9 @@ uniform sampler2D uSource;
|
|
|
185
135
|
uniform float uBlackPoint;
|
|
186
136
|
uniform float uWhitePoint;
|
|
187
137
|
uniform float uGamma;
|
|
138
|
+
uniform float uOutputBlack;
|
|
139
|
+
uniform float uOutputWhite;
|
|
140
|
+
uniform int uChannel;
|
|
188
141
|
|
|
189
142
|
void main() {
|
|
190
143
|
vec4 sourceColor = texture(uSource, vUv);
|
|
@@ -202,8 +155,57 @@ void main() {
|
|
|
202
155
|
1.0
|
|
203
156
|
);
|
|
204
157
|
vec3 corrected = pow(normalized, vec3(1.0 / uGamma));
|
|
158
|
+
vec3 outputColor = mix(vec3(uOutputBlack), vec3(uOutputWhite), corrected);
|
|
159
|
+
|
|
160
|
+
if (uChannel == 1) {
|
|
161
|
+
color.r = outputColor.r;
|
|
162
|
+
} else if (uChannel == 2) {
|
|
163
|
+
color.g = outputColor.g;
|
|
164
|
+
} else if (uChannel == 3) {
|
|
165
|
+
color.b = outputColor.b;
|
|
166
|
+
} else {
|
|
167
|
+
color = outputColor;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
fragColor = vec4(color * alpha, alpha);
|
|
171
|
+
}
|
|
172
|
+
`;
|
|
173
|
+
var WEBGPU_SHADER = `
|
|
174
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
175
|
+
struct Params {
|
|
176
|
+
blackPoint: f32,
|
|
177
|
+
whitePoint: f32,
|
|
178
|
+
gamma: f32,
|
|
179
|
+
outputBlack: f32,
|
|
180
|
+
outputWhite: f32,
|
|
181
|
+
channel: f32,
|
|
182
|
+
padding0: f32,
|
|
183
|
+
padding1: f32,
|
|
184
|
+
}
|
|
185
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
186
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
187
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
205
188
|
|
|
206
|
-
|
|
189
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
190
|
+
let sourceColor = textureSampleLevel(source, sourceSampler, input.uv, 0.0);
|
|
191
|
+
let alpha = sourceColor.a;
|
|
192
|
+
if (alpha <= 0.0) {
|
|
193
|
+
return vec4f(0.0);
|
|
194
|
+
}
|
|
195
|
+
var color = sourceColor.rgb / alpha;
|
|
196
|
+
let normalized = clamp((color - vec3f(params.blackPoint)) / (params.whitePoint - params.blackPoint), vec3f(0.0), vec3f(1.0));
|
|
197
|
+
let corrected = pow(normalized, vec3f(1.0 / params.gamma));
|
|
198
|
+
let outputColor = mix(vec3f(params.outputBlack), vec3f(params.outputWhite), corrected);
|
|
199
|
+
if (params.channel == 1.0) {
|
|
200
|
+
color.r = outputColor.r;
|
|
201
|
+
} else if (params.channel == 2.0) {
|
|
202
|
+
color.g = outputColor.g;
|
|
203
|
+
} else if (params.channel == 3.0) {
|
|
204
|
+
color.b = outputColor.b;
|
|
205
|
+
} else {
|
|
206
|
+
color = outputColor;
|
|
207
|
+
}
|
|
208
|
+
return vec4f(color * alpha, alpha);
|
|
207
209
|
}
|
|
208
210
|
`;
|
|
209
211
|
var compileShader = (gl, type, source) => {
|
|
@@ -291,7 +293,10 @@ var setupLevels = (target) => {
|
|
|
291
293
|
uSource: gl.getUniformLocation(program, "uSource"),
|
|
292
294
|
uBlackPoint: gl.getUniformLocation(program, "uBlackPoint"),
|
|
293
295
|
uWhitePoint: gl.getUniformLocation(program, "uWhitePoint"),
|
|
294
|
-
uGamma: gl.getUniformLocation(program, "uGamma")
|
|
296
|
+
uGamma: gl.getUniformLocation(program, "uGamma"),
|
|
297
|
+
uOutputBlack: gl.getUniformLocation(program, "uOutputBlack"),
|
|
298
|
+
uOutputWhite: gl.getUniformLocation(program, "uOutputWhite"),
|
|
299
|
+
uChannel: gl.getUniformLocation(program, "uChannel")
|
|
295
300
|
}
|
|
296
301
|
};
|
|
297
302
|
};
|
|
@@ -299,49 +304,97 @@ var levels = createEffect({
|
|
|
299
304
|
type: "remotion/levels",
|
|
300
305
|
label: "levels()",
|
|
301
306
|
documentationLink: "https://www.remotion.dev/docs/effects/levels",
|
|
302
|
-
backend: "webgl2",
|
|
303
307
|
calculateKey: (params) => {
|
|
304
|
-
const { blackPoint, whitePoint, gamma } = resolve(params);
|
|
305
|
-
return `levels-${blackPoint}-${whitePoint}-${gamma}`;
|
|
308
|
+
const { channel, blackPoint, whitePoint, gamma, outputBlack, outputWhite } = resolve(params);
|
|
309
|
+
return `levels-${channel}-${blackPoint}-${whitePoint}-${gamma}-${outputBlack}-${outputWhite}`;
|
|
306
310
|
},
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
311
|
+
implementations: {
|
|
312
|
+
webgpu: Internals.createEffectImplementation({
|
|
313
|
+
setup: (target) => setupWebGpuSinglePass(target, "levels"),
|
|
314
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
315
|
+
if (!gpuDevice) {
|
|
316
|
+
throw new Error("A WebGPU device is required for the levels effect");
|
|
317
|
+
}
|
|
318
|
+
const r = resolve(params);
|
|
319
|
+
applyWebGpuSinglePass({
|
|
320
|
+
state,
|
|
321
|
+
source,
|
|
322
|
+
width,
|
|
323
|
+
height,
|
|
324
|
+
device: gpuDevice,
|
|
325
|
+
shader: WEBGPU_SHADER,
|
|
326
|
+
uniformData: new Float32Array([
|
|
327
|
+
r.blackPoint,
|
|
328
|
+
r.whitePoint,
|
|
329
|
+
r.gamma,
|
|
330
|
+
r.outputBlack,
|
|
331
|
+
r.outputWhite,
|
|
332
|
+
LEVELS_CHANNELS.indexOf(r.channel),
|
|
333
|
+
0,
|
|
334
|
+
0
|
|
335
|
+
])
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
cleanup: cleanupWebGpuSinglePass
|
|
339
|
+
}),
|
|
340
|
+
webgl2: Internals.createEffectImplementation({
|
|
341
|
+
setup: setupLevels,
|
|
342
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
343
|
+
const {
|
|
344
|
+
channel,
|
|
345
|
+
blackPoint,
|
|
346
|
+
whitePoint,
|
|
347
|
+
gamma,
|
|
348
|
+
outputBlack,
|
|
349
|
+
outputWhite
|
|
350
|
+
} = resolve(params);
|
|
351
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
352
|
+
gl.viewport(0, 0, width, height);
|
|
353
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
354
|
+
gl.clearColor(0, 0, 0, 0);
|
|
355
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
356
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
357
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
358
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
359
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
360
|
+
gl.useProgram(program);
|
|
361
|
+
if (uniforms.uSource)
|
|
362
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
363
|
+
if (uniforms.uBlackPoint) {
|
|
364
|
+
gl.uniform1f(uniforms.uBlackPoint, blackPoint);
|
|
365
|
+
}
|
|
366
|
+
if (uniforms.uWhitePoint) {
|
|
367
|
+
gl.uniform1f(uniforms.uWhitePoint, whitePoint);
|
|
368
|
+
}
|
|
369
|
+
if (uniforms.uGamma)
|
|
370
|
+
gl.uniform1f(uniforms.uGamma, gamma);
|
|
371
|
+
if (uniforms.uOutputBlack) {
|
|
372
|
+
gl.uniform1f(uniforms.uOutputBlack, outputBlack);
|
|
373
|
+
}
|
|
374
|
+
if (uniforms.uOutputWhite) {
|
|
375
|
+
gl.uniform1f(uniforms.uOutputWhite, outputWhite);
|
|
376
|
+
}
|
|
377
|
+
if (uniforms.uChannel) {
|
|
378
|
+
gl.uniform1i(uniforms.uChannel, LEVELS_CHANNELS.indexOf(channel));
|
|
379
|
+
}
|
|
380
|
+
gl.bindVertexArray(vao);
|
|
381
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
382
|
+
gl.bindVertexArray(null);
|
|
383
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
384
|
+
gl.useProgram(null);
|
|
385
|
+
},
|
|
386
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
387
|
+
gl.deleteTexture(textureSource);
|
|
388
|
+
gl.deleteBuffer(vbo);
|
|
389
|
+
gl.deleteProgram(program);
|
|
390
|
+
gl.deleteVertexArray(vao);
|
|
391
|
+
}
|
|
392
|
+
})
|
|
341
393
|
},
|
|
342
394
|
schema: levelsSchema,
|
|
343
395
|
validateParams: validateLevelsParams
|
|
344
396
|
});
|
|
345
397
|
export {
|
|
346
|
-
levels
|
|
398
|
+
levels,
|
|
399
|
+
levelsSchema
|
|
347
400
|
};
|