@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.
- package/dist/calculate-transforms.d.ts +0 -2
- package/dist/calculate-transforms.js +0 -17
- package/dist/composable.d.ts +8 -2
- package/dist/compose-canvas.js +4 -28
- package/dist/compose.d.ts +2 -1
- package/dist/compose.js +34 -35
- package/dist/drawing/border-radius.d.ts +3 -1
- package/dist/drawing/border-radius.js +27 -6
- package/dist/drawing/calculate-object-fit.d.ts +40 -0
- package/dist/drawing/calculate-object-fit.js +208 -0
- package/dist/drawing/draw-background.d.ts +13 -0
- package/dist/drawing/draw-background.js +62 -0
- package/dist/drawing/draw-box-shadow.d.ts +1 -1
- package/dist/drawing/draw-box-shadow.js +1 -1
- package/dist/drawing/draw-dom-element.js +78 -10
- package/dist/drawing/draw-element-to-canvas.d.ts +1 -2
- package/dist/drawing/draw-element-to-canvas.js +36 -8
- package/dist/drawing/draw-element.d.ts +4 -1
- package/dist/drawing/draw-element.js +21 -35
- package/dist/drawing/fit-svg-into-its-dimensions.d.ts +12 -0
- package/dist/drawing/fit-svg-into-its-dimensions.js +35 -0
- package/dist/drawing/get-clipped-background.d.ts +8 -0
- package/dist/drawing/get-clipped-background.js +14 -0
- package/dist/drawing/get-padding-box.d.ts +1 -0
- package/dist/drawing/get-padding-box.js +30 -0
- package/dist/drawing/get-pretransform-rect.js +13 -0
- package/dist/drawing/go-rects-intersect.d.ts +1 -0
- package/dist/drawing/go-rects-intersect.js +6 -0
- package/dist/drawing/handle-3d-transform.d.ts +4 -2
- package/dist/drawing/handle-3d-transform.js +4 -3
- package/dist/drawing/handle-mask.js +2 -0
- package/dist/drawing/overflow.d.ts +3 -1
- package/dist/drawing/overflow.js +3 -1
- package/dist/drawing/parse-linear-gradient.d.ts +3 -1
- package/dist/drawing/parse-linear-gradient.js +3 -3
- package/dist/drawing/precompose.js +1 -0
- package/dist/drawing/process-node.js +5 -6
- package/dist/drawing/text/draw-text.d.ts +2 -1
- package/dist/drawing/text/draw-text.js +9 -3
- package/dist/drawing/text/get-base-height.d.ts +1 -0
- package/dist/drawing/text/get-base-height.js +13 -0
- package/dist/drawing/text/handle-text-node.d.ts +2 -1
- package/dist/drawing/text/handle-text-node.js +2 -2
- package/dist/drawing/transform-in-3d.d.ts +3 -2
- package/dist/drawing/transform-in-3d.js +106 -87
- package/dist/esm/index.mjs +678 -168
- package/dist/find-capturable-elements.d.ts +1 -1
- package/dist/find-capturable-elements.js +22 -20
- package/dist/internal-state.d.ts +19 -0
- package/dist/internal-state.js +9 -0
- package/dist/render-still-on-web.js +1 -0
- package/dist/send-telemetry-event.js +1 -1
- package/dist/take-screenshot.js +1 -0
- package/dist/tree-walker-cleanup-after-children.d.ts +5 -0
- package/dist/tree-walker-cleanup-after-children.js +33 -0
- package/package.json +9 -8
- package/dist/border-radius.d.ts +0 -31
- package/dist/border-radius.js +0 -152
- package/dist/drawing/canvas-offset-from-rect.d.ts +0 -8
- package/dist/drawing/canvas-offset-from-rect.js +0 -12
- package/dist/drawing/compose-canvas.d.ts +0 -1
- package/dist/drawing/compose-canvas.js +0 -36
- package/dist/drawing/compose-svg.d.ts +0 -1
- package/dist/drawing/compose-svg.js +0 -34
- package/dist/drawing/compose.d.ts +0 -5
- package/dist/drawing/compose.js +0 -6
- package/dist/drawing/get-bounding-box-including-shadow.d.ts +0 -1
- package/dist/drawing/get-bounding-box-including-shadow.js +0 -6
- package/dist/drawing/get-computed-style-cache.d.ts +0 -0
- package/dist/drawing/get-computed-style-cache.js +0 -1
- package/dist/find-canvas-elements.d.ts +0 -1
- package/dist/find-canvas-elements.js +0 -13
- package/dist/opacity.d.ts +0 -4
- package/dist/opacity.js +0 -7
- package/dist/transform.d.ts +0 -4
- 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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
untransformedRect.x, untransformedRect.y, 0,
|
|
78
|
-
untransformedRect.x + untransformedRect.
|
|
79
|
-
untransformedRect.x
|
|
80
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
gl.enableVertexAttribArray(
|
|
90
|
-
gl.vertexAttribPointer(
|
|
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
|
-
|
|
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;
|
|
110
|
-
//
|
|
138
|
+
const zScale = 1000000000;
|
|
139
|
+
// Projection matrix accounts for the output canvas dimensions
|
|
111
140
|
const projectionMatrix = new Float32Array([
|
|
112
|
-
2 /
|
|
141
|
+
2 / rectAfterTransforms.width,
|
|
113
142
|
0,
|
|
114
143
|
0,
|
|
115
144
|
0,
|
|
116
145
|
0,
|
|
117
|
-
-2 /
|
|
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) /
|
|
125
|
-
1 - (2 * -rectAfterTransforms.y) /
|
|
153
|
+
-1 + (2 * -rectAfterTransforms.x) / rectAfterTransforms.width,
|
|
154
|
+
1 - (2 * -rectAfterTransforms.y) / rectAfterTransforms.height,
|
|
126
155
|
0,
|
|
127
156
|
1,
|
|
128
157
|
]);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
|
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.
|
|
144
|
-
// Reset
|
|
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
|
};
|