@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.
@@ -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>;
@@ -1,14 +1,18 @@
1
1
  import { calculateTransforms } from './calculate-transforms';
2
- export const composeCanvas = (canvas, context) => {
3
- const { totalMatrix, reset, dimensions, nativeTransformOrigin } = calculateTransforms(canvas);
4
- const translateX = nativeTransformOrigin.x + dimensions.left;
5
- const translateY = nativeTransformOrigin.y + dimensions.top;
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
- context.drawImage(canvas, dimensions.left, dimensions.top, dimensions.width, dimensions.height);
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
  };
@@ -1,9 +1 @@
1
- type ImgDrawable = {
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>;
@@ -1,25 +1,30 @@
1
- import { calculateTransforms } from './calculate-transforms';
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.transform = totalMatrix.toString();
7
- svg.style.transformOrigin = '50% 50%';
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(svgDimensions.width, svgDimensions.height);
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
- if (composable.type === 'canvas' || composable.type === 'img') {
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
  };
@@ -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 svgToImageBitmap = (svg) => {
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.transform = totalMatrix.toString();
7446
- svg.style.transformOrigin = "50% 50%";
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(svgDimensions.width, svgDimensions.height);
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
- if (composable.type === "canvas" || composable.type === "img") {
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.376",
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.376",
19
+ "remotion": "4.0.377",
19
20
  "mediabunny": "1.24.5"
20
21
  },
21
22
  "devDependencies": {
22
- "@remotion/eslint-config-internal": "4.0.376",
23
- "@remotion/player": "4.0.376",
24
- "@remotion/media": "4.0.376",
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",