@remotion/effects 4.0.540 → 4.0.542

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 (133) hide show
  1. package/THIRD_PARTY_LICENSES.md +10 -0
  2. package/dist/esm/lightning.mjs +603 -0
  3. package/dist/esm/magnify.mjs +403 -0
  4. package/dist/esm/preview/barrel-distortion.mjs +303 -0
  5. package/dist/esm/preview/bevel-alpha.mjs +525 -0
  6. package/dist/esm/preview/blur.mjs +435 -0
  7. package/dist/esm/preview/brightness.mjs +95 -0
  8. package/dist/esm/preview/burlap.mjs +481 -0
  9. package/dist/esm/preview/checkerboard.mjs +8 -0
  10. package/dist/esm/preview/chromatic-aberration.mjs +308 -0
  11. package/dist/esm/preview/color-correction.mjs +522 -0
  12. package/dist/esm/preview/color-key.mjs +440 -0
  13. package/dist/esm/preview/contour-lines.mjs +608 -0
  14. package/dist/esm/preview/contrast.mjs +95 -0
  15. package/dist/esm/preview/corner-pin.mjs +6 -0
  16. package/dist/esm/preview/curves.mjs +357 -0
  17. package/dist/esm/preview/cylinder.mjs +273 -0
  18. package/dist/esm/preview/dot-grid.mjs +333 -0
  19. package/dist/esm/preview/drop-shadow.mjs +607 -0
  20. package/dist/esm/preview/duotone.mjs +344 -0
  21. package/dist/esm/preview/emboss.mjs +479 -0
  22. package/dist/esm/preview/evolve.mjs +485 -0
  23. package/dist/esm/preview/exposure.mjs +264 -0
  24. package/dist/esm/preview/film-burn.mjs +298 -0
  25. package/dist/esm/preview/fisheye.mjs +422 -0
  26. package/dist/esm/preview/flannel.mjs +401 -0
  27. package/dist/esm/preview/fractal-noise.mjs +642 -0
  28. package/dist/esm/preview/glow.mjs +598 -0
  29. package/dist/esm/preview/grayscale.mjs +86 -0
  30. package/dist/esm/preview/gridlines.mjs +8 -0
  31. package/dist/esm/preview/halftone-linear-gradient.mjs +523 -0
  32. package/dist/esm/preview/halftone.mjs +552 -0
  33. package/dist/esm/preview/hue.mjs +83 -0
  34. package/dist/esm/preview/index-00v3hr66.mjs +299 -0
  35. package/dist/esm/preview/index-0w4eqht8.mjs +351 -0
  36. package/dist/esm/preview/index-18y0zcy2.mjs +440 -0
  37. package/dist/esm/preview/index-1m1b1ad7.mjs +520 -0
  38. package/dist/esm/preview/index-34fxm3ax.mjs +518 -0
  39. package/dist/esm/preview/index-4fvp93ps.mjs +32 -0
  40. package/dist/esm/preview/index-4scpn12x.mjs +224 -0
  41. package/dist/esm/preview/index-4z6pt3ka.mjs +104 -0
  42. package/dist/esm/preview/index-618ky75w.mjs +51 -0
  43. package/dist/esm/preview/index-6agxdrvr.mjs +411 -0
  44. package/dist/esm/preview/index-6jkps947.mjs +120 -0
  45. package/dist/esm/preview/index-8agtsbw4.mjs +617 -0
  46. package/dist/esm/preview/index-8jx11jyn.mjs +29 -0
  47. package/dist/esm/preview/index-8p04sssx.mjs +123 -0
  48. package/dist/esm/preview/index-afdtmrh2.mjs +596 -0
  49. package/dist/esm/preview/index-b86qstcs.mjs +18 -0
  50. package/dist/esm/preview/index-cb77qg3g.mjs +587 -0
  51. package/dist/esm/preview/index-cdp7tr8x.mjs +122 -0
  52. package/dist/esm/preview/index-evy8hyah.mjs +55 -0
  53. package/dist/esm/preview/index-gnsce796.mjs +6 -0
  54. package/dist/esm/preview/index-kkvzt8b7.mjs +199 -0
  55. package/dist/esm/preview/index-r0v18b2n.mjs +425 -0
  56. package/dist/esm/preview/index-rswpzmm5.mjs +926 -0
  57. package/dist/esm/preview/index-s9mrx750.mjs +97 -0
  58. package/dist/esm/preview/index-tvfexb7s.mjs +164 -0
  59. package/dist/esm/preview/index-vp56k1gj.mjs +215 -0
  60. package/dist/esm/preview/index-wxhvgv2s.mjs +79 -0
  61. package/dist/esm/preview/index-wy95a41r.mjs +407 -0
  62. package/dist/esm/preview/index-ysnwfc4t.mjs +306 -0
  63. package/dist/esm/preview/index.mjs +51 -0
  64. package/dist/esm/preview/invert.mjs +84 -0
  65. package/dist/esm/preview/iris-wipe.mjs +315 -0
  66. package/dist/esm/preview/lens-blur.mjs +563 -0
  67. package/dist/esm/preview/levels.mjs +400 -0
  68. package/dist/esm/preview/light-leak.mjs +8 -0
  69. package/dist/esm/preview/light-trail.mjs +516 -0
  70. package/dist/esm/preview/lightning.mjs +603 -0
  71. package/dist/esm/preview/linear-gradient-tint.mjs +6 -0
  72. package/dist/esm/preview/linear-gradient.mjs +6 -0
  73. package/dist/esm/preview/linear-progressive-blur.mjs +516 -0
  74. package/dist/esm/preview/linear-progressive-pixelate.mjs +176 -0
  75. package/dist/esm/preview/lines.mjs +536 -0
  76. package/dist/esm/preview/liquid-contours.mjs +512 -0
  77. package/dist/esm/preview/long-shadows.mjs +437 -0
  78. package/dist/esm/preview/lut.mjs +601 -0
  79. package/dist/esm/preview/magnify.mjs +403 -0
  80. package/dist/esm/preview/mirror.mjs +341 -0
  81. package/dist/esm/preview/noise-displacement.mjs +584 -0
  82. package/dist/esm/preview/noise.mjs +318 -0
  83. package/dist/esm/preview/outline.mjs +725 -0
  84. package/dist/esm/preview/page-turn.mjs +302 -0
  85. package/dist/esm/preview/paper.mjs +1249 -0
  86. package/dist/esm/preview/pattern.mjs +6 -0
  87. package/dist/esm/preview/pixel-dissolve.mjs +360 -0
  88. package/dist/esm/preview/pixelate.mjs +249 -0
  89. package/dist/esm/preview/radial-progressive-blur.mjs +582 -0
  90. package/dist/esm/preview/radial-progressive-pixelate.mjs +220 -0
  91. package/dist/esm/preview/radial-wipe.mjs +224 -0
  92. package/dist/esm/preview/rain-fall.mjs +114 -0
  93. package/dist/esm/preview/region-blur.mjs +500 -0
  94. package/dist/esm/preview/rings.mjs +8 -0
  95. package/dist/esm/preview/roughen-edges.mjs +590 -0
  96. package/dist/esm/preview/saturation.mjs +86 -0
  97. package/dist/esm/preview/scale.mjs +109 -0
  98. package/dist/esm/preview/scanlines.mjs +362 -0
  99. package/dist/esm/preview/shadows-highlights.mjs +284 -0
  100. package/dist/esm/preview/shatter.mjs +868 -0
  101. package/dist/esm/preview/shine.mjs +368 -0
  102. package/dist/esm/preview/shrinkwrap.mjs +769 -0
  103. package/dist/esm/preview/skew.mjs +300 -0
  104. package/dist/esm/preview/snow-fall.mjs +170 -0
  105. package/dist/esm/preview/speckle.mjs +356 -0
  106. package/dist/esm/preview/sphere.mjs +252 -0
  107. package/dist/esm/preview/starburst.mjs +8 -0
  108. package/dist/esm/preview/tear.mjs +375 -0
  109. package/dist/esm/preview/thermal-vision.mjs +387 -0
  110. package/dist/esm/preview/tile.mjs +7 -0
  111. package/dist/esm/preview/tint.mjs +125 -0
  112. package/dist/esm/preview/translate.mjs +151 -0
  113. package/dist/esm/preview/turbulent-displace.mjs +613 -0
  114. package/dist/esm/preview/tv-signal-off.mjs +308 -0
  115. package/dist/esm/preview/venetian-blinds.mjs +341 -0
  116. package/dist/esm/preview/vibrance.mjs +254 -0
  117. package/dist/esm/preview/vignette.mjs +458 -0
  118. package/dist/esm/preview/wave.mjs +384 -0
  119. package/dist/esm/preview/waves.mjs +599 -0
  120. package/dist/esm/preview/white-balance.mjs +280 -0
  121. package/dist/esm/preview/white-noise.mjs +244 -0
  122. package/dist/esm/preview/zigzag.mjs +8 -0
  123. package/dist/esm/preview/zoom-blur.mjs +389 -0
  124. package/dist/lightning/geometry.d.ts +10 -0
  125. package/dist/lightning/index.d.ts +4 -0
  126. package/dist/lightning/mask.d.ts +2 -0
  127. package/dist/lightning/params.d.ts +259 -0
  128. package/dist/lightning/shaders.d.ts +2 -0
  129. package/dist/lightning.d.ts +2 -0
  130. package/dist/magnify/shader.d.ts +1 -0
  131. package/dist/magnify/webgpu-shader.d.ts +1 -0
  132. package/dist/magnify.d.ts +28 -0
  133. package/package.json +30 -6
