@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.
@@ -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 = (_a = parseTransformOrigin(transforms[0].transformOrigin)) !== null && _a !== void 0 ? _a : { x: dimensions.width / 2, y: dimensions.height / 2 };
36
- let totalMatrix = new DOMMatrix();
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 centerX = transform.boundingClientRect.width / 2;
42
- const centerY = transform.boundingClientRect.height / 2;
43
- const { x: originX, y: originY } = (_b = parseTransformOrigin(transform.transformOrigin)) !== null && _b !== void 0 ? _b : { x: centerX, y: centerY };
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(deviationFromX, deviationFromY);
61
+ .translate(-globalTransformOrigin.x, -globalTransformOrigin.y);
62
+ totalMatrix.multiplySelf(transformMatrix);
50
63
  }
51
64
  return {
52
65
  dimensions,
@@ -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,12 @@
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;
6
- const matrix = new DOMMatrix()
7
- .translate(translateX, translateY)
8
- .multiply(totalMatrix)
9
- .translate(-translateX, -translateY);
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
  };
@@ -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
  };
@@ -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 = parseTransformOrigin(transforms[0].transformOrigin) ?? { x: dimensions.width / 2, y: dimensions.height / 2 };
7400
- let totalMatrix = new DOMMatrix;
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 centerX = transform.boundingClientRect.width / 2;
7406
- const centerY = transform.boundingClientRect.height / 2;
7407
- const { x: originX, y: originY } = parseTransformOrigin(transform.transformOrigin) ?? { x: centerX, y: centerY };
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 svgToImageBitmap = (svg) => {
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.transform = totalMatrix.toString();
7446
- svg.style.transformOrigin = "50% 50%";
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(svgDimensions.width, svgDimensions.height);
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
- 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
- }
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.376",
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.376",
19
+ "remotion": "4.0.378",
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.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",