@remotion/web-renderer 4.0.398 → 4.0.399

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 (76) hide show
  1. package/dist/calculate-transforms.d.ts +0 -2
  2. package/dist/calculate-transforms.js +0 -17
  3. package/dist/composable.d.ts +8 -2
  4. package/dist/compose-canvas.js +4 -28
  5. package/dist/compose.d.ts +2 -1
  6. package/dist/compose.js +34 -35
  7. package/dist/drawing/border-radius.d.ts +3 -1
  8. package/dist/drawing/border-radius.js +27 -6
  9. package/dist/drawing/calculate-object-fit.d.ts +40 -0
  10. package/dist/drawing/calculate-object-fit.js +208 -0
  11. package/dist/drawing/draw-background.d.ts +13 -0
  12. package/dist/drawing/draw-background.js +62 -0
  13. package/dist/drawing/draw-box-shadow.d.ts +1 -1
  14. package/dist/drawing/draw-box-shadow.js +1 -1
  15. package/dist/drawing/draw-dom-element.js +78 -10
  16. package/dist/drawing/draw-element-to-canvas.d.ts +1 -2
  17. package/dist/drawing/draw-element-to-canvas.js +36 -8
  18. package/dist/drawing/draw-element.d.ts +4 -1
  19. package/dist/drawing/draw-element.js +21 -35
  20. package/dist/drawing/fit-svg-into-its-dimensions.d.ts +12 -0
  21. package/dist/drawing/fit-svg-into-its-dimensions.js +35 -0
  22. package/dist/drawing/get-clipped-background.d.ts +8 -0
  23. package/dist/drawing/get-clipped-background.js +14 -0
  24. package/dist/drawing/get-padding-box.d.ts +1 -0
  25. package/dist/drawing/get-padding-box.js +30 -0
  26. package/dist/drawing/get-pretransform-rect.js +13 -0
  27. package/dist/drawing/go-rects-intersect.d.ts +1 -0
  28. package/dist/drawing/go-rects-intersect.js +6 -0
  29. package/dist/drawing/handle-3d-transform.d.ts +4 -2
  30. package/dist/drawing/handle-3d-transform.js +4 -3
  31. package/dist/drawing/handle-mask.js +2 -0
  32. package/dist/drawing/overflow.d.ts +3 -1
  33. package/dist/drawing/overflow.js +3 -1
  34. package/dist/drawing/parse-linear-gradient.d.ts +3 -1
  35. package/dist/drawing/parse-linear-gradient.js +3 -3
  36. package/dist/drawing/precompose.js +1 -0
  37. package/dist/drawing/process-node.js +5 -6
  38. package/dist/drawing/text/draw-text.d.ts +2 -1
  39. package/dist/drawing/text/draw-text.js +9 -3
  40. package/dist/drawing/text/get-base-height.d.ts +1 -0
  41. package/dist/drawing/text/get-base-height.js +13 -0
  42. package/dist/drawing/text/handle-text-node.d.ts +2 -1
  43. package/dist/drawing/text/handle-text-node.js +2 -2
  44. package/dist/drawing/transform-in-3d.d.ts +3 -2
  45. package/dist/drawing/transform-in-3d.js +106 -87
  46. package/dist/esm/index.mjs +678 -168
  47. package/dist/find-capturable-elements.d.ts +1 -1
  48. package/dist/find-capturable-elements.js +22 -20
  49. package/dist/internal-state.d.ts +19 -0
  50. package/dist/internal-state.js +9 -0
  51. package/dist/render-still-on-web.js +1 -0
  52. package/dist/send-telemetry-event.js +1 -1
  53. package/dist/take-screenshot.js +1 -0
  54. package/dist/tree-walker-cleanup-after-children.d.ts +5 -0
  55. package/dist/tree-walker-cleanup-after-children.js +33 -0
  56. package/package.json +9 -8
  57. package/dist/border-radius.d.ts +0 -31
  58. package/dist/border-radius.js +0 -152
  59. package/dist/drawing/canvas-offset-from-rect.d.ts +0 -8
  60. package/dist/drawing/canvas-offset-from-rect.js +0 -12
  61. package/dist/drawing/compose-canvas.d.ts +0 -1
  62. package/dist/drawing/compose-canvas.js +0 -36
  63. package/dist/drawing/compose-svg.d.ts +0 -1
  64. package/dist/drawing/compose-svg.js +0 -34
  65. package/dist/drawing/compose.d.ts +0 -5
  66. package/dist/drawing/compose.js +0 -6
  67. package/dist/drawing/get-bounding-box-including-shadow.d.ts +0 -1
  68. package/dist/drawing/get-bounding-box-including-shadow.js +0 -6
  69. package/dist/drawing/get-computed-style-cache.d.ts +0 -0
  70. package/dist/drawing/get-computed-style-cache.js +0 -1
  71. package/dist/find-canvas-elements.d.ts +0 -1
  72. package/dist/find-canvas-elements.js +0 -13
  73. package/dist/opacity.d.ts +0 -4
  74. package/dist/opacity.js +0 -7
  75. package/dist/transform.d.ts +0 -4
  76. package/dist/transform.js +0 -6
