@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,552 @@
1
+ import {
2
+ setupWebGpuColors,
3
+ getWebGpuColors
4
+ } from "./index-8jx11jyn.mjs";
5
+ import {
6
+ assertOptionalFiniteNumber,
7
+ parseColorRgba
8
+ } from "./index-wxhvgv2s.mjs";
9
+ import {
10
+ WEBGPU_SINGLE_PASS_VERTEX,
11
+ cleanupWebGpuSinglePass,
12
+ applyWebGpuSinglePass
13
+ } from "./index-tvfexb7s.mjs";
14
+ import {
15
+ assertEffectParamsObject,
16
+ assertOptionalColor,
17
+ assertOptionalBoolean
18
+ } from "./index-4fvp93ps.mjs";
19
+
20
+ // src/halftone.ts
21
+ import { Internals } from "remotion";
22
+
23
+ // src/halftone-webgpu-shader.ts
24
+ var HALFTONE_WEBGPU_SHADER = `
25
+ ${WEBGPU_SINGLE_PASS_VERTEX}
26
+ @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
27
+ @group(0) @binding(1) var sourceSampler: sampler;
28
+ @group(0) @binding(2) var<uniform> params: Params;
29
+ struct Params {
30
+ geometry: vec4f,
31
+ grid: vec4f,
32
+ flags: vec4f,
33
+ color: vec4f,
34
+ }
35
+ fn sampleSource(uv: vec2f) -> vec4f {
36
+ return textureSampleLevel(sourceTexture, sourceSampler, vec2f(uv.x, 1.0 - uv.y), 0);
37
+ }
38
+
39
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
40
+ let vUv = vec2f(input.uv.x, 1.0 - input.uv.y);
41
+
42
+ let center = params.geometry.xy * 0.5;
43
+ let d = vec2f(input.position.x, params.geometry.y - input.position.y) - center;
44
+ let cosR = cos(params.grid.x);
45
+ let sinR = sin(params.grid.x);
46
+ let gridPos = vec2f(d.x * cosR + d.y * sinR, -d.x * sinR + d.y * cosR);
47
+ let spacing = max(params.geometry.w, 0.001);
48
+ let cellIndex = floor((gridPos + params.grid.yz) / spacing + vec2f(0.5));
49
+ let gridCenter = cellIndex * spacing - params.grid.yz;
50
+ let canvasPos = center + vec2f(gridCenter.x * cosR - gridCenter.y * sinR, gridCenter.x * sinR + gridCenter.y * cosR);
51
+ let sampleUv = clamp(canvasPos / params.geometry.xy, vec2f(0), vec2f(1));
52
+ let texColor = sampleSource(sampleUv);
53
+ let alpha = texColor.a;
54
+ var rgb = vec3f(0);
55
+ if (alpha > 0.001) { rgb = texColor.rgb / alpha; }
56
+ let lum = dot(rgb, vec3f(0.299, 0.587, 0.114));
57
+ let lumDefault = lum * alpha + (1.0 - alpha);
58
+ let dotScale = select(1.0 - lumDefault, lumDefault, params.flags.x != 0.0);
59
+ if (dotScale <= 0.01) { return vec4f(0); }
60
+ let diff = gridPos - gridCenter;
61
+ let halfSize = params.geometry.z * 0.5;
62
+ var coverage = 0.0;
63
+ if (params.grid.w == 0.0) {
64
+ let radius = halfSize * dotScale;
65
+ coverage = 1.0 - smoothstep(radius - 0.75, radius + 0.75, length(diff));
66
+ } else if (params.grid.w == 1.0) {
67
+ let s = params.geometry.z * dotScale * 0.5;
68
+ coverage = (1.0 - smoothstep(s - 0.5, s + 0.5, abs(diff.x))) * (1.0 - smoothstep(s - 0.5, s + 0.5, abs(diff.y)));
69
+ } else {
70
+ let localTexColor = sampleSource(vUv);
71
+ let localAlpha = localTexColor.a;
72
+ var localRgb = vec3f(0);
73
+ if (localAlpha > 0.001) { localRgb = localTexColor.rgb / localAlpha; }
74
+ let localLum = dot(localRgb, vec3f(0.299, 0.587, 0.114));
75
+ let localLumDefault = localLum * localAlpha + (1.0 - localAlpha);
76
+ let localDotScale = select(1.0 - localLumDefault, localLumDefault, params.flags.x != 0.0);
77
+ if (localDotScale <= 0.12) { return vec4f(0); }
78
+ let lineHalf = params.geometry.z * dotScale * 0.5;
79
+ if (lineHalf <= 1.0) { return vec4f(0); }
80
+ coverage = (1.0 - smoothstep(halfSize - 0.5, halfSize + 0.5, abs(diff.x))) * (1.0 - smoothstep(lineHalf - 0.5, lineHalf + 0.5, abs(diff.y)));
81
+ }
82
+ return select(params.color, texColor, params.flags.y != 0.0) * coverage;
83
+
84
+ }
85
+ `;
86
+
87
+ // src/halftone.ts
88
+ var { createEffect, createWebGL2ContextError } = Internals;
89
+ var HALFTONE_SHAPES = ["circle", "square", "line"];
90
+ var HALFTONE_SAMPLING = ["bilinear", "nearest"];
91
+ var HALFTONE_COLOR_MODES = ["solid", "source"];
92
+ var halftoneSchema = {
93
+ dotSize: {
94
+ type: "number",
95
+ min: 1,
96
+ max: 200,
97
+ step: 1,
98
+ default: 20,
99
+ description: "Dot size",
100
+ hiddenFromList: false
101
+ },
102
+ dotSpacing: {
103
+ type: "number",
104
+ min: 1,
105
+ max: 200,
106
+ step: 1,
107
+ default: 20,
108
+ description: "Dot spacing",
109
+ hiddenFromList: false
110
+ },
111
+ rotation: {
112
+ type: "rotation-degrees",
113
+ step: 1,
114
+ default: 0,
115
+ description: "Rotation"
116
+ },
117
+ offsetX: {
118
+ type: "number",
119
+ step: 1,
120
+ default: 0,
121
+ description: "Offset X",
122
+ hiddenFromList: false
123
+ },
124
+ offsetY: {
125
+ type: "number",
126
+ step: 1,
127
+ default: 0,
128
+ description: "Offset Y",
129
+ hiddenFromList: false
130
+ },
131
+ shape: {
132
+ type: "enum",
133
+ variants: {
134
+ circle: {},
135
+ square: {},
136
+ line: {}
137
+ },
138
+ default: "circle",
139
+ description: "Shape"
140
+ },
141
+ invert: {
142
+ type: "boolean",
143
+ default: false,
144
+ description: "Invert"
145
+ },
146
+ colorMode: {
147
+ type: "enum",
148
+ default: "solid",
149
+ description: "Color mode",
150
+ variants: {
151
+ solid: {
152
+ dotColor: {
153
+ type: "color",
154
+ default: "red",
155
+ description: "Dot color"
156
+ }
157
+ },
158
+ source: {}
159
+ }
160
+ }
161
+ };
162
+ var formatEnum = (variants) => {
163
+ if (variants.length === 2) {
164
+ return `"${variants[0]}" or "${variants[1]}"`;
165
+ }
166
+ return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
167
+ };
168
+ var assertOptionalEnum = (value, name, variants) => {
169
+ if (value === undefined) {
170
+ return;
171
+ }
172
+ if (typeof value !== "string" || !variants.includes(value)) {
173
+ throw new TypeError(`"${name}" must be ${formatEnum(variants)}`);
174
+ }
175
+ };
176
+ var resolve = (p) => ({
177
+ shape: p.shape ?? "circle",
178
+ dotSize: p.dotSize ?? 20,
179
+ dotSpacing: p.dotSpacing ?? p.dotSize ?? 20,
180
+ rotation: p.rotation ?? 0,
181
+ offsetX: p.offsetX ?? 0,
182
+ offsetY: p.offsetY ?? 0,
183
+ sampling: p.sampling ?? "bilinear",
184
+ colorMode: p.colorMode ?? "solid",
185
+ dotColor: "dotColor" in p ? p.dotColor ?? "red" : "red",
186
+ invert: p.invert ?? false
187
+ });
188
+ var validateHalftoneParams = (params) => {
189
+ assertEffectParamsObject(params, "Halftone");
190
+ assertOptionalFiniteNumber(params.dotSize, "dotSize");
191
+ assertOptionalFiniteNumber(params.dotSpacing, "dotSpacing");
192
+ assertOptionalFiniteNumber(params.rotation, "rotation");
193
+ assertOptionalFiniteNumber(params.offsetX, "offsetX");
194
+ assertOptionalFiniteNumber(params.offsetY, "offsetY");
195
+ assertOptionalEnum(params.shape, "shape", HALFTONE_SHAPES);
196
+ assertOptionalEnum(params.sampling, "sampling", HALFTONE_SAMPLING);
197
+ assertOptionalEnum(params.colorMode, "colorMode", HALFTONE_COLOR_MODES);
198
+ if ("color" in params && params.color !== undefined) {
199
+ throw new TypeError('"color" has been renamed to "dotColor"');
200
+ }
201
+ if (params.colorMode === "source" && "dotColor" in params) {
202
+ throw new TypeError('"dotColor" can only be set when "colorMode" is "solid"');
203
+ }
204
+ assertOptionalColor("dotColor" in params ? params.dotColor : undefined, "dotColor");
205
+ assertOptionalBoolean(params.invert, "invert");
206
+ if (params.dotSize !== undefined && params.dotSize < 1) {
207
+ throw new TypeError(`"dotSize" must be >= 1, but got ${JSON.stringify(params.dotSize)}`);
208
+ }
209
+ if (params.dotSpacing !== undefined && params.dotSpacing < 1) {
210
+ throw new TypeError(`"dotSpacing" must be >= 1, but got ${JSON.stringify(params.dotSpacing)}`);
211
+ }
212
+ };
213
+ var HALFTONE_VS = `#version 300 es
214
+ in vec2 aPos;
215
+ in vec2 aUv;
216
+ out vec2 vUv;
217
+ void main() {
218
+ vUv = aUv;
219
+ gl_Position = vec4(aPos, 0.0, 1.0);
220
+ }
221
+ `;
222
+ var HALFTONE_FS = `#version 300 es
223
+ precision highp float;
224
+
225
+ in vec2 vUv;
226
+ out vec4 fragColor;
227
+
228
+ uniform sampler2D uSource;
229
+ uniform vec2 uResolution;
230
+ uniform float uDotSize;
231
+ uniform float uDotSpacing;
232
+ uniform float uRotation;
233
+ uniform vec2 uOffset;
234
+ uniform vec4 uColor;
235
+ uniform int uShape;
236
+ uniform bool uShadeOutside;
237
+ uniform bool uUseSourceColor;
238
+
239
+ void main() {
240
+ vec2 fragPos = gl_FragCoord.xy;
241
+ vec2 center = uResolution * 0.5;
242
+
243
+ vec2 d = fragPos - center;
244
+ float cosR = cos(uRotation);
245
+ float sinR = sin(uRotation);
246
+
247
+ vec2 gridPos = vec2(
248
+ d.x * cosR + d.y * sinR,
249
+ -d.x * sinR + d.y * cosR
250
+ );
251
+
252
+ float spacing = max(uDotSpacing, 0.001);
253
+ vec2 cellIndex = floor((gridPos + uOffset) / spacing + 0.5);
254
+ vec2 gridCenter = cellIndex * spacing - uOffset;
255
+
256
+ vec2 canvasPos = center + vec2(
257
+ gridCenter.x * cosR - gridCenter.y * sinR,
258
+ gridCenter.x * sinR + gridCenter.y * cosR
259
+ );
260
+
261
+ vec2 sampleUv = clamp(canvasPos / uResolution, vec2(0.0), vec2(1.0));
262
+ vec4 texColor = texture(uSource, sampleUv);
263
+
264
+ float alpha = texColor.a;
265
+ vec3 rgb = alpha > 0.001 ? texColor.rgb / alpha : vec3(0.0);
266
+ float lum = dot(rgb, vec3(0.299, 0.587, 0.114));
267
+
268
+ float lumDefault = lum * alpha + (1.0 - alpha);
269
+ float dotScale = uShadeOutside
270
+ ? lumDefault
271
+ : 1.0 - lumDefault;
272
+
273
+ if (dotScale <= 0.01) {
274
+ fragColor = vec4(0.0);
275
+ return;
276
+ }
277
+
278
+ vec2 diff = gridPos - gridCenter;
279
+ float halfSize = uDotSize * 0.5;
280
+ float coverage = 0.0;
281
+
282
+ if (uShape == 0) {
283
+ float radius = halfSize * dotScale;
284
+ float dist = length(diff);
285
+ coverage = 1.0 - smoothstep(radius - 0.75, radius + 0.75, dist);
286
+ } else if (uShape == 1) {
287
+ float s = uDotSize * dotScale * 0.5;
288
+ coverage = (1.0 - smoothstep(s - 0.5, s + 0.5, abs(diff.x)))
289
+ * (1.0 - smoothstep(s - 0.5, s + 0.5, abs(diff.y)));
290
+ } else {
291
+ vec4 localTexColor = texture(uSource, vUv);
292
+ float localAlpha = localTexColor.a;
293
+ vec3 localRgb = localAlpha > 0.001 ? localTexColor.rgb / localAlpha : vec3(0.0);
294
+ float localLum = dot(localRgb, vec3(0.299, 0.587, 0.114));
295
+ float localLumDefault = localLum * localAlpha + (1.0 - localAlpha);
296
+ float localDotScale = uShadeOutside
297
+ ? localLumDefault
298
+ : 1.0 - localLumDefault;
299
+
300
+ if (localDotScale <= 0.12) {
301
+ fragColor = vec4(0.0);
302
+ return;
303
+ }
304
+
305
+ float lineHalf = uDotSize * dotScale * 0.5;
306
+ if (lineHalf <= 1.0) {
307
+ fragColor = vec4(0.0);
308
+ return;
309
+ }
310
+
311
+ coverage = (1.0 - smoothstep(halfSize - 0.5, halfSize + 0.5, abs(diff.x)))
312
+ * (1.0 - smoothstep(lineHalf - 0.5, lineHalf + 0.5, abs(diff.y)));
313
+ }
314
+
315
+ fragColor = (uUseSourceColor ? texColor : uColor) * coverage;
316
+ }
317
+ `;
318
+ var SHAPE_INDEX = {
319
+ circle: 0,
320
+ square: 1,
321
+ line: 2
322
+ };
323
+ var compileShader = (gl, type, source) => {
324
+ const shader = gl.createShader(type);
325
+ if (!shader) {
326
+ throw new Error("Failed to create WebGL shader");
327
+ }
328
+ gl.shaderSource(shader, source);
329
+ gl.compileShader(shader);
330
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
331
+ const log = gl.getShaderInfoLog(shader);
332
+ gl.deleteShader(shader);
333
+ throw new Error(`Halftone shader compile failed: ${log ?? "(no log)"}`);
334
+ }
335
+ return shader;
336
+ };
337
+ var linkProgram = (gl, vs, fs) => {
338
+ const program = gl.createProgram();
339
+ if (!program) {
340
+ throw new Error("Failed to create WebGL program");
341
+ }
342
+ gl.attachShader(program, vs);
343
+ gl.attachShader(program, fs);
344
+ gl.linkProgram(program);
345
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
346
+ const log = gl.getProgramInfoLog(program);
347
+ gl.deleteProgram(program);
348
+ throw new Error(`Halftone program link failed: ${log ?? "(no log)"}`);
349
+ }
350
+ return program;
351
+ };
352
+ var halftone = createEffect({
353
+ type: "dev.remotion.effects.halftone",
354
+ label: "halftone()",
355
+ documentationLink: "https://www.remotion.dev/docs/effects/halftone",
356
+ calculateKey: (params) => {
357
+ const r = resolve(params);
358
+ return `halftone-${r.shape}-${r.dotSize}-${r.dotSpacing}-${r.rotation}-${r.offsetX}-${r.offsetY}-${r.sampling}-${r.colorMode}-${r.dotColor}-${r.invert ? 1 : 0}`;
359
+ },
360
+ implementations: {
361
+ webgpu: Internals.createEffectImplementation({
362
+ setup: (target) => setupWebGpuColors(target, "halftone"),
363
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
364
+ if (!gpuDevice)
365
+ throw new Error("A WebGPU device is required for the halftone effect");
366
+ const r = resolve(params);
367
+ const colors = getWebGpuColors(state, [r.dotColor]);
368
+ const uniformData = new Float32Array([
369
+ width,
370
+ height,
371
+ r.dotSize,
372
+ r.dotSpacing,
373
+ r.rotation * Math.PI / 180,
374
+ r.offsetX,
375
+ r.offsetY,
376
+ SHAPE_INDEX[r.shape],
377
+ r.invert ? 1 : 0,
378
+ r.colorMode === "source" ? 1 : 0,
379
+ 0,
380
+ 0,
381
+ colors[0] / 255 * (colors[3] / 255),
382
+ colors[1] / 255 * (colors[3] / 255),
383
+ colors[2] / 255 * (colors[3] / 255),
384
+ colors[3] / 255
385
+ ]);
386
+ applyWebGpuSinglePass({
387
+ state,
388
+ source,
389
+ width,
390
+ height,
391
+ device: gpuDevice,
392
+ shader: HALFTONE_WEBGPU_SHADER,
393
+ uniformData
394
+ }, {
395
+ sourceFilter: r.sampling === "nearest" ? "nearest" : "linear",
396
+ auxiliaryTexture: null
397
+ });
398
+ },
399
+ cleanup: cleanupWebGpuSinglePass
400
+ }),
401
+ webgl2: Internals.createEffectImplementation({
402
+ setup: (target) => {
403
+ const gl = target.getContext("webgl2", {
404
+ premultipliedAlpha: true,
405
+ alpha: true,
406
+ preserveDrawingBuffer: true
407
+ });
408
+ if (!gl) {
409
+ throw createWebGL2ContextError("halftone effect");
410
+ }
411
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
412
+ const vs = compileShader(gl, gl.VERTEX_SHADER, HALFTONE_VS);
413
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, HALFTONE_FS);
414
+ const program = linkProgram(gl, vs, fs);
415
+ gl.deleteShader(vs);
416
+ gl.deleteShader(fs);
417
+ const vao = gl.createVertexArray();
418
+ if (!vao) {
419
+ throw new Error("Failed to create WebGL vertex array");
420
+ }
421
+ gl.bindVertexArray(vao);
422
+ const data = new Float32Array([
423
+ -1,
424
+ -1,
425
+ 0,
426
+ 0,
427
+ 1,
428
+ -1,
429
+ 1,
430
+ 0,
431
+ -1,
432
+ 1,
433
+ 0,
434
+ 1,
435
+ 1,
436
+ 1,
437
+ 1,
438
+ 1
439
+ ]);
440
+ const vbo = gl.createBuffer();
441
+ if (!vbo) {
442
+ throw new Error("Failed to create WebGL buffer");
443
+ }
444
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
445
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
446
+ const aPos = gl.getAttribLocation(program, "aPos");
447
+ const aUv = gl.getAttribLocation(program, "aUv");
448
+ gl.enableVertexAttribArray(aPos);
449
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
450
+ gl.enableVertexAttribArray(aUv);
451
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
452
+ gl.bindVertexArray(null);
453
+ const texture = gl.createTexture();
454
+ if (!texture) {
455
+ throw new Error("Failed to create WebGL texture");
456
+ }
457
+ gl.bindTexture(gl.TEXTURE_2D, texture);
458
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
459
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
460
+ gl.bindTexture(gl.TEXTURE_2D, null);
461
+ const colorCanvas = document.createElement("canvas");
462
+ colorCanvas.width = 1;
463
+ colorCanvas.height = 1;
464
+ const colorCtx = colorCanvas.getContext("2d", {
465
+ willReadFrequently: true
466
+ });
467
+ if (!colorCtx) {
468
+ throw new Error("Failed to acquire 2D context for color parsing");
469
+ }
470
+ return {
471
+ gl,
472
+ program,
473
+ vao,
474
+ vbo,
475
+ texture,
476
+ uSource: gl.getUniformLocation(program, "uSource"),
477
+ uResolution: gl.getUniformLocation(program, "uResolution"),
478
+ uDotSize: gl.getUniformLocation(program, "uDotSize"),
479
+ uDotSpacing: gl.getUniformLocation(program, "uDotSpacing"),
480
+ uRotation: gl.getUniformLocation(program, "uRotation"),
481
+ uOffset: gl.getUniformLocation(program, "uOffset"),
482
+ uColor: gl.getUniformLocation(program, "uColor"),
483
+ uShape: gl.getUniformLocation(program, "uShape"),
484
+ uShadeOutside: gl.getUniformLocation(program, "uShadeOutside"),
485
+ uUseSourceColor: gl.getUniformLocation(program, "uUseSourceColor"),
486
+ colorCtx,
487
+ cachedColorStr: "",
488
+ cachedColorRgba: [0, 0, 0, 255]
489
+ };
490
+ },
491
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
492
+ const r = resolve(params);
493
+ const { gl, program, vao, texture } = state;
494
+ if (state.cachedColorStr !== r.dotColor) {
495
+ state.cachedColorStr = r.dotColor;
496
+ state.cachedColorRgba = parseColorRgba(state.colorCtx, r.dotColor);
497
+ }
498
+ const [cr, cg, cb, ca] = state.cachedColorRgba;
499
+ const caNormalized = ca / 255;
500
+ const filter = r.sampling === "nearest" ? gl.NEAREST : gl.LINEAR;
501
+ gl.viewport(0, 0, width, height);
502
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
503
+ gl.clearColor(0, 0, 0, 0);
504
+ gl.clear(gl.COLOR_BUFFER_BIT);
505
+ gl.useProgram(program);
506
+ gl.bindVertexArray(vao);
507
+ gl.activeTexture(gl.TEXTURE0);
508
+ gl.bindTexture(gl.TEXTURE_2D, texture);
509
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
510
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
511
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
512
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
513
+ if (state.uSource)
514
+ gl.uniform1i(state.uSource, 0);
515
+ if (state.uResolution)
516
+ gl.uniform2f(state.uResolution, width, height);
517
+ if (state.uDotSize)
518
+ gl.uniform1f(state.uDotSize, r.dotSize);
519
+ if (state.uDotSpacing)
520
+ gl.uniform1f(state.uDotSpacing, r.dotSpacing);
521
+ if (state.uRotation)
522
+ gl.uniform1f(state.uRotation, r.rotation * Math.PI / 180);
523
+ if (state.uOffset)
524
+ gl.uniform2f(state.uOffset, r.offsetX, r.offsetY);
525
+ if (state.uColor)
526
+ gl.uniform4f(state.uColor, cr / 255 * caNormalized, cg / 255 * caNormalized, cb / 255 * caNormalized, caNormalized);
527
+ if (state.uShape)
528
+ gl.uniform1i(state.uShape, SHAPE_INDEX[r.shape]);
529
+ if (state.uShadeOutside)
530
+ gl.uniform1i(state.uShadeOutside, r.invert ? 1 : 0);
531
+ if (state.uUseSourceColor)
532
+ gl.uniform1i(state.uUseSourceColor, r.colorMode === "source" ? 1 : 0);
533
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
534
+ gl.bindVertexArray(null);
535
+ gl.bindTexture(gl.TEXTURE_2D, null);
536
+ gl.useProgram(null);
537
+ },
538
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
539
+ gl.deleteBuffer(vbo);
540
+ gl.deleteProgram(program);
541
+ gl.deleteVertexArray(vao);
542
+ gl.deleteTexture(texture);
543
+ }
544
+ })
545
+ },
546
+ schema: halftoneSchema,
547
+ validateParams: validateHalftoneParams
548
+ });
549
+ export {
550
+ halftone,
551
+ halftoneSchema
552
+ };
@@ -0,0 +1,83 @@
1
+ import"./index-8p04sssx.mjs";
2
+ import {
3
+ createColorMatrixImplementations
4
+ } from "./index-cdp7tr8x.mjs";
5
+ import {
6
+ DEFAULT_HUE_DEGREES,
7
+ hueDegreesSchema,
8
+ assertOptionalFiniteNumber
9
+ } from "./index-wxhvgv2s.mjs";
10
+ import {
11
+ assertEffectParamsObject
12
+ } from "./index-4fvp93ps.mjs";
13
+
14
+ // src/hue.ts
15
+ import { Internals } from "remotion";
16
+ var { createEffect } = Internals;
17
+ var hueSchema = {
18
+ degrees: hueDegreesSchema
19
+ };
20
+ var resolve = (p) => ({
21
+ degrees: p.degrees ?? DEFAULT_HUE_DEGREES
22
+ });
23
+ var validateHueParams = (params) => {
24
+ assertEffectParamsObject(params, "Hue");
25
+ assertOptionalFiniteNumber(params.degrees, "degrees");
26
+ };
27
+ var hue = createEffect({
28
+ type: "dev.remotion.effects.hue",
29
+ label: "hue()",
30
+ documentationLink: "https://www.remotion.dev/docs/effects/hue",
31
+ calculateKey: (params) => {
32
+ const r = resolve(params);
33
+ return `hue-${r.degrees}`;
34
+ },
35
+ implementations: {
36
+ ...createColorMatrixImplementations("hue", (params) => {
37
+ const { degrees } = resolve(params);
38
+ const radians = degrees % 360 * Math.PI / 180;
39
+ const cosine = Math.cos(radians);
40
+ const sine = Math.sin(radians);
41
+ return new Float32Array([
42
+ 0.213 + 0.787 * cosine - 0.213 * sine,
43
+ 0.715 - 0.715 * cosine - 0.715 * sine,
44
+ 0.072 - 0.072 * cosine + 0.928 * sine,
45
+ 0,
46
+ 0.213 - 0.213 * cosine + 0.143 * sine,
47
+ 0.715 + 0.285 * cosine + 0.14 * sine,
48
+ 0.072 - 0.072 * cosine - 0.283 * sine,
49
+ 0,
50
+ 0.213 - 0.213 * cosine - 0.787 * sine,
51
+ 0.715 - 0.715 * cosine + 0.715 * sine,
52
+ 0.072 + 0.928 * cosine + 0.072 * sine,
53
+ 0,
54
+ 0,
55
+ 0,
56
+ degrees % 360 === 0 ? 1 : 0,
57
+ 0
58
+ ]);
59
+ }),
60
+ "2d": Internals.createEffectImplementation({
61
+ setup: () => null,
62
+ apply: ({ source, target, width, height, params }) => {
63
+ const ctx = target.getContext("2d");
64
+ if (!ctx) {
65
+ throw new Error("Failed to acquire 2D context for hue effect. The canvas may have been assigned a different context type.");
66
+ }
67
+ const r = resolve(params);
68
+ ctx.clearRect(0, 0, width, height);
69
+ ctx.filter = `hue-rotate(${r.degrees}deg)`;
70
+ ctx.drawImage(source, 0, 0, width, height);
71
+ ctx.filter = "none";
72
+ },
73
+ cleanup: () => {
74
+ return;
75
+ }
76
+ })
77
+ },
78
+ schema: hueSchema,
79
+ validateParams: validateHueParams
80
+ });
81
+ export {
82
+ hue
83
+ };