@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,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
+ };