@remotion/web-renderer 4.0.376 → 4.0.377
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/compose-canvas.d.ts +1 -1
- package/dist/compose-canvas.js +9 -5
- 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 +31 -37
- package/package.json +7 -6
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,18 @@
|
|
|
1
1
|
import { calculateTransforms } from './calculate-transforms';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
2
|
+
import { turnSvgIntoDrawable } from './compose-svg';
|
|
3
|
+
export const composeCanvas = async (canvas, context) => {
|
|
4
|
+
const { totalMatrix, reset, dimensions } = calculateTransforms(canvas);
|
|
5
|
+
const translateX = dimensions.left + dimensions.width / 2;
|
|
6
|
+
const translateY = dimensions.top + dimensions.height / 2;
|
|
6
7
|
const matrix = new DOMMatrix()
|
|
7
8
|
.translate(translateX, translateY)
|
|
8
9
|
.multiply(totalMatrix)
|
|
9
10
|
.translate(-translateX, -translateY);
|
|
10
11
|
context.setTransform(matrix);
|
|
11
|
-
|
|
12
|
+
const drawable = canvas instanceof SVGSVGElement
|
|
13
|
+
? await turnSvgIntoDrawable(canvas)
|
|
14
|
+
: canvas;
|
|
15
|
+
context.drawImage(drawable, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
12
16
|
context.setTransform(new DOMMatrix());
|
|
13
17
|
reset();
|
|
14
18
|
};
|
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
|
@@ -7421,44 +7421,32 @@ var calculateTransforms = (element) => {
|
|
|
7421
7421
|
};
|
|
7422
7422
|
};
|
|
7423
7423
|
|
|
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
7424
|
// src/compose-svg.ts
|
|
7437
|
-
var
|
|
7438
|
-
const {
|
|
7439
|
-
dimensions: svgDimensions,
|
|
7440
|
-
totalMatrix,
|
|
7441
|
-
reset
|
|
7442
|
-
} = calculateTransforms(svg);
|
|
7425
|
+
var turnSvgIntoDrawable = (svg) => {
|
|
7443
7426
|
const originalTransform = svg.style.transform;
|
|
7444
7427
|
const originalTransformOrigin = svg.style.transformOrigin;
|
|
7445
|
-
svg.style.
|
|
7446
|
-
svg.style.
|
|
7428
|
+
const originalMarginLeft = svg.style.marginLeft;
|
|
7429
|
+
const originalMarginRight = svg.style.marginRight;
|
|
7430
|
+
const originalMarginTop = svg.style.marginTop;
|
|
7431
|
+
const originalMarginBottom = svg.style.marginBottom;
|
|
7432
|
+
svg.style.transform = "none";
|
|
7433
|
+
svg.style.transformOrigin = "";
|
|
7434
|
+
svg.style.marginLeft = "0";
|
|
7435
|
+
svg.style.marginRight = "0";
|
|
7436
|
+
svg.style.marginTop = "0";
|
|
7437
|
+
svg.style.marginBottom = "0";
|
|
7447
7438
|
const svgData = new XMLSerializer().serializeToString(svg);
|
|
7439
|
+
svg.style.marginLeft = originalMarginLeft;
|
|
7440
|
+
svg.style.marginRight = originalMarginRight;
|
|
7441
|
+
svg.style.marginTop = originalMarginTop;
|
|
7442
|
+
svg.style.marginBottom = originalMarginBottom;
|
|
7448
7443
|
svg.style.transform = originalTransform;
|
|
7449
7444
|
svg.style.transformOrigin = originalTransformOrigin;
|
|
7450
|
-
reset();
|
|
7451
7445
|
return new Promise((resolve, reject) => {
|
|
7452
|
-
const image = new Image
|
|
7446
|
+
const image = new Image;
|
|
7453
7447
|
const url2 = `data:image/svg+xml;base64,${btoa(svgData)}`;
|
|
7454
7448
|
image.onload = function() {
|
|
7455
|
-
resolve(
|
|
7456
|
-
image,
|
|
7457
|
-
width: svgDimensions.width,
|
|
7458
|
-
height: svgDimensions.height,
|
|
7459
|
-
left: svgDimensions.left,
|
|
7460
|
-
top: svgDimensions.top
|
|
7461
|
-
});
|
|
7449
|
+
resolve(image);
|
|
7462
7450
|
};
|
|
7463
7451
|
image.onerror = () => {
|
|
7464
7452
|
reject(new Error("Failed to convert SVG to image"));
|
|
@@ -7467,6 +7455,19 @@ var svgToImageBitmap = (svg) => {
|
|
|
7467
7455
|
});
|
|
7468
7456
|
};
|
|
7469
7457
|
|
|
7458
|
+
// src/compose-canvas.ts
|
|
7459
|
+
var composeCanvas = async (canvas, context) => {
|
|
7460
|
+
const { totalMatrix, reset, dimensions } = calculateTransforms(canvas);
|
|
7461
|
+
const translateX = dimensions.left + dimensions.width / 2;
|
|
7462
|
+
const translateY = dimensions.top + dimensions.height / 2;
|
|
7463
|
+
const matrix = new DOMMatrix().translate(translateX, translateY).multiply(totalMatrix).translate(-translateX, -translateY);
|
|
7464
|
+
context.setTransform(matrix);
|
|
7465
|
+
const drawable = canvas instanceof SVGSVGElement ? await turnSvgIntoDrawable(canvas) : canvas;
|
|
7466
|
+
context.drawImage(drawable, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
|
|
7467
|
+
context.setTransform(new DOMMatrix);
|
|
7468
|
+
reset();
|
|
7469
|
+
};
|
|
7470
|
+
|
|
7470
7471
|
// src/compose.ts
|
|
7471
7472
|
var compose = async ({
|
|
7472
7473
|
composables,
|
|
@@ -7479,14 +7480,7 @@ var compose = async ({
|
|
|
7479
7480
|
throw new Error("Could not get context");
|
|
7480
7481
|
}
|
|
7481
7482
|
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
|
-
}
|
|
7483
|
+
await composeCanvas(composable.element, context);
|
|
7490
7484
|
}
|
|
7491
7485
|
return canvas;
|
|
7492
7486
|
};
|
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.377",
|
|
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.377",
|
|
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.377",
|
|
24
|
+
"@remotion/player": "4.0.377",
|
|
25
|
+
"@remotion/media": "4.0.377",
|
|
25
26
|
"@vitejs/plugin-react": "^5.1.0",
|
|
26
27
|
"@vitest/browser-playwright": "4.0.9",
|
|
27
28
|
"playwright": "1.55.1",
|