@remotion/effects 4.0.541 → 4.0.543

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,563 @@
1
+ import {
2
+ assertOptionalFiniteNumber,
3
+ validateUnitInterval,
4
+ validateNonNegative
5
+ } from "./index-wxhvgv2s.mjs";
6
+ import {
7
+ WEBGPU_SINGLE_PASS_VERTEX,
8
+ setupWebGpuSinglePass,
9
+ cleanupWebGpuSinglePass,
10
+ applyWebGpuSinglePass
11
+ } from "./index-tvfexb7s.mjs";
12
+ import {
13
+ assertEffectParamsObject,
14
+ assertOptionalBoolean
15
+ } from "./index-4fvp93ps.mjs";
16
+
17
+ // src/lens-blur/index.ts
18
+ import { Internals } from "remotion";
19
+
20
+ // src/lens-blur/shader.ts
21
+ var LENS_BLUR_FRAGMENT_SHADER = `#version 300 es
22
+ precision highp float;
23
+
24
+ in vec2 vUv;
25
+ out vec4 fragColor;
26
+
27
+ uniform sampler2D uSource;
28
+ uniform vec2 uResolution;
29
+ uniform float uRadius;
30
+ uniform int uIrisShape;
31
+ uniform float uIrisRoundness;
32
+ uniform float uIrisRotation;
33
+ uniform float uIrisAspectRatio;
34
+ uniform float uHighlightGain;
35
+ uniform float uHighlightThreshold;
36
+ uniform float uHighlightSaturation;
37
+ uniform bool uRepeatEdgePixels;
38
+ uniform int uSamples;
39
+ uniform bool uLinearLight;
40
+
41
+ const float PI = 3.141592653589793;
42
+ const float GOLDEN_ANGLE = 2.399963229728653;
43
+
44
+ vec3 toLinear(vec3 color) {
45
+ return mix(color / 12.92, pow((color + 0.055) / 1.055, vec3(2.4)), step(vec3(0.04045), color));
46
+ }
47
+
48
+ vec3 toSrgb(vec3 color) {
49
+ return mix(color * 12.92, 1.055 * pow(max(color, vec3(0.0)), vec3(1.0 / 2.4)) - 0.055, step(vec3(0.0031308), color));
50
+ }
51
+
52
+ vec4 readSource(vec2 uv) {
53
+ vec4 sampleColor = texture(uSource, uv);
54
+ if (sampleColor.a <= 0.0) return vec4(0.0);
55
+ vec3 color = sampleColor.rgb / sampleColor.a;
56
+ float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
57
+ if (uLinearLight) color = toLinear(color);
58
+ if (luminance >= uHighlightThreshold) {
59
+ float brightest = max(color.r, max(color.g, color.b));
60
+ vec3 highlight = mix(vec3(brightest), color, uHighlightSaturation);
61
+ color += highlight * (4.0 * uHighlightGain);
62
+ }
63
+
64
+ float coverage = 1.0;
65
+ if (!uRepeatEdgePixels) {
66
+ // The texture clamps to its edge texels. Fade their bilinear footprint
67
+ // against transparent texels beyond the canvas instead of cutting it off.
68
+ vec2 pixel = uv * uResolution;
69
+ vec2 nearEdge = clamp(pixel + 0.5, 0.0, 1.0);
70
+ vec2 farEdge = clamp(uResolution + 0.5 - pixel, 0.0, 1.0);
71
+ coverage = nearEdge.x * nearEdge.y * farEdge.x * farEdge.y;
72
+ }
73
+ return vec4(color * sampleColor.a, sampleColor.a) * coverage;
74
+ }
75
+
76
+ void main() {
77
+ // A zero radius must be an exact identity, including with highlight gain.
78
+ if (uRadius == 0.0) {
79
+ fragColor = texture(uSource, vUv);
80
+ return;
81
+ }
82
+
83
+ vec4 sum = vec4(0.0);
84
+ float totalWeight = 0.0;
85
+ for (int i = 0; i < 2048; i++) {
86
+ if (i >= uSamples) break;
87
+ float angle = float(i) * GOLDEN_ANGLE;
88
+ float boundary = 1.0;
89
+ if (uIrisShape < 11) {
90
+ float halfSector = PI / float(uIrisShape);
91
+ float localAngle = mod(angle + PI / 2.0, 2.0 * halfSector) - halfSector;
92
+ float polygon = cos(halfSector) / cos(localAngle);
93
+ boundary = mix(polygon, 1.0, uIrisRoundness);
94
+ }
95
+ float distance = sqrt((float(i) + 0.5) / float(uSamples)) * boundary;
96
+ float rotatedAngle = angle + uIrisRotation;
97
+ vec2 offset = vec2(cos(rotatedAngle) * uIrisAspectRatio, -sin(rotatedAngle)) * distance * uRadius;
98
+ // Radially mapping a disc onto a polygon changes area by boundary^2.
99
+ // Weight by that Jacobian to keep the aperture uniformly illuminated.
100
+ float weight = boundary * boundary;
101
+ sum += readSource(vUv - offset / uResolution) * weight;
102
+ totalWeight += weight;
103
+ }
104
+
105
+ vec4 color = sum / totalWeight;
106
+ if (uLinearLight && color.a > 0.0) {
107
+ color.rgb = toSrgb(color.rgb / color.a) * color.a;
108
+ }
109
+ // Keep the result premultiplied even when highlights exceed display white.
110
+ fragColor = vec4(clamp(color.rgb, vec3(0.0), vec3(color.a)), color.a);
111
+ }
112
+ `;
113
+
114
+ // src/lens-blur/webgpu-shader.ts
115
+ var LENS_BLUR_WEBGPU_SHADER = `
116
+ ${WEBGPU_SINGLE_PASS_VERTEX}
117
+ @group(0) @binding(0) var source: texture_2d<f32>;
118
+ @group(0) @binding(1) var sourceSampler: sampler;
119
+ @group(0) @binding(2) var<uniform> params: Params;
120
+ // Aperture geometry and highlight controls adapted from EffectCraft's blur2.rs (MIT).
121
+ // See ../../THIRD_PARTY_LICENSES.md.
122
+ struct Params {resolution: vec2f, radius: f32, shape: f32, iris: vec4f, highlights: vec4f, options: vec4f,}
123
+ const PI=3.141592653589793;
124
+ const GOLDEN_ANGLE=2.399963229728653;
125
+ fn toLinear(color: vec3f) -> vec3f {
126
+ return mix(color/12.92,pow((color+0.055)/1.055,vec3f(2.4)),step(vec3f(0.04045),color));
127
+ }
128
+ fn toSrgb(color: vec3f) -> vec3f {
129
+ return mix(color*12.92,1.055*pow(max(color,vec3f(0)),vec3f(1.0/2.4))-0.055,step(vec3f(0.0031308),color));
130
+ }
131
+ fn readSource(uv: vec2f) -> vec4f {
132
+ let sampled=textureSampleLevel(source,sourceSampler,uv,0);
133
+ if (sampled.a<=0.0) {return vec4f(0);}
134
+ var color=sampled.rgb/sampled.a;
135
+ let luminance=dot(color,vec3f(0.2126,0.7152,0.0722));
136
+ if (params.options.y!=0.0) {color=toLinear(color);}
137
+ if (luminance>=params.highlights.y) {
138
+ let brightest=max(color.r,max(color.g,color.b));
139
+ let highlight=mix(vec3f(brightest),color,params.highlights.z);
140
+ color+=highlight*(4.0*params.highlights.x);
141
+ }
142
+ var coverage=1.0;
143
+ if (params.highlights.w==0.0) {
144
+ let pixel=uv*params.resolution;
145
+ let nearEdge=clamp(pixel+0.5,vec2f(0),vec2f(1));
146
+ let farEdge=clamp(params.resolution+0.5-pixel,vec2f(0),vec2f(1));
147
+ coverage=nearEdge.x*nearEdge.y*farEdge.x*farEdge.y;
148
+ }
149
+ return vec4f(color*sampled.a,sampled.a)*coverage;
150
+ }
151
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
152
+ if (params.radius==0.0) {return textureSampleLevel(source,sourceSampler,input.uv,0);}
153
+ var sum=vec4f(0);var total=0.0;
154
+ for (var i=0;i<2048;i++) {
155
+ if (f32(i)>=params.options.x) {break;}
156
+ let angle=f32(i)*GOLDEN_ANGLE;
157
+ var boundary=1.0;
158
+ if (params.shape<11.0) {
159
+ let halfSector=PI/params.shape;
160
+ let value=angle+PI/2.0;
161
+ let localAngle=value-floor(value/(2.0*halfSector))*(2.0*halfSector)-halfSector;
162
+ let polygon=cos(halfSector)/cos(localAngle);
163
+ boundary=mix(polygon,1.0,params.iris.x);
164
+ }
165
+ let distance=sqrt((f32(i)+0.5)/params.options.x)*boundary;
166
+ let rotatedAngle=angle+params.iris.y;
167
+ let offset=vec2f(cos(rotatedAngle)*params.iris.z,sin(rotatedAngle))*distance*params.radius;
168
+ let weight=boundary*boundary;
169
+ sum+=readSource(input.uv-offset/params.resolution)*weight;
170
+ total+=weight;
171
+ }
172
+ var color=sum/total;
173
+ if (params.options.y!=0.0 && color.a>0.0) {color=vec4f(toSrgb(color.rgb/color.a)*color.a,color.a);}
174
+ return vec4f(clamp(color.rgb,vec3f(0),vec3f(color.a)),color.a);
175
+ }
176
+ `;
177
+
178
+ // src/lens-blur/index.ts
179
+ var { createEffect, createWebGL2ContextError } = Internals;
180
+ var DEFAULT_RADIUS = 10;
181
+ var DEFAULT_IRIS_SHAPE = "hexagon";
182
+ var DEFAULT_IRIS_ROUNDNESS = 0;
183
+ var DEFAULT_IRIS_ROTATION = 0;
184
+ var DEFAULT_IRIS_ASPECT_RATIO = 1;
185
+ var DEFAULT_HIGHLIGHT_GAIN = 0;
186
+ var DEFAULT_HIGHLIGHT_THRESHOLD = 1;
187
+ var DEFAULT_HIGHLIGHT_SATURATION = 1;
188
+ var DEFAULT_REPEAT_EDGE_PIXELS = false;
189
+ var DEFAULT_SAMPLES = 256;
190
+ var DEFAULT_LINEAR_LIGHT = false;
191
+ var IRIS_SHAPES = [
192
+ "triangle",
193
+ "square",
194
+ "pentagon",
195
+ "hexagon",
196
+ "heptagon",
197
+ "octagon",
198
+ "nonagon",
199
+ "decagon",
200
+ "circle"
201
+ ];
202
+ var lensBlurSchema = {
203
+ radius: {
204
+ type: "number",
205
+ default: DEFAULT_RADIUS,
206
+ description: "Blur radius in pixels",
207
+ min: 0,
208
+ max: 200,
209
+ step: 1,
210
+ hiddenFromList: false
211
+ },
212
+ irisShape: {
213
+ type: "enum",
214
+ default: DEFAULT_IRIS_SHAPE,
215
+ description: "Iris shape",
216
+ variants: {
217
+ triangle: {},
218
+ square: {},
219
+ pentagon: {},
220
+ hexagon: {},
221
+ heptagon: {},
222
+ octagon: {},
223
+ nonagon: {},
224
+ decagon: {},
225
+ circle: {}
226
+ }
227
+ },
228
+ irisRoundness: {
229
+ type: "number",
230
+ default: DEFAULT_IRIS_ROUNDNESS,
231
+ description: "Roundness of the iris, from 0 (polygon) to 1 (circle)",
232
+ min: 0,
233
+ max: 1,
234
+ step: 0.01,
235
+ hiddenFromList: false
236
+ },
237
+ irisRotation: {
238
+ type: "rotation-degrees",
239
+ default: DEFAULT_IRIS_ROTATION,
240
+ description: "Clockwise iris rotation in degrees",
241
+ step: 1
242
+ },
243
+ irisAspectRatio: {
244
+ type: "number",
245
+ default: DEFAULT_IRIS_ASPECT_RATIO,
246
+ description: "Horizontal stretch of the iris",
247
+ min: 0.01,
248
+ max: 4,
249
+ step: 0.01,
250
+ hiddenFromList: false
251
+ },
252
+ highlightGain: {
253
+ type: "number",
254
+ default: DEFAULT_HIGHLIGHT_GAIN,
255
+ description: "Additional brightness of highlights, from 0 to 1",
256
+ min: 0,
257
+ max: 1,
258
+ step: 0.01,
259
+ hiddenFromList: false
260
+ },
261
+ highlightThreshold: {
262
+ type: "number",
263
+ default: DEFAULT_HIGHLIGHT_THRESHOLD,
264
+ description: "Minimum luminance for highlight gain, from 0 to 1",
265
+ min: 0,
266
+ max: 1,
267
+ step: 0.01,
268
+ hiddenFromList: false
269
+ },
270
+ highlightSaturation: {
271
+ type: "number",
272
+ default: DEFAULT_HIGHLIGHT_SATURATION,
273
+ description: "Saturation of added highlight brightness, from 0 to 1",
274
+ min: 0,
275
+ max: 1,
276
+ step: 0.01,
277
+ hiddenFromList: false
278
+ },
279
+ repeatEdgePixels: {
280
+ type: "boolean",
281
+ default: DEFAULT_REPEAT_EDGE_PIXELS,
282
+ description: "Repeat edge pixels outside the source instead of sampling transparency"
283
+ },
284
+ samples: {
285
+ type: "number",
286
+ default: DEFAULT_SAMPLES,
287
+ description: "Number of aperture samples, from 16 to 2048",
288
+ min: 16,
289
+ max: 2048,
290
+ step: 1,
291
+ hiddenFromList: false,
292
+ integer: true
293
+ },
294
+ linearLight: {
295
+ type: "boolean",
296
+ default: DEFAULT_LINEAR_LIGHT,
297
+ description: "Average colors in linear light"
298
+ }
299
+ };
300
+ var resolve = (p) => ({
301
+ radius: p.radius ?? DEFAULT_RADIUS,
302
+ irisShape: p.irisShape ?? DEFAULT_IRIS_SHAPE,
303
+ irisRoundness: p.irisRoundness ?? DEFAULT_IRIS_ROUNDNESS,
304
+ irisRotation: p.irisRotation ?? DEFAULT_IRIS_ROTATION,
305
+ irisAspectRatio: p.irisAspectRatio ?? DEFAULT_IRIS_ASPECT_RATIO,
306
+ highlightGain: p.highlightGain ?? DEFAULT_HIGHLIGHT_GAIN,
307
+ highlightThreshold: p.highlightThreshold ?? DEFAULT_HIGHLIGHT_THRESHOLD,
308
+ highlightSaturation: p.highlightSaturation ?? DEFAULT_HIGHLIGHT_SATURATION,
309
+ repeatEdgePixels: p.repeatEdgePixels ?? DEFAULT_REPEAT_EDGE_PIXELS,
310
+ samples: p.samples ?? DEFAULT_SAMPLES,
311
+ linearLight: p.linearLight ?? DEFAULT_LINEAR_LIGHT
312
+ });
313
+ var validateLensBlurParams = (params) => {
314
+ assertEffectParamsObject(params, "Lens blur");
315
+ assertOptionalFiniteNumber(params.radius, "radius");
316
+ assertOptionalFiniteNumber(params.irisRoundness, "irisRoundness");
317
+ assertOptionalFiniteNumber(params.irisRotation, "irisRotation");
318
+ assertOptionalFiniteNumber(params.irisAspectRatio, "irisAspectRatio");
319
+ assertOptionalFiniteNumber(params.highlightGain, "highlightGain");
320
+ assertOptionalFiniteNumber(params.highlightThreshold, "highlightThreshold");
321
+ assertOptionalFiniteNumber(params.highlightSaturation, "highlightSaturation");
322
+ assertOptionalBoolean(params.repeatEdgePixels, "repeatEdgePixels");
323
+ assertOptionalFiniteNumber(params.samples, "samples");
324
+ assertOptionalBoolean(params.linearLight, "linearLight");
325
+ if (params.irisShape !== undefined && !IRIS_SHAPES.includes(params.irisShape)) {
326
+ throw new TypeError("Invalid irisShape: " + JSON.stringify(params.irisShape));
327
+ }
328
+ const r = resolve(params);
329
+ validateNonNegative(r.radius, "radius");
330
+ validateUnitInterval(r.irisRoundness, "irisRoundness");
331
+ validateUnitInterval(r.highlightGain, "highlightGain");
332
+ validateUnitInterval(r.highlightThreshold, "highlightThreshold");
333
+ validateUnitInterval(r.highlightSaturation, "highlightSaturation");
334
+ if (r.irisAspectRatio <= 0)
335
+ throw new TypeError('"irisAspectRatio" must be greater than zero');
336
+ if (!Number.isInteger(r.samples) || r.samples < 16 || r.samples > 2048)
337
+ throw new TypeError('"samples" must be an integer between 16 and 2048');
338
+ };
339
+ var VERTEX_SHADER = `#version 300 es
340
+ in vec2 aPos;
341
+ in vec2 aUv;
342
+ out vec2 vUv;
343
+
344
+ void main() {
345
+ vUv = aUv;
346
+ gl_Position = vec4(aPos, 0.0, 1.0);
347
+ }
348
+ `;
349
+ var compileShader = (gl, type, source) => {
350
+ const shader = gl.createShader(type);
351
+ if (!shader) {
352
+ throw new Error("Failed to create WebGL shader");
353
+ }
354
+ gl.shaderSource(shader, source);
355
+ gl.compileShader(shader);
356
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
357
+ const log = gl.getShaderInfoLog(shader);
358
+ gl.deleteShader(shader);
359
+ throw new Error(`LensBlur shader compile failed: ${log ?? "(no log)"}`);
360
+ }
361
+ return shader;
362
+ };
363
+ var linkProgram = (gl, vs, fs) => {
364
+ const program = gl.createProgram();
365
+ if (!program) {
366
+ throw new Error("Failed to create WebGL program");
367
+ }
368
+ gl.attachShader(program, vs);
369
+ gl.attachShader(program, fs);
370
+ gl.linkProgram(program);
371
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
372
+ const log = gl.getProgramInfoLog(program);
373
+ gl.deleteProgram(program);
374
+ throw new Error(`LensBlur program link failed: ${log ?? "(no log)"}`);
375
+ }
376
+ return program;
377
+ };
378
+ var setupLensBlur = (target) => {
379
+ const gl = target.getContext("webgl2", {
380
+ premultipliedAlpha: true,
381
+ alpha: true,
382
+ preserveDrawingBuffer: true
383
+ });
384
+ if (!gl) {
385
+ throw createWebGL2ContextError("lens blur effect");
386
+ }
387
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
388
+ const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
389
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, LENS_BLUR_FRAGMENT_SHADER);
390
+ const program = linkProgram(gl, vs, fs);
391
+ gl.deleteShader(vs);
392
+ gl.deleteShader(fs);
393
+ const vao = gl.createVertexArray();
394
+ if (!vao) {
395
+ throw new Error("Failed to create WebGL vertex array");
396
+ }
397
+ gl.bindVertexArray(vao);
398
+ const data = new Float32Array([
399
+ -1,
400
+ -1,
401
+ 0,
402
+ 0,
403
+ 1,
404
+ -1,
405
+ 1,
406
+ 0,
407
+ -1,
408
+ 1,
409
+ 0,
410
+ 1,
411
+ 1,
412
+ 1,
413
+ 1,
414
+ 1
415
+ ]);
416
+ const vbo = gl.createBuffer();
417
+ if (!vbo) {
418
+ throw new Error("Failed to create WebGL buffer");
419
+ }
420
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
421
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
422
+ const aPos = gl.getAttribLocation(program, "aPos");
423
+ const aUv = gl.getAttribLocation(program, "aUv");
424
+ gl.enableVertexAttribArray(aPos);
425
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
426
+ gl.enableVertexAttribArray(aUv);
427
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
428
+ gl.bindVertexArray(null);
429
+ const texture = gl.createTexture();
430
+ if (!texture) {
431
+ throw new Error("Failed to create WebGL texture");
432
+ }
433
+ gl.bindTexture(gl.TEXTURE_2D, texture);
434
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
435
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
436
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
437
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
438
+ gl.bindTexture(gl.TEXTURE_2D, null);
439
+ return {
440
+ gl,
441
+ program,
442
+ vao,
443
+ vbo,
444
+ texture,
445
+ uSource: gl.getUniformLocation(program, "uSource"),
446
+ uResolution: gl.getUniformLocation(program, "uResolution"),
447
+ uRadius: gl.getUniformLocation(program, "uRadius"),
448
+ uIrisShape: gl.getUniformLocation(program, "uIrisShape"),
449
+ uIrisRoundness: gl.getUniformLocation(program, "uIrisRoundness"),
450
+ uIrisRotation: gl.getUniformLocation(program, "uIrisRotation"),
451
+ uIrisAspectRatio: gl.getUniformLocation(program, "uIrisAspectRatio"),
452
+ uHighlightGain: gl.getUniformLocation(program, "uHighlightGain"),
453
+ uHighlightThreshold: gl.getUniformLocation(program, "uHighlightThreshold"),
454
+ uHighlightSaturation: gl.getUniformLocation(program, "uHighlightSaturation"),
455
+ uRepeatEdgePixels: gl.getUniformLocation(program, "uRepeatEdgePixels"),
456
+ uSamples: gl.getUniformLocation(program, "uSamples"),
457
+ uLinearLight: gl.getUniformLocation(program, "uLinearLight")
458
+ };
459
+ };
460
+ var lensBlur = createEffect({
461
+ type: "remotion/lens-blur",
462
+ label: "lensBlur()",
463
+ documentationLink: "https://www.remotion.dev/docs/effects/lens-blur",
464
+ calculateKey: (params) => {
465
+ const r = resolve(params);
466
+ return `lens-blur-${JSON.stringify(r)}`;
467
+ },
468
+ implementations: {
469
+ webgpu: Internals.createEffectImplementation({
470
+ setup: (target) => setupWebGpuSinglePass(target, "lens-blur"),
471
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
472
+ if (!gpuDevice)
473
+ throw new Error("A WebGPU device is required for this effect");
474
+ const r = resolve(params);
475
+ applyWebGpuSinglePass({
476
+ state,
477
+ source,
478
+ width,
479
+ height,
480
+ device: gpuDevice,
481
+ shader: LENS_BLUR_WEBGPU_SHADER,
482
+ uniformData: new Float32Array([
483
+ width,
484
+ height,
485
+ r.radius,
486
+ IRIS_SHAPES.indexOf(r.irisShape) + 3,
487
+ r.irisRoundness,
488
+ r.irisRotation % 360 * Math.PI / 180,
489
+ r.irisAspectRatio,
490
+ 0,
491
+ r.highlightGain,
492
+ r.highlightThreshold,
493
+ r.highlightSaturation,
494
+ r.repeatEdgePixels ? 1 : 0,
495
+ r.samples,
496
+ r.linearLight ? 1 : 0,
497
+ 0,
498
+ 0
499
+ ])
500
+ });
501
+ },
502
+ cleanup: cleanupWebGpuSinglePass
503
+ }),
504
+ webgl2: Internals.createEffectImplementation({
505
+ setup: (target) => setupLensBlur(target),
506
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
507
+ const r = resolve(params);
508
+ const { gl, program, texture, vao } = state;
509
+ gl.viewport(0, 0, width, height);
510
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
511
+ gl.clearColor(0, 0, 0, 0);
512
+ gl.clear(gl.COLOR_BUFFER_BIT);
513
+ gl.activeTexture(gl.TEXTURE0);
514
+ gl.bindTexture(gl.TEXTURE_2D, texture);
515
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
516
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
517
+ gl.useProgram(program);
518
+ if (state.uSource)
519
+ gl.uniform1i(state.uSource, 0);
520
+ if (state.uResolution)
521
+ gl.uniform2f(state.uResolution, width, height);
522
+ if (state.uRadius)
523
+ gl.uniform1f(state.uRadius, r.radius);
524
+ if (state.uIrisShape)
525
+ gl.uniform1i(state.uIrisShape, IRIS_SHAPES.indexOf(r.irisShape) + 3);
526
+ if (state.uIrisRoundness)
527
+ gl.uniform1f(state.uIrisRoundness, r.irisRoundness);
528
+ if (state.uIrisRotation)
529
+ gl.uniform1f(state.uIrisRotation, r.irisRotation % 360 * Math.PI / 180);
530
+ if (state.uIrisAspectRatio)
531
+ gl.uniform1f(state.uIrisAspectRatio, r.irisAspectRatio);
532
+ if (state.uHighlightGain)
533
+ gl.uniform1f(state.uHighlightGain, r.highlightGain);
534
+ if (state.uHighlightThreshold)
535
+ gl.uniform1f(state.uHighlightThreshold, r.highlightThreshold);
536
+ if (state.uHighlightSaturation)
537
+ gl.uniform1f(state.uHighlightSaturation, r.highlightSaturation);
538
+ if (state.uRepeatEdgePixels)
539
+ gl.uniform1i(state.uRepeatEdgePixels, r.repeatEdgePixels ? 1 : 0);
540
+ if (state.uSamples)
541
+ gl.uniform1i(state.uSamples, r.samples);
542
+ if (state.uLinearLight)
543
+ gl.uniform1i(state.uLinearLight, r.linearLight ? 1 : 0);
544
+ gl.bindVertexArray(vao);
545
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
546
+ gl.bindVertexArray(null);
547
+ gl.bindTexture(gl.TEXTURE_2D, null);
548
+ gl.useProgram(null);
549
+ },
550
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
551
+ gl.deleteTexture(texture);
552
+ gl.deleteBuffer(vbo);
553
+ gl.deleteProgram(program);
554
+ gl.deleteVertexArray(vao);
555
+ }
556
+ })
557
+ },
558
+ schema: lensBlurSchema,
559
+ validateParams: validateLensBlurParams
560
+ });
561
+ export {
562
+ lensBlur
563
+ };