@remotion/web-renderer 4.0.376 → 4.0.378
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.js +24 -11
- package/dist/compose-canvas.d.ts +1 -1
- package/dist/compose-canvas.js +8 -10
- package/dist/compose-svg.d.ts +1 -9
- package/dist/compose-svg.js +19 -14
- package/dist/compose.js +1 -11
- package/dist/esm/index.mjs +49 -45
- package/package.json +7 -6
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { parseTransformOrigin } from './parse-transform-origin';
|
|
2
|
+
const getInternalTransformOrigin = (transform) => {
|
|
3
|
+
var _a;
|
|
4
|
+
const centerX = transform.boundingClientRect.width / 2;
|
|
5
|
+
const centerY = transform.boundingClientRect.height / 2;
|
|
6
|
+
const origin = (_a = parseTransformOrigin(transform.transformOrigin)) !== null && _a !== void 0 ? _a : {
|
|
7
|
+
x: centerX,
|
|
8
|
+
y: centerY,
|
|
9
|
+
};
|
|
10
|
+
return origin;
|
|
11
|
+
};
|
|
12
|
+
const getGlobalTransformOrigin = (transform) => {
|
|
13
|
+
const { x: originX, y: originY } = getInternalTransformOrigin(transform);
|
|
14
|
+
return {
|
|
15
|
+
x: originX + transform.boundingClientRect.left,
|
|
16
|
+
y: originY + transform.boundingClientRect.top,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
2
19
|
export const calculateTransforms = (element) => {
|
|
3
|
-
var _a, _b;
|
|
4
20
|
// Compute the cumulative transform by traversing parent nodes
|
|
5
21
|
let parent = element;
|
|
6
22
|
const transforms = [];
|
|
@@ -32,21 +48,18 @@ export const calculateTransforms = (element) => {
|
|
|
32
48
|
transform.boundingClientRect = transform.rect.getBoundingClientRect();
|
|
33
49
|
}
|
|
34
50
|
const dimensions = transforms[0].boundingClientRect;
|
|
35
|
-
const nativeTransformOrigin = (
|
|
36
|
-
|
|
51
|
+
const nativeTransformOrigin = getInternalTransformOrigin(transforms[0]);
|
|
52
|
+
const totalMatrix = new DOMMatrix();
|
|
37
53
|
for (const transform of transforms.slice().reverse()) {
|
|
38
54
|
if (!transform.boundingClientRect) {
|
|
39
55
|
throw new Error('Bounding client rect not found');
|
|
40
56
|
}
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
const deviationFromX = centerX - originX;
|
|
45
|
-
const deviationFromY = centerY - originY;
|
|
46
|
-
totalMatrix = totalMatrix
|
|
47
|
-
.translate(-deviationFromX, -deviationFromY)
|
|
57
|
+
const globalTransformOrigin = getGlobalTransformOrigin(transform);
|
|
58
|
+
const transformMatrix = new DOMMatrix()
|
|
59
|
+
.translate(globalTransformOrigin.x, globalTransformOrigin.y)
|
|
48
60
|
.multiply(transform.matrix)
|
|
49
|
-
.translate(
|
|
61
|
+
.translate(-globalTransformOrigin.x, -globalTransformOrigin.y);
|
|
62
|
+
totalMatrix.multiplySelf(transformMatrix);
|
|
50
63
|
}
|
|
51
64
|
return {
|
|
52
65
|
dimensions,
|
package/dist/compose-canvas.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const composeCanvas: (canvas: HTMLCanvasElement | HTMLImageElement, context: OffscreenCanvasRenderingContext2D) => void
|
|
1
|
+
export declare const composeCanvas: (canvas: HTMLCanvasElement | HTMLImageElement | SVGSVGElement, context: OffscreenCanvasRenderingContext2D) => Promise<void>;
|
package/dist/compose-canvas.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { calculateTransforms } from './calculate-transforms';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
context.setTransform(matrix);
|
|
11
|
-
context.drawImage(canvas, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
2
|
+
import { turnSvgIntoDrawable } from './compose-svg';
|
|
3
|
+
export const composeCanvas = async (canvas, context) => {
|
|
4
|
+
const { totalMatrix, reset, dimensions } = calculateTransforms(canvas);
|
|
5
|
+
context.setTransform(totalMatrix);
|
|
6
|
+
const drawable = canvas instanceof SVGSVGElement
|
|
7
|
+
? await turnSvgIntoDrawable(canvas)
|
|
8
|
+
: canvas;
|
|
9
|
+
context.drawImage(drawable, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
12
10
|
context.setTransform(new DOMMatrix());
|
|
13
11
|
reset();
|
|
14
12
|
};
|
package/dist/compose-svg.d.ts
CHANGED
|
@@ -1,9 +1 @@
|
|
|
1
|
-
|
|
2
|
-
image: HTMLImageElement;
|
|
3
|
-
width: number;
|
|
4
|
-
height: number;
|
|
5
|
-
left: number;
|
|
6
|
-
top: number;
|
|
7
|
-
};
|
|
8
|
-
export declare const svgToImageBitmap: (svg: SVGSVGElement) => Promise<ImgDrawable | null>;
|
|
9
|
-
export {};
|
|
1
|
+
export declare const turnSvgIntoDrawable: (svg: SVGSVGElement) => Promise<HTMLImageElement>;
|
package/dist/compose-svg.js
CHANGED
|
@@ -1,25 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
export const svgToImageBitmap = (svg) => {
|
|
3
|
-
const { dimensions: svgDimensions, totalMatrix, reset, } = calculateTransforms(svg);
|
|
1
|
+
export const turnSvgIntoDrawable = (svg) => {
|
|
4
2
|
const originalTransform = svg.style.transform;
|
|
5
3
|
const originalTransformOrigin = svg.style.transformOrigin;
|
|
6
|
-
svg.style.
|
|
7
|
-
svg.style.
|
|
4
|
+
const originalMarginLeft = svg.style.marginLeft;
|
|
5
|
+
const originalMarginRight = svg.style.marginRight;
|
|
6
|
+
const originalMarginTop = svg.style.marginTop;
|
|
7
|
+
const originalMarginBottom = svg.style.marginBottom;
|
|
8
|
+
svg.style.transform = 'none';
|
|
9
|
+
svg.style.transformOrigin = '';
|
|
10
|
+
// Margins were already included in the positioning calculation,
|
|
11
|
+
// so we need to remove them to avoid double counting.
|
|
12
|
+
svg.style.marginLeft = '0';
|
|
13
|
+
svg.style.marginRight = '0';
|
|
14
|
+
svg.style.marginTop = '0';
|
|
15
|
+
svg.style.marginBottom = '0';
|
|
8
16
|
const svgData = new XMLSerializer().serializeToString(svg);
|
|
17
|
+
svg.style.marginLeft = originalMarginLeft;
|
|
18
|
+
svg.style.marginRight = originalMarginRight;
|
|
19
|
+
svg.style.marginTop = originalMarginTop;
|
|
20
|
+
svg.style.marginBottom = originalMarginBottom;
|
|
9
21
|
svg.style.transform = originalTransform;
|
|
10
22
|
svg.style.transformOrigin = originalTransformOrigin;
|
|
11
|
-
reset();
|
|
12
23
|
return new Promise((resolve, reject) => {
|
|
13
|
-
const image = new Image(
|
|
24
|
+
const image = new Image();
|
|
14
25
|
const url = `data:image/svg+xml;base64,${btoa(svgData)}`;
|
|
15
26
|
image.onload = function () {
|
|
16
|
-
resolve(
|
|
17
|
-
image,
|
|
18
|
-
width: svgDimensions.width,
|
|
19
|
-
height: svgDimensions.height,
|
|
20
|
-
left: svgDimensions.left,
|
|
21
|
-
top: svgDimensions.top,
|
|
22
|
-
});
|
|
27
|
+
resolve(image);
|
|
23
28
|
};
|
|
24
29
|
image.onerror = () => {
|
|
25
30
|
reject(new Error('Failed to convert SVG to image'));
|
package/dist/compose.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { composeCanvas } from './compose-canvas';
|
|
2
|
-
import { svgToImageBitmap } from './compose-svg';
|
|
3
2
|
export const compose = async ({ composables, width, height, }) => {
|
|
4
3
|
const canvas = new OffscreenCanvas(width, height);
|
|
5
4
|
const context = canvas.getContext('2d');
|
|
@@ -8,16 +7,7 @@ export const compose = async ({ composables, width, height, }) => {
|
|
|
8
7
|
}
|
|
9
8
|
// TODO: Consider z-index
|
|
10
9
|
for (const composable of composables) {
|
|
11
|
-
|
|
12
|
-
composeCanvas(composable.element, context);
|
|
13
|
-
}
|
|
14
|
-
else if (composable.type === 'svg') {
|
|
15
|
-
// This already accumulates the transforms of the parent
|
|
16
|
-
const imageBitmap = await svgToImageBitmap(composable.element);
|
|
17
|
-
if (imageBitmap) {
|
|
18
|
-
context.drawImage(imageBitmap.image, imageBitmap.left, imageBitmap.top, imageBitmap.width, imageBitmap.height);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
10
|
+
await composeCanvas(composable.element, context);
|
|
21
11
|
}
|
|
22
12
|
return canvas;
|
|
23
13
|
};
|
package/dist/esm/index.mjs
CHANGED
|
@@ -7368,6 +7368,22 @@ var parseTransformOrigin = (transformOrigin) => {
|
|
|
7368
7368
|
};
|
|
7369
7369
|
|
|
7370
7370
|
// src/calculate-transforms.ts
|
|
7371
|
+
var getInternalTransformOrigin = (transform) => {
|
|
7372
|
+
const centerX = transform.boundingClientRect.width / 2;
|
|
7373
|
+
const centerY = transform.boundingClientRect.height / 2;
|
|
7374
|
+
const origin = parseTransformOrigin(transform.transformOrigin) ?? {
|
|
7375
|
+
x: centerX,
|
|
7376
|
+
y: centerY
|
|
7377
|
+
};
|
|
7378
|
+
return origin;
|
|
7379
|
+
};
|
|
7380
|
+
var getGlobalTransformOrigin = (transform) => {
|
|
7381
|
+
const { x: originX, y: originY } = getInternalTransformOrigin(transform);
|
|
7382
|
+
return {
|
|
7383
|
+
x: originX + transform.boundingClientRect.left,
|
|
7384
|
+
y: originY + transform.boundingClientRect.top
|
|
7385
|
+
};
|
|
7386
|
+
};
|
|
7371
7387
|
var calculateTransforms = (element) => {
|
|
7372
7388
|
let parent = element;
|
|
7373
7389
|
const transforms = [];
|
|
@@ -7396,18 +7412,15 @@ var calculateTransforms = (element) => {
|
|
|
7396
7412
|
transform.boundingClientRect = transform.rect.getBoundingClientRect();
|
|
7397
7413
|
}
|
|
7398
7414
|
const dimensions = transforms[0].boundingClientRect;
|
|
7399
|
-
const nativeTransformOrigin =
|
|
7400
|
-
|
|
7415
|
+
const nativeTransformOrigin = getInternalTransformOrigin(transforms[0]);
|
|
7416
|
+
const totalMatrix = new DOMMatrix;
|
|
7401
7417
|
for (const transform of transforms.slice().reverse()) {
|
|
7402
7418
|
if (!transform.boundingClientRect) {
|
|
7403
7419
|
throw new Error("Bounding client rect not found");
|
|
7404
7420
|
}
|
|
7405
|
-
const
|
|
7406
|
-
const
|
|
7407
|
-
|
|
7408
|
-
const deviationFromX = centerX - originX;
|
|
7409
|
-
const deviationFromY = centerY - originY;
|
|
7410
|
-
totalMatrix = totalMatrix.translate(-deviationFromX, -deviationFromY).multiply(transform.matrix).translate(deviationFromX, deviationFromY);
|
|
7421
|
+
const globalTransformOrigin = getGlobalTransformOrigin(transform);
|
|
7422
|
+
const transformMatrix = new DOMMatrix().translate(globalTransformOrigin.x, globalTransformOrigin.y).multiply(transform.matrix).translate(-globalTransformOrigin.x, -globalTransformOrigin.y);
|
|
7423
|
+
totalMatrix.multiplySelf(transformMatrix);
|
|
7411
7424
|
}
|
|
7412
7425
|
return {
|
|
7413
7426
|
dimensions,
|
|
@@ -7421,44 +7434,32 @@ var calculateTransforms = (element) => {
|
|
|
7421
7434
|
};
|
|
7422
7435
|
};
|
|
7423
7436
|
|
|
7424
|
-
// src/compose-canvas.ts
|
|
7425
|
-
var composeCanvas = (canvas, context) => {
|
|
7426
|
-
const { totalMatrix, reset, dimensions, nativeTransformOrigin } = calculateTransforms(canvas);
|
|
7427
|
-
const translateX = nativeTransformOrigin.x + dimensions.left;
|
|
7428
|
-
const translateY = nativeTransformOrigin.y + dimensions.top;
|
|
7429
|
-
const matrix = new DOMMatrix().translate(translateX, translateY).multiply(totalMatrix).translate(-translateX, -translateY);
|
|
7430
|
-
context.setTransform(matrix);
|
|
7431
|
-
context.drawImage(canvas, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
7432
|
-
context.setTransform(new DOMMatrix);
|
|
7433
|
-
reset();
|
|
7434
|
-
};
|
|
7435
|
-
|
|
7436
7437
|
// src/compose-svg.ts
|
|
7437
|
-
var
|
|
7438
|
-
const {
|
|
7439
|
-
dimensions: svgDimensions,
|
|
7440
|
-
totalMatrix,
|
|
7441
|
-
reset
|
|
7442
|
-
} = calculateTransforms(svg);
|
|
7438
|
+
var turnSvgIntoDrawable = (svg) => {
|
|
7443
7439
|
const originalTransform = svg.style.transform;
|
|
7444
7440
|
const originalTransformOrigin = svg.style.transformOrigin;
|
|
7445
|
-
svg.style.
|
|
7446
|
-
svg.style.
|
|
7441
|
+
const originalMarginLeft = svg.style.marginLeft;
|
|
7442
|
+
const originalMarginRight = svg.style.marginRight;
|
|
7443
|
+
const originalMarginTop = svg.style.marginTop;
|
|
7444
|
+
const originalMarginBottom = svg.style.marginBottom;
|
|
7445
|
+
svg.style.transform = "none";
|
|
7446
|
+
svg.style.transformOrigin = "";
|
|
7447
|
+
svg.style.marginLeft = "0";
|
|
7448
|
+
svg.style.marginRight = "0";
|
|
7449
|
+
svg.style.marginTop = "0";
|
|
7450
|
+
svg.style.marginBottom = "0";
|
|
7447
7451
|
const svgData = new XMLSerializer().serializeToString(svg);
|
|
7452
|
+
svg.style.marginLeft = originalMarginLeft;
|
|
7453
|
+
svg.style.marginRight = originalMarginRight;
|
|
7454
|
+
svg.style.marginTop = originalMarginTop;
|
|
7455
|
+
svg.style.marginBottom = originalMarginBottom;
|
|
7448
7456
|
svg.style.transform = originalTransform;
|
|
7449
7457
|
svg.style.transformOrigin = originalTransformOrigin;
|
|
7450
|
-
reset();
|
|
7451
7458
|
return new Promise((resolve, reject) => {
|
|
7452
|
-
const image = new Image
|
|
7459
|
+
const image = new Image;
|
|
7453
7460
|
const url2 = `data:image/svg+xml;base64,${btoa(svgData)}`;
|
|
7454
7461
|
image.onload = function() {
|
|
7455
|
-
resolve(
|
|
7456
|
-
image,
|
|
7457
|
-
width: svgDimensions.width,
|
|
7458
|
-
height: svgDimensions.height,
|
|
7459
|
-
left: svgDimensions.left,
|
|
7460
|
-
top: svgDimensions.top
|
|
7461
|
-
});
|
|
7462
|
+
resolve(image);
|
|
7462
7463
|
};
|
|
7463
7464
|
image.onerror = () => {
|
|
7464
7465
|
reject(new Error("Failed to convert SVG to image"));
|
|
@@ -7467,6 +7468,16 @@ var svgToImageBitmap = (svg) => {
|
|
|
7467
7468
|
});
|
|
7468
7469
|
};
|
|
7469
7470
|
|
|
7471
|
+
// src/compose-canvas.ts
|
|
7472
|
+
var composeCanvas = async (canvas, context) => {
|
|
7473
|
+
const { totalMatrix, reset, dimensions } = calculateTransforms(canvas);
|
|
7474
|
+
context.setTransform(totalMatrix);
|
|
7475
|
+
const drawable = canvas instanceof SVGSVGElement ? await turnSvgIntoDrawable(canvas) : canvas;
|
|
7476
|
+
context.drawImage(drawable, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
7477
|
+
context.setTransform(new DOMMatrix);
|
|
7478
|
+
reset();
|
|
7479
|
+
};
|
|
7480
|
+
|
|
7470
7481
|
// src/compose.ts
|
|
7471
7482
|
var compose = async ({
|
|
7472
7483
|
composables,
|
|
@@ -7479,14 +7490,7 @@ var compose = async ({
|
|
|
7479
7490
|
throw new Error("Could not get context");
|
|
7480
7491
|
}
|
|
7481
7492
|
for (const composable of composables) {
|
|
7482
|
-
|
|
7483
|
-
composeCanvas(composable.element, context);
|
|
7484
|
-
} else if (composable.type === "svg") {
|
|
7485
|
-
const imageBitmap = await svgToImageBitmap(composable.element);
|
|
7486
|
-
if (imageBitmap) {
|
|
7487
|
-
context.drawImage(imageBitmap.image, imageBitmap.left, imageBitmap.top, imageBitmap.width, imageBitmap.height);
|
|
7488
|
-
}
|
|
7489
|
-
}
|
|
7493
|
+
await composeCanvas(composable.element, context);
|
|
7490
7494
|
}
|
|
7491
7495
|
return canvas;
|
|
7492
7496
|
};
|
package/package.json
CHANGED
|
@@ -3,25 +3,26 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/web-renderer"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/web-renderer",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.378",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"scripts": {
|
|
10
10
|
"formatting": "prettier --experimental-cli src --check",
|
|
11
11
|
"lint": "eslint src",
|
|
12
12
|
"make": "tsc -d && bun --env-file=../.env.bundle bundle.ts",
|
|
13
|
-
"testwebrenderer": "vitest src/test --browser --run"
|
|
13
|
+
"testwebrenderer": "vitest src/test --browser --run",
|
|
14
|
+
"studio": "cd ../example && bunx remotion studio ../web-renderer/src/test/studio.ts"
|
|
14
15
|
},
|
|
15
16
|
"author": "Remotion <jonny@remotion.dev>",
|
|
16
17
|
"license": "UNLICENSED",
|
|
17
18
|
"dependencies": {
|
|
18
|
-
"remotion": "4.0.
|
|
19
|
+
"remotion": "4.0.378",
|
|
19
20
|
"mediabunny": "1.24.5"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
22
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
23
|
-
"@remotion/player": "4.0.
|
|
24
|
-
"@remotion/media": "4.0.
|
|
23
|
+
"@remotion/eslint-config-internal": "4.0.378",
|
|
24
|
+
"@remotion/player": "4.0.378",
|
|
25
|
+
"@remotion/media": "4.0.378",
|
|
25
26
|
"@vitejs/plugin-react": "^5.1.0",
|
|
26
27
|
"@vitest/browser-playwright": "4.0.9",
|
|
27
28
|
"playwright": "1.55.1",
|