@@ -0,0 +1,403 @@
1
+ import {
2
+ setupSinglePass,
3
+ prepareSinglePassSource,
4
+ drawSinglePass,
5
+ cleanupSinglePass
6
+ } from "./index-8p04sssx.mjs";
7
+ import {
8
+ assertOptionalFiniteNumber,
9
+ validateUnitInterval,
10
+ validateNonNegative
11
+ } from "./index-wxhvgv2s.mjs";
12
+ import {
13
+ WEBGPU_SINGLE_PASS_VERTEX,
14
+ setupWebGpuSinglePass,
15
+ cleanupWebGpuSinglePass,
16
+ applyWebGpuSinglePass
17
+ } from "./index-tvfexb7s.mjs";
18
+ import {
19
+ assertEffectParamsObject,
20
+ assertRequiredFiniteNumber
21
+ } from "./index-4fvp93ps.mjs";
22
+
23
+ // src/magnify.ts
24
+ import { Internals } from "remotion";
25
+
26
+ // src/magnify/shader.ts
27
+ var MAGNIFY_FRAGMENT_SHADER = `#version 300 es
28
+ precision highp float;
29
+ precision highp int;
30
+
31
+ in vec2 vUv;
32
+ out vec4 fragColor;
33
+ uniform sampler2D uSource;
34
+ uniform vec2 uResolution;
35
+ uniform vec2 uCenter;
36
+ uniform float uMagnification;
37
+ uniform float uSize;
38
+ uniform float uFeather;
39
+ uniform float uOpacity;
40
+ uniform bool uSquare;
41
+ uniform int uScaling;
42
+ uniform bool uIsolated;
43
+
44
+ vec4 pixelAt(ivec2 p) {
45
+ if (any(lessThan(p, ivec2(0))) || any(greaterThanEqual(p, textureSize(uSource, 0)))) {
46
+ return vec4(0.0);
47
+ }
48
+ return texelFetch(uSource, p, 0);
49
+ }
50
+
51
+ vec4 cubicWeights(float t) {
52
+ float t2 = t * t;
53
+ float t3 = t2 * t;
54
+ return vec4(-0.5 * t3 + t2 - 0.5 * t,
55
+ 1.5 * t3 - 2.5 * t2 + 1.0,
56
+ -1.5 * t3 + 2.0 * t2 + 0.5 * t,
57
+ 0.5 * t3 - 0.5 * t2);
58
+ }
59
+
60
+ vec4 sampleMagnified(vec2 uv, vec2 position) {
61
+ vec2 dimensions = vec2(textureSize(uSource, 0));
62
+ vec2 p = uv * dimensions;
63
+ if (uScaling == 0) return pixelAt(ivec2(floor(p)));
64
+ if (uScaling == 2) {
65
+ uvec2 xy = uvec2(floor(position));
66
+ uvec2 h = (xy.x ^ (xy.y + uvec2(1048576u, 2097152u))) * 1664525u + 1013904223u;
67
+ h = (h ^ (h >> 16u)) * 2246822519u;
68
+ vec2 jitter = (vec2(h ^ (h >> 13u)) / 4294967295.0 - 0.5) * max(1.0 - 1.0 / uMagnification, 0.0);
69
+ jitter.y = -jitter.y;
70
+ vec2 q = floor(p) + jitter;
71
+ ivec2 base = ivec2(floor(q));
72
+ vec2 f = fract(q);
73
+ return mix(mix(pixelAt(base), pixelAt(base + ivec2(1, 0)), f.x),
74
+ mix(pixelAt(base + ivec2(0, 1)), pixelAt(base + ivec2(1, 1)), f.x), f.y);
75
+ }
76
+ vec2 q = p - 0.5;
77
+ ivec2 base = ivec2(floor(q));
78
+ vec4 wx = cubicWeights(fract(q.x));
79
+ vec4 wy = cubicWeights(fract(q.y));
80
+ vec4 color = vec4(0.0);
81
+ for (int y = 0; y < 4; y++) {
82
+ for (int x = 0; x < 4; x++) {
83
+ color += pixelAt(base + ivec2(x - 1, y - 1)) * wx[x] * wy[y];
84
+ }
85
+ }
86
+ float alpha = clamp(color.a, 0.0, 1.0);
87
+ return vec4(clamp(color.rgb, vec3(0.0), vec3(alpha)), alpha);
88
+ }
89
+
90
+ void main() {
91
+ vec4 original = texture(uSource, vUv);
92
+ vec2 uv = vec2(vUv.x, 1.0 - vUv.y);
93
+ vec2 offset = (uv - uCenter) * uResolution;
94
+ float distance = uSquare ? max(abs(offset.x), abs(offset.y)) : length(offset);
95
+ float weight = 0.0;
96
+ if (uSize > 0.0) {
97
+ weight = uFeather > 0.0
98
+ ? 1.0 - smoothstep(uSize - uFeather, uSize, distance)
99
+ : clamp(uSize - distance + 0.5, 0.0, 1.0);
100
+ }
101
+ weight *= uOpacity;
102
+ if (weight <= 0.0) {
103
+ fragColor = uIsolated ? vec4(0.0) : original;
104
+ return;
105
+ }
106
+ vec2 sourceUv = uCenter + offset / (uResolution * uMagnification);
107
+ vec4 magnified = uMagnification == 1.0 ? original
108
+ : sampleMagnified(vec2(sourceUv.x, 1.0 - sourceUv.y), uv * uResolution);
109
+ fragColor = uIsolated ? magnified * weight : mix(original, magnified, weight);
110
+ }
111
+ `;
112
+
113
+ // src/magnify/webgpu-shader.ts
114
+ var MAGNIFY_WEBGPU_SHADER = `
115
+ ${WEBGPU_SINGLE_PASS_VERTEX}
116
+ @group(0) @binding(0) var source: texture_2d<f32>;
117
+ @group(0) @binding(1) var sourceSampler: sampler;
118
+ @group(0) @binding(2) var<uniform> params: Params;
119
+ struct Params {
120
+ resolutionAndCenter: vec4f,
121
+ lens: vec4f,
122
+ modes: vec4f,
123
+ }
124
+
125
+ fn pixelAt(p: vec2i) -> vec4f {
126
+ if (any(p < vec2i(0)) || any(p >= vec2i(textureDimensions(source)))) {
127
+ return vec4f(0);
128
+ }
129
+ return textureLoad(source, p, 0);
130
+ }
131
+
132
+ fn cubicWeights(t: f32) -> vec4f {
133
+ let t2 = t * t;
134
+ let t3 = t2 * t;
135
+ return vec4f(-0.5 * t3 + t2 - 0.5 * t,
136
+ 1.5 * t3 - 2.5 * t2 + 1.0,
137
+ -1.5 * t3 + 2.0 * t2 + 0.5 * t,
138
+ 0.5 * t3 - 0.5 * t2);
139
+ }
140
+
141
+ fn sampleMagnified(uv: vec2f, position: vec2f) -> vec4f {
142
+ let p = uv * vec2f(textureDimensions(source));
143
+ if (params.modes.y == 0) { return pixelAt(vec2i(floor(p))); }
144
+ if (params.modes.y == 2) {
145
+ let xy = vec2u(floor(position));
146
+ var h = (vec2u(xy.x) ^ (vec2u(xy.y) + vec2u(1048576u, 2097152u))) * 1664525u + 1013904223u;
147
+ h = (h ^ (h >> vec2u(16u))) * 2246822519u;
148
+ let jitter = (vec2f(h ^ (h >> vec2u(13u))) / 4294967295.0 - 0.5) * max(1.0 - 1.0 / params.lens.x, 0.0);
149
+ let q = floor(p) + jitter;
150
+ let base = vec2i(floor(q));
151
+ let f = fract(q);
152
+ return mix(mix(pixelAt(base), pixelAt(base + vec2i(1, 0)), f.x),
153
+ mix(pixelAt(base + vec2i(0, 1)), pixelAt(base + vec2i(1, 1)), f.x), f.y);
154
+ }
155
+ let q = p - 0.5;
156
+ let base = vec2i(floor(q));
157
+ let wx = cubicWeights(fract(q.x));
158
+ let wy = cubicWeights(fract(q.y));
159
+ var color = vec4f(0);
160
+ for (var y = 0; y < 4; y++) {
161
+ for (var x = 0; x < 4; x++) {
162
+ color += pixelAt(base + vec2i(x - 1, y - 1)) * wx[x] * wy[y];
163
+ }
164
+ }
165
+ let alpha = clamp(color.a, 0.0, 1.0);
166
+ return vec4f(clamp(color.rgb, vec3f(0), vec3f(alpha)), alpha);
167
+ }
168
+
169
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
170
+ let original = textureSampleLevel(source, sourceSampler, input.uv, 0);
171
+ let resolution = params.resolutionAndCenter.xy;
172
+ let center = params.resolutionAndCenter.zw;
173
+ let offset = (input.uv - center) * resolution;
174
+ let distance = select(length(offset), max(abs(offset.x), abs(offset.y)), params.modes.x == 1);
175
+ let size = params.lens.y;
176
+ let feather = params.lens.z;
177
+ var weight = 0.0;
178
+ if (size > 0) {
179
+ if (feather > 0) {
180
+ weight = 1.0 - smoothstep(size - feather, size, distance);
181
+ } else {
182
+ weight = clamp(size - distance + 0.5, 0.0, 1.0);
183
+ }
184
+ }
185
+ weight *= params.lens.w;
186
+ if (weight <= 0) {
187
+ return select(original, vec4f(0), params.modes.z == 1);
188
+ }
189
+ var magnified = original;
190
+ if (params.lens.x != 1) {
191
+ magnified = sampleMagnified(center + offset / (resolution * params.lens.x), input.uv * resolution);
192
+ }
193
+ return select(mix(original, magnified, weight), magnified * weight, params.modes.z == 1);
194
+ }
195
+ `;
196
+
197
+ // src/magnify.ts
198
+ var DEFAULT_SHAPE = "circle";
199
+ var DEFAULT_CENTER = [0.5, 0.5];
200
+ var DEFAULT_MAGNIFICATION = 200;
201
+ var DEFAULT_LINK = "none";
202
+ var DEFAULT_SIZE = 100;
203
+ var DEFAULT_FEATHER = 0;
204
+ var DEFAULT_OPACITY = 1;
205
+ var DEFAULT_SCALING = "standard";
206
+ var DEFAULT_BLENDING_MODE = "normal";
207
+ var magnifySchema = {
208
+ shape: {
209
+ type: "enum",
210
+ variants: { circle: {}, square: {} },
211
+ default: DEFAULT_SHAPE,
212
+ description: "Shape"
213
+ },
214
+ center: {
215
+ type: "uv-coordinate",
216
+ min: 0,
217
+ max: 1,
218
+ step: 0.01,
219
+ default: DEFAULT_CENTER,
220
+ description: "Center"
221
+ },
222
+ magnification: {
223
+ type: "number",
224
+ min: 1,
225
+ max: 1e4,
226
+ step: 1,
227
+ default: DEFAULT_MAGNIFICATION,
228
+ description: "Magnification (%)",
229
+ hiddenFromList: false
230
+ },
231
+ link: {
232
+ type: "enum",
233
+ variants: { none: {}, size: {}, "size-and-feather": {} },
234
+ default: DEFAULT_LINK,
235
+ description: "Link"
236
+ },
237
+ size: {
238
+ type: "number",
239
+ min: 0,
240
+ max: 4000,
241
+ step: 1,
242
+ default: DEFAULT_SIZE,
243
+ description: "Size",
244
+ hiddenFromList: false
245
+ },
246
+ feather: {
247
+ type: "number",
248
+ min: 0,
249
+ max: 4000,
250
+ step: 1,
251
+ default: DEFAULT_FEATHER,
252
+ description: "Feather",
253
+ hiddenFromList: false
254
+ },
255
+ opacity: {
256
+ type: "number",
257
+ min: 0,
258
+ max: 1,
259
+ step: 0.01,
260
+ default: DEFAULT_OPACITY,
261
+ description: "Opacity",
262
+ hiddenFromList: false
263
+ },
264
+ scaling: {
265
+ type: "enum",
266
+ variants: { standard: {}, soft: {}, scatter: {} },
267
+ default: DEFAULT_SCALING,
268
+ description: "Scaling"
269
+ },
270
+ blendingMode: {
271
+ type: "enum",
272
+ variants: { normal: {}, none: {} },
273
+ default: DEFAULT_BLENDING_MODE,
274
+ description: "Blending mode"
275
+ }
276
+ };
277
+ var resolve = (params) => ({
278
+ shape: params.shape ?? DEFAULT_SHAPE,
279
+ center: params.center ?? DEFAULT_CENTER,
280
+ magnification: params.magnification ?? DEFAULT_MAGNIFICATION,
281
+ link: params.link ?? DEFAULT_LINK,
282
+ size: params.size ?? DEFAULT_SIZE,
283
+ feather: params.feather ?? DEFAULT_FEATHER,
284
+ opacity: params.opacity ?? DEFAULT_OPACITY,
285
+ scaling: params.scaling ?? DEFAULT_SCALING,
286
+ blendingMode: params.blendingMode ?? DEFAULT_BLENDING_MODE
287
+ });
288
+ var magnify = Internals.createEffect({
289
+ type: "dev.remotion.effects.magnify",
290
+ label: "magnify()",
291
+ documentationLink: "https://www.remotion.dev/docs/effects/magnify",
292
+ calculateKey: (params) => {
293
+ const r = resolve(params);
294
+ return `magnify-${r.shape}-${r.center.join(":")}-${r.magnification}-${r.link}-${r.size}-${r.feather}-${r.opacity}-${r.scaling}-${r.blendingMode}`;
295
+ },
296
+ implementations: {
297
+ webgl2: Internals.createEffectImplementation({
298
+ setup: (target) => setupSinglePass(target, MAGNIFY_FRAGMENT_SHADER, "magnify", [
299
+ "uResolution",
300
+ "uCenter",
301
+ "uMagnification",
302
+ "uSize",
303
+ "uFeather",
304
+ "uOpacity",
305
+ "uSquare",
306
+ "uScaling",
307
+ "uIsolated"
308
+ ]),
309
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
310
+ const r = resolve(params);
311
+ const scale = r.magnification / 100;
312
+ const { gl, uniforms } = state;
313
+ prepareSinglePassSource({
314
+ state,
315
+ source,
316
+ width,
317
+ height,
318
+ flipSourceY
319
+ });
320
+ gl.uniform2f(uniforms.uResolution, width, height);
321
+ gl.uniform2f(uniforms.uCenter, r.center[0], r.center[1]);
322
+ gl.uniform1f(uniforms.uMagnification, scale);
323
+ gl.uniform1f(uniforms.uSize, r.size * (r.link === "none" ? 1 : scale));
324
+ gl.uniform1f(uniforms.uFeather, r.feather * (r.link === "size-and-feather" ? scale : 1));
325
+ gl.uniform1f(uniforms.uOpacity, r.opacity);
326
+ gl.uniform1i(uniforms.uSquare, r.shape === "square" ? 1 : 0);
327
+ gl.uniform1i(uniforms.uScaling, ["standard", "soft", "scatter"].indexOf(r.scaling));
328
+ gl.uniform1i(uniforms.uIsolated, r.blendingMode === "none" ? 1 : 0);
329
+ drawSinglePass(state);
330
+ },
331
+ cleanup: cleanupSinglePass
332
+ }),
333
+ webgpu: Internals.createEffectImplementation({
334
+ setup: (target) => setupWebGpuSinglePass(target, "magnify"),
335
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
336
+ if (!gpuDevice) {
337
+ throw new Error("A WebGPU device is required for the magnify effect");
338
+ }
339
+ const r = resolve(params);
340
+ const scale = r.magnification / 100;
341
+ applyWebGpuSinglePass({
342
+ state,
343
+ source,
344
+ width,
345
+ height,
346
+ device: gpuDevice,
347
+ shader: MAGNIFY_WEBGPU_SHADER,
348
+ uniformData: new Float32Array([
349
+ width,
350
+ height,
351
+ r.center[0],
352
+ r.center[1],
353
+ scale,
354
+ r.size * (r.link === "none" ? 1 : scale),
355
+ r.feather * (r.link === "size-and-feather" ? scale : 1),
356
+ r.opacity,
357
+ r.shape === "square" ? 1 : 0,
358
+ ["standard", "soft", "scatter"].indexOf(r.scaling),
359
+ r.blendingMode === "none" ? 1 : 0,
360
+ 0
361
+ ])
362
+ });
363
+ },
364
+ cleanup: cleanupWebGpuSinglePass
365
+ })
366
+ },
367
+ schema: magnifySchema,
368
+ validateParams: (params) => {
369
+ assertEffectParamsObject(params, "Magnify");
370
+ for (const name of [
371
+ "magnification",
372
+ "size",
373
+ "feather",
374
+ "opacity"
375
+ ]) {
376
+ assertOptionalFiniteNumber(params[name], name);
377
+ }
378
+ if (params.center !== undefined) {
379
+ if (!Array.isArray(params.center) || params.center.length !== 2) {
380
+ throw new TypeError('"center" must be a [number, number] tuple');
381
+ }
382
+ assertRequiredFiniteNumber(params.center[0], "center[0]");
383
+ assertRequiredFiniteNumber(params.center[1], "center[1]");
384
+ }
385
+ const r = resolve(params);
386
+ validateUnitInterval(r.center[0], "center[0]");
387
+ validateUnitInterval(r.center[1], "center[1]");
388
+ if (r.magnification < 1 || r.magnification > 1e4) {
389
+ throw new TypeError('"magnification" must be between 1 and 10000');
390
+ }
391
+ validateNonNegative(r.size, "size");
392
+ validateNonNegative(r.feather, "feather");
393
+ validateUnitInterval(r.opacity, "opacity");
394
+ for (const name of ["shape", "link", "scaling", "blendingMode"]) {
395
+ if (!Object.hasOwn(magnifySchema[name].variants, r[name])) {
396
+ throw new TypeError(`Invalid "${name}": ${JSON.stringify(r[name])}`);
397
+ }
398
+ }
399
+ }
400
+ });
401
+ export {
402
+ magnify
403
+ };
@@ -0,0 +1,303 @@
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";
14
+
15
+ // src/barrel-distortion/index.ts
16
+ import { Internals as Internals2 } from "remotion";
17
+
18
+ // src/barrel-distortion/barrel-distortion-runtime.ts
19
+ import { Internals } from "remotion";
20
+
21
+ // src/barrel-distortion/barrel-distortion-shaders.ts
22
+ var BARREL_DISTORTION_VS = `#version 300 es
23
+ layout(location = 0) in vec2 aPos;
24
+ layout(location = 1) in vec2 aUv;
25
+ out vec2 vUv;
26
+ void main() {
27
+ vUv = aUv;
28
+ gl_Position = vec4(aPos, 0.0, 1.0);
29
+ }
30
+ `;
31
+ var BARREL_DISTORTION_FS = `#version 300 es
32
+ precision highp float;
33
+ in vec2 vUv;
34
+ out vec4 fragColor;
35
+
36
+ uniform sampler2D uSource;
37
+ uniform float uAmount;
38
+
39
+ void main() {
40
+ vec2 centered = vUv * 2.0 - 1.0;
41
+ vec2 warped = centered;
42
+ warped.x *= 1.0 + uAmount * centered.y * centered.y;
43
+ warped.y *= 1.0 + uAmount * centered.x * centered.x;
44
+
45
+ vec2 srcUv = warped * 0.5 + 0.5;
46
+
47
+ if (
48
+ srcUv.x < 0.0 ||
49
+ srcUv.x > 1.0 ||
50
+ srcUv.y < 0.0 ||
51
+ srcUv.y > 1.0
52
+ ) {
53
+ fragColor = vec4(0.0);
54
+ return;
55
+ }
56
+
57
+ fragColor = texture(uSource, srcUv);
58
+ }
59
+ `;
60
+
61
+ // src/barrel-distortion/barrel-distortion-runtime.ts
62
+ var { createWebGL2ContextError } = Internals;
63
+ var compileShader = (gl, type, source) => {
64
+ const shader = gl.createShader(type);
65
+ if (!shader) {
66
+ throw new Error("Failed to create WebGL shader");
67
+ }
68
+ gl.shaderSource(shader, source);
69
+ gl.compileShader(shader);
70
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
71
+ const log = gl.getShaderInfoLog(shader);
72
+ gl.deleteShader(shader);
73
+ throw new Error(`Shader compile failed: ${log ?? "(no log)"}`);
74
+ }
75
+ return shader;
76
+ };
77
+ var linkProgram = (gl, vs, fs) => {
78
+ const program = gl.createProgram();
79
+ if (!program) {
80
+ throw new Error("Failed to create WebGL program");
81
+ }
82
+ gl.attachShader(program, vs);
83
+ gl.attachShader(program, fs);
84
+ gl.linkProgram(program);
85
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
86
+ const log = gl.getProgramInfoLog(program);
87
+ gl.deleteProgram(program);
88
+ throw new Error(`Program link failed: ${log ?? "(no log)"}`);
89
+ }
90
+ return program;
91
+ };
92
+ var createProgram = (gl, vertexSource, fragmentSource) => {
93
+ const vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
94
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
95
+ const program = linkProgram(gl, vs, fs);
96
+ gl.deleteShader(vs);
97
+ gl.deleteShader(fs);
98
+ return program;
99
+ };
100
+ var createRgbaTexture = (gl) => {
101
+ const texture = gl.createTexture();
102
+ if (!texture) {
103
+ throw new Error("Failed to create WebGL texture");
104
+ }
105
+ gl.bindTexture(gl.TEXTURE_2D, texture);
106
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
107
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
108
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
109
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
110
+ gl.bindTexture(gl.TEXTURE_2D, null);
111
+ return texture;
112
+ };
113
+ var setupBarrelDistortion = (target) => {
114
+ const gl = target.getContext("webgl2", {
115
+ premultipliedAlpha: true,
116
+ alpha: true,
117
+ preserveDrawingBuffer: true
118
+ });
119
+ if (!gl) {
120
+ throw createWebGL2ContextError("barrel distortion effect");
121
+ }
122
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
123
+ const program = createProgram(gl, BARREL_DISTORTION_VS, BARREL_DISTORTION_FS);
124
+ const vao = gl.createVertexArray();
125
+ if (!vao) {
126
+ throw new Error("Failed to create WebGL vertex array");
127
+ }
128
+ gl.bindVertexArray(vao);
129
+ const data = new Float32Array([
130
+ -1,
131
+ -1,
132
+ 0,
133
+ 0,
134
+ 1,
135
+ -1,
136
+ 1,
137
+ 0,
138
+ -1,
139
+ 1,
140
+ 0,
141
+ 1,
142
+ 1,
143
+ 1,
144
+ 1,
145
+ 1
146
+ ]);
147
+ const vbo = gl.createBuffer();
148
+ if (!vbo) {
149
+ throw new Error("Failed to create WebGL buffer");
150
+ }
151
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
152
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
153
+ gl.enableVertexAttribArray(0);
154
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);
155
+ gl.enableVertexAttribArray(1);
156
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);
157
+ gl.bindVertexArray(null);
158
+ const textureSource = createRgbaTexture(gl);
159
+ return {
160
+ gl,
161
+ program,
162
+ vao,
163
+ vbo,
164
+ textureSource,
165
+ uniforms: {
166
+ uSource: gl.getUniformLocation(program, "uSource"),
167
+ uAmount: gl.getUniformLocation(program, "uAmount")
168
+ }
169
+ };
170
+ };
171
+ var cleanupBarrelDistortion = (state) => {
172
+ const { gl, program, vao, vbo, textureSource } = state;
173
+ gl.deleteTexture(textureSource);
174
+ gl.deleteBuffer(vbo);
175
+ gl.deleteProgram(program);
176
+ gl.deleteVertexArray(vao);
177
+ };
178
+ var drawFullscreenQuad = (state) => {
179
+ const { gl, vao } = state;
180
+ gl.bindVertexArray(vao);
181
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
182
+ gl.bindVertexArray(null);
183
+ };
184
+ var applyBarrelDistortion = ({
185
+ state,
186
+ source,
187
+ width,
188
+ height,
189
+ amount,
190
+ flipSourceY
191
+ }) => {
192
+ const { gl, program, textureSource, uniforms } = state;
193
+ gl.viewport(0, 0, width, height);
194
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
195
+ gl.bindTexture(gl.TEXTURE_2D, textureSource);
196
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
197
+ gl.bindTexture(gl.TEXTURE_2D, null);
198
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
199
+ gl.clearColor(0, 0, 0, 0);
200
+ gl.clear(gl.COLOR_BUFFER_BIT);
201
+ gl.useProgram(program);
202
+ if (uniforms.uSource)
203
+ gl.uniform1i(uniforms.uSource, 0);
204
+ if (uniforms.uAmount)
205
+ gl.uniform1f(uniforms.uAmount, amount);
206
+ gl.activeTexture(gl.TEXTURE0);
207
+ gl.bindTexture(gl.TEXTURE_2D, textureSource);
208
+ drawFullscreenQuad(state);
209
+ gl.bindTexture(gl.TEXTURE_2D, null);
210
+ gl.useProgram(null);
211
+ };
212
+
213
+ // src/barrel-distortion/webgpu-shader.ts
214
+ var BARREL_DISTORTION_WEBGPU_SHADER = `
215
+ ${WEBGPU_SINGLE_PASS_VERTEX}
216
+ struct Params { amount: vec4f, }
217
+ @group(0) @binding(0) var source: texture_2d<f32>;
218
+ @group(0) @binding(1) var sourceSampler: sampler;
219
+ @group(0) @binding(2) var<uniform> params: Params;
220
+
221
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
222
+ let centered = input.uv * 2.0 - 1.0;
223
+ var warped = centered;
224
+ warped.x *= 1.0 + params.amount.x * centered.y * centered.y;
225
+ warped.y *= 1.0 + params.amount.x * centered.x * centered.x;
226
+ let uv = warped * 0.5 + 0.5;
227
+ if (any(uv < vec2f(0)) || any(uv > vec2f(1))) { return vec4f(0); }
228
+ return textureSampleLevel(source, sourceSampler, uv, 0);
229
+ }
230
+ `;
231
+
232
+ // src/barrel-distortion/index.ts
233
+ var { createEffect } = Internals2;
234
+ var DEFAULT_BARREL_DISTORTION_AMOUNT = 0.25;
235
+ var barrelDistortionSchema = {
236
+ amount: {
237
+ type: "number",
238
+ min: 0,
239
+ max: 1,
240
+ step: 0.01,
241
+ default: DEFAULT_BARREL_DISTORTION_AMOUNT,
242
+ description: "Amount",
243
+ hiddenFromList: false
244
+ }
245
+ };
246
+ var resolve = (p) => ({
247
+ amount: p.amount ?? DEFAULT_BARREL_DISTORTION_AMOUNT
248
+ });
249
+ var validateBarrelDistortionParams = (params) => {
250
+ assertEffectParamsObject(params, "Barrel distortion");
251
+ assertOptionalFiniteNumber(params.amount, "amount");
252
+ const resolved = resolve(params);
253
+ validateUnitInterval(resolved.amount, "amount");
254
+ };
255
+ var barrelDistortion = createEffect({
256
+ type: "dev.remotion.effects.barrelDistortion",
257
+ label: "barrelDistortion()",
258
+ documentationLink: "https://www.remotion.dev/docs/effects/barrel-distortion",
259
+ calculateKey: (params) => {
260
+ const r = resolve(params);
261
+ return `barrel-distortion-${r.amount}`;
262
+ },
263
+ implementations: {
264
+ webgpu: Internals2.createEffectImplementation({
265
+ setup: (target) => setupWebGpuSinglePass(target, "barrel-distortion"),
266
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
267
+ if (!gpuDevice) {
268
+ throw new Error("A WebGPU device is required for the barrel-distortion effect");
269
+ }
270
+ applyWebGpuSinglePass({
271
+ state,
272
+ source,
273
+ width,
274
+ height,
275
+ device: gpuDevice,
276
+ shader: BARREL_DISTORTION_WEBGPU_SHADER,
277
+ uniformData: new Float32Array([resolve(params).amount, 0, 0, 0])
278
+ });
279
+ },
280
+ cleanup: cleanupWebGpuSinglePass
281
+ }),
282
+ webgl2: Internals2.createEffectImplementation({
283
+ setup: (target) => setupBarrelDistortion(target),
284
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
285
+ const r = resolve(params);
286
+ applyBarrelDistortion({
287
+ state,
288
+ source,
289
+ width,
290
+ height,
291
+ amount: r.amount,
292
+ flipSourceY
293
+ });
294
+ },
295
+ cleanup: (state) => cleanupBarrelDistortion(state)
296
+ })
297
+ },
298
+ schema: barrelDistortionSchema,
299
+ validateParams: validateBarrelDistortionParams
300
+ });
301
+ export {
302
+ barrelDistortion
303
+ };