@@ -1,11 +1,12 @@
1
1
  import type { LogLevel } from 'remotion';
2
2
  import type { InternalState } from '../../internal-state';
3
3
  import type { ProcessNodeReturnValue } from '../process-node';
4
- export declare const handleTextNode: ({ node, context, logLevel, parentRect, internalState, rootElement, }: {
4
+ export declare const handleTextNode: ({ node, context, logLevel, parentRect, internalState, rootElement, onlyBackgroundClip, }: {
5
5
  node: Text;
6
6
  context: OffscreenCanvasRenderingContext2D;
7
7
  logLevel: LogLevel;
8
8
  parentRect: DOMRect;
9
9
  internalState: InternalState;
10
10
  rootElement: HTMLElement | SVGElement;
11
+ onlyBackgroundClip: boolean;
11
12
  }) => Promise<ProcessNodeReturnValue>;
@@ -1,6 +1,6 @@
1
1
  import { processNode } from '../process-node';
2
2
  import { drawText } from './draw-text';
3
- export const handleTextNode = async ({ node, context, logLevel, parentRect, internalState, rootElement, }) => {
3
+ export const handleTextNode = async ({ node, context, logLevel, parentRect, internalState, rootElement, onlyBackgroundClip, }) => {
4
4
  const span = document.createElement('span');
5
5
  const parent = node.parentNode;
6
6
  if (!parent) {
@@ -11,7 +11,7 @@ export const handleTextNode = async ({ node, context, logLevel, parentRect, inte
11
11
  const value = await processNode({
12
12
  context,
13
13
  element: span,
14
- draw: drawText({ span, logLevel }),
14
+ draw: drawText({ span, logLevel, onlyBackgroundClip }),
15
15
  logLevel,
16
16
  parentRect,
17
17
  internalState,
@@ -1,10 +1,11 @@
1
- export declare const transformIn3d: ({ matrix, sourceCanvas, untransformedRect, rectAfterTransforms, }: {
1
+ import type { InternalState } from '../internal-state';
2
+ export declare const transformIn3d: ({ matrix, sourceCanvas, untransformedRect, rectAfterTransforms, internalState, }: {
2
3
  untransformedRect: DOMRect;
3
4
  matrix: DOMMatrix;
4
5
  sourceCanvas: OffscreenCanvas;
5
6
  rectAfterTransforms: DOMRect;
7
+ internalState: InternalState;
6
8
  }) => {
7
9
  canvas: OffscreenCanvas;
8
10
  rect: DOMRect;
9
- cleanup: () => void;
10
11
  };
@@ -1,3 +1,26 @@
1
+ // Vertex shader - now includes texture coordinates
2
+ const vsSource = `
3
+ attribute vec2 aPosition;
4
+ attribute vec2 aTexCoord;
5
+ uniform mat4 uTransform;
6
+ uniform mat4 uProjection;
7
+ varying vec2 vTexCoord;
8
+
9
+ void main() {
10
+ gl_Position = uProjection * uTransform * vec4(aPosition, 0.0, 1.0);
11
+ vTexCoord = aTexCoord;
12
+ }
13
+ `;
14
+ // Fragment shader - samples from texture and unpremultiplies alpha
15
+ const fsSource = `
16
+ precision mediump float;
17
+ uniform sampler2D uTexture;
18
+ varying vec2 vTexCoord;
19
+
20
+ void main() {
21
+ gl_FragColor = texture2D(uTexture, vTexCoord);
22
+ }
23
+ `;
1
24
  function compileShader(shaderGl, source, type) {
2
25
  const shader = shaderGl.createShader(type);
3
26
  if (!shader) {
@@ -12,147 +35,143 @@ function compileShader(shaderGl, source, type) {
12
35
  }
13
36
  return shader;
14
37
  }
15
- const createHelperCanvas = ({ canvasWidth, canvasHeight, }) => {
38
+ const createHelperCanvas = ({ canvasWidth, canvasHeight, helperCanvasState, }) => {
39
+ var _a;
40
+ if (helperCanvasState.current) {
41
+ // Resize canvas if dimensions changed
42
+ if (helperCanvasState.current.canvas.width !== canvasWidth ||
43
+ helperCanvasState.current.canvas.height !== canvasHeight) {
44
+ helperCanvasState.current.canvas.width = canvasWidth;
45
+ helperCanvasState.current.canvas.height = canvasHeight;
46
+ }
47
+ // Always reset viewport and clear when reusing
48
+ helperCanvasState.current.gl.viewport(0, 0, canvasWidth, canvasHeight);
49
+ helperCanvasState.current.gl.clearColor(0, 0, 0, 0);
50
+ helperCanvasState.current.gl.clear(helperCanvasState.current.gl.COLOR_BUFFER_BIT);
51
+ return helperCanvasState.current;
52
+ }
16
53
  const canvas = new OffscreenCanvas(canvasWidth, canvasHeight);
17
- const gl = canvas.getContext('webgl', {
54
+ const gl = (_a = canvas.getContext('webgl', {
18
55
  premultipliedAlpha: true,
19
- });
56
+ })) !== null && _a !== void 0 ? _a : undefined;
20
57
  if (!gl) {
21
58
  throw new Error('WebGL not supported');
22
59
  }
23
- // Vertex shader - now includes texture coordinates
24
- const vsSource = `
25
- attribute vec2 aPosition;
26
- attribute vec2 aTexCoord;
27
- uniform mat4 uTransform;
28
- uniform mat4 uProjection;
29
- varying vec2 vTexCoord;
30
-
31
- void main() {
32
- gl_Position = uProjection * uTransform * vec4(aPosition, 0.0, 1.0);
33
- vTexCoord = aTexCoord;
34
- }
35
- `;
36
- // Fragment shader - samples from texture and unpremultiplies alpha
37
- const fsSource = `
38
- precision mediump float;
39
- uniform sampler2D uTexture;
40
- varying vec2 vTexCoord;
41
-
42
- void main() {
43
- gl_FragColor = texture2D(uTexture, vTexCoord);
44
- }
45
- `;
46
- // Create program
60
+ // Compile shaders and create program once
47
61
  const vertexShader = compileShader(gl, vsSource, gl.VERTEX_SHADER);
48
62
  const fragmentShader = compileShader(gl, fsSource, gl.FRAGMENT_SHADER);
49
63
  const program = gl.createProgram();
64
+ if (!program) {
65
+ throw new Error('Could not create program');
66
+ }
50
67
  gl.attachShader(program, vertexShader);
51
68
  gl.attachShader(program, fragmentShader);
52
69
  gl.linkProgram(program);
53
70
  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
54
71
  throw new Error('Program link error: ' + gl.getProgramInfoLog(program));
55
72
  }
56
- gl.useProgram(program);
57
- // Clear and draw
58
- gl.clearColor(0, 0, 0, 0); // Transparent background
59
- gl.clear(gl.COLOR_BUFFER_BIT);
60
- // Enable blending for transparency
61
- gl.enable(gl.BLEND);
62
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
63
- return { canvas, gl, program, vertexShader, fragmentShader };
73
+ // Get attribute and uniform locations once
74
+ const locations = {
75
+ aPosition: gl.getAttribLocation(program, 'aPosition'),
76
+ aTexCoord: gl.getAttribLocation(program, 'aTexCoord'),
77
+ uTransform: gl.getUniformLocation(program, 'uTransform'),
78
+ uProjection: gl.getUniformLocation(program, 'uProjection'),
79
+ uTexture: gl.getUniformLocation(program, 'uTexture'),
80
+ };
81
+ // Shaders can be deleted after linking
82
+ gl.deleteShader(vertexShader);
83
+ gl.deleteShader(fragmentShader);
84
+ const cleanup = () => {
85
+ gl.deleteProgram(program);
86
+ const loseContext = gl.getExtension('WEBGL_lose_context');
87
+ if (loseContext) {
88
+ loseContext.loseContext();
89
+ }
90
+ };
91
+ helperCanvasState.current = { canvas, gl, program, locations, cleanup };
92
+ return helperCanvasState.current;
64
93
  };
65
- export const transformIn3d = ({ matrix, sourceCanvas, untransformedRect, rectAfterTransforms, }) => {
66
- const { canvas, gl, program } = createHelperCanvas({
94
+ export const transformIn3d = ({ matrix, sourceCanvas, untransformedRect, rectAfterTransforms, internalState, }) => {
95
+ const { canvas, gl, program, locations } = createHelperCanvas({
67
96
  canvasWidth: rectAfterTransforms.width,
68
97
  canvasHeight: rectAfterTransforms.height,
98
+ helperCanvasState: internalState.helperCanvasState,
69
99
  });
100
+ // Use the cached program
101
+ gl.useProgram(program);
102
+ // Setup viewport and clear (already done in createHelperCanvas, but ensure it's set)
103
+ gl.viewport(0, 0, rectAfterTransforms.width, rectAfterTransforms.height);
104
+ gl.clearColor(0, 0, 0, 0);
105
+ gl.clear(gl.COLOR_BUFFER_BIT);
106
+ // Enable blending
107
+ gl.enable(gl.BLEND);
108
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
109
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
110
+ // Create vertex buffer
70
111
  const vertexBuffer = gl.createBuffer();
71
112
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
72
- // Create a quad (two triangles) with texture coordinates
73
113
  // prettier-ignore
74
114
  const vertices = new Float32Array([
75
- // Position (x, y) + TexCoord (u, v)
76
- // First:
77
- untransformedRect.x, untransformedRect.y, 0, 0, // bottom-left
78
- untransformedRect.x + untransformedRect.width, untransformedRect.y, 1, 0, // bottom-right
79
- untransformedRect.x, untransformedRect.y + untransformedRect.height, 0, 1, // top-left
80
- // Second:
81
- untransformedRect.x, untransformedRect.y + untransformedRect.height, 0, 1, // top-left
82
- untransformedRect.x + untransformedRect.width, untransformedRect.y, 1, 0, // bottom-right
83
- untransformedRect.x + untransformedRect.width, untransformedRect.y + untransformedRect.height, 1, 1, // top-right
115
+ untransformedRect.x, untransformedRect.y, 0, 0,
116
+ untransformedRect.x + untransformedRect.width, untransformedRect.y, 1, 0,
117
+ untransformedRect.x, untransformedRect.y + untransformedRect.height, 0, 1,
118
+ untransformedRect.x, untransformedRect.y + untransformedRect.height, 0, 1,
119
+ untransformedRect.x + untransformedRect.width, untransformedRect.y, 1, 0,
120
+ untransformedRect.x + untransformedRect.width, untransformedRect.y + untransformedRect.height, 1, 1,
84
121
  ]);
85
122
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
86
- const aPosition = gl.getAttribLocation(program, 'aPosition');
87
- const aTexCoord = gl.getAttribLocation(program, 'aTexCoord');
88
- // Position attribute (2 floats, stride 4 floats, offset 0)
89
- gl.enableVertexAttribArray(aPosition);
90
- gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 4 * 4, 0);
91
- // Texture coordinate attribute (2 floats, stride 4 floats, offset 2)
92
- gl.enableVertexAttribArray(aTexCoord);
93
- gl.vertexAttribPointer(aTexCoord, 2, gl.FLOAT, false, 4 * 4, 2 * 4);
123
+ // Setup attributes using cached locations
124
+ gl.enableVertexAttribArray(locations.aPosition);
125
+ gl.vertexAttribPointer(locations.aPosition, 2, gl.FLOAT, false, 4 * 4, 0);
126
+ gl.enableVertexAttribArray(locations.aTexCoord);
127
+ gl.vertexAttribPointer(locations.aTexCoord, 2, gl.FLOAT, false, 4 * 4, 2 * 4);
94
128
  // Create and configure texture
95
129
  const texture = gl.createTexture();
96
130
  gl.bindTexture(gl.TEXTURE_2D, texture);
97
- // Set texture parameters
98
131
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
99
132
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
100
133
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
101
134
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
102
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
103
- // Upload the source canvas as a texture
104
135
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, sourceCanvas);
105
- gl.enable(gl.BLEND);
106
- gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
107
- // The transform matrix
136
+ // Set uniforms using cached locations
108
137
  const transformMatrix = matrix.toFloat32Array();
109
- const zScale = 1000000000; // By default infinite in chrome
110
- // Create orthographic projection matrix for pixel coordinates with offset
138
+ const zScale = 1000000000;
139
+ // Projection matrix accounts for the output canvas dimensions
111
140
  const projectionMatrix = new Float32Array([
112
- 2 / canvas.width,
141
+ 2 / rectAfterTransforms.width,
113
142
  0,
114
143
  0,
115
144
  0,
116
145
  0,
117
- -2 / canvas.height,
146
+ -2 / rectAfterTransforms.height,
118
147
  0,
119
148
  0,
120
149
  0,
121
150
  0,
122
151
  -2 / zScale,
123
152
  0,
124
- -1 + (2 * -rectAfterTransforms.x) / canvas.width,
125
- 1 - (2 * -rectAfterTransforms.y) / canvas.height,
153
+ -1 + (2 * -rectAfterTransforms.x) / rectAfterTransforms.width,
154
+ 1 - (2 * -rectAfterTransforms.y) / rectAfterTransforms.height,
126
155
  0,
127
156
  1,
128
157
  ]);
129
- const uTransform = gl.getUniformLocation(program, 'uTransform');
130
- const uProjection = gl.getUniformLocation(program, 'uProjection');
131
- const uTexture = gl.getUniformLocation(program, 'uTexture');
132
- gl.uniformMatrix4fv(uTransform, false, transformMatrix);
133
- gl.uniformMatrix4fv(uProjection, false, projectionMatrix);
134
- gl.uniform1i(uTexture, 0); // Use texture unit 0
158
+ gl.uniformMatrix4fv(locations.uTransform, false, transformMatrix);
159
+ gl.uniformMatrix4fv(locations.uProjection, false, projectionMatrix);
160
+ gl.uniform1i(locations.uTexture, 0);
161
+ // Draw
135
162
  gl.drawArrays(gl.TRIANGLES, 0, 6);
136
- // Clean up resources to prevent leaks and ensure clean state for reuse
137
- gl.disableVertexAttribArray(aPosition);
138
- gl.disableVertexAttribArray(aTexCoord);
139
- // Clean up resources to prevent leaks and ensure clean state for reuse
163
+ // Clean up per-frame resources only
164
+ gl.disableVertexAttribArray(locations.aPosition);
165
+ gl.disableVertexAttribArray(locations.aTexCoord);
140
166
  gl.deleteTexture(texture);
141
167
  gl.deleteBuffer(vertexBuffer);
142
168
  gl.bindTexture(gl.TEXTURE_2D, null);
143
- gl.deleteTexture(texture);
144
- // Reset pixel store state
169
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
170
+ // Reset state
171
+ gl.disable(gl.BLEND);
145
172
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
146
- // Reset blend function to the initial state
147
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
148
173
  return {
149
174
  canvas,
150
175
  rect: rectAfterTransforms,
151
- cleanup: () => {
152
- const loseContext = gl.getExtension('WEBGL_lose_context');
153
- if (loseContext) {
154
- loseContext.loseContext();
155
- }
156
- },
157
176
  };
158
177
  };