@remotion/web-renderer 4.0.396 → 4.0.397

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.
Files changed (48) hide show
  1. package/dist/compose.js +11 -5
  2. package/dist/create-scaffold.js +10 -3
  3. package/dist/drawing/border-radius.js +9 -32
  4. package/dist/drawing/calculate-transforms.d.ts +9 -3
  5. package/dist/drawing/calculate-transforms.js +31 -9
  6. package/dist/drawing/clamp-rect-to-parent-bounds.d.ts +4 -0
  7. package/dist/drawing/clamp-rect-to-parent-bounds.js +11 -0
  8. package/dist/drawing/do-rects-intersect.d.ts +1 -0
  9. package/dist/drawing/do-rects-intersect.js +6 -0
  10. package/dist/drawing/draw-box-shadow.d.ts +18 -0
  11. package/dist/drawing/draw-box-shadow.js +103 -0
  12. package/dist/drawing/draw-element.d.ts +4 -1
  13. package/dist/drawing/draw-element.js +37 -6
  14. package/dist/drawing/draw-outline.js +9 -32
  15. package/dist/drawing/draw-rounded.d.ts +9 -0
  16. package/dist/drawing/draw-rounded.js +34 -0
  17. package/dist/drawing/get-pretransform-rect.js +5 -0
  18. package/dist/drawing/handle-3d-transform.d.ts +9 -8
  19. package/dist/drawing/handle-3d-transform.js +11 -25
  20. package/dist/drawing/handle-mask.d.ts +8 -0
  21. package/dist/drawing/handle-mask.js +19 -0
  22. package/dist/drawing/mask-image.d.ts +3 -0
  23. package/dist/drawing/mask-image.js +14 -0
  24. package/dist/drawing/parse-linear-gradient.d.ts +14 -0
  25. package/dist/drawing/parse-linear-gradient.js +260 -0
  26. package/dist/drawing/precompose.d.ts +11 -0
  27. package/dist/drawing/precompose.js +13 -0
  28. package/dist/drawing/process-node.d.ts +4 -3
  29. package/dist/drawing/process-node.js +89 -14
  30. package/dist/drawing/round-to-expand-rect.d.ts +1 -0
  31. package/dist/drawing/round-to-expand-rect.js +7 -0
  32. package/dist/drawing/text/draw-text.d.ts +5 -1
  33. package/dist/drawing/text/draw-text.js +10 -5
  34. package/dist/drawing/text/find-line-breaks.text.d.ts +1 -1
  35. package/dist/drawing/text/find-line-breaks.text.js +2 -2
  36. package/dist/drawing/text/handle-text-node.d.ts +2 -1
  37. package/dist/drawing/text/handle-text-node.js +3 -2
  38. package/dist/drawing/transform-in-3d.d.ts +3 -1
  39. package/dist/drawing/transform-in-3d.js +30 -28
  40. package/dist/drawing/transform.d.ts +2 -1
  41. package/dist/drawing/transform.js +6 -2
  42. package/dist/esm/index.mjs +788 -211
  43. package/dist/get-biggest-bounding-client-rect.js +19 -4
  44. package/dist/internal-state.d.ts +2 -2
  45. package/dist/internal-state.js +7 -7
  46. package/dist/render-media-on-web.d.ts +1 -0
  47. package/dist/render-media-on-web.js +22 -14
  48. package/package.json +6 -6
@@ -1,3 +1,4 @@
1
+ import { parseBoxShadow } from './drawing/draw-box-shadow';
1
2
  import { parseOutlineOffset, parseOutlineWidth } from './drawing/draw-outline';
2
3
  import { skipToNextNonDescendant } from './walk-tree';
3
4
  export const getBiggestBoundingClientRect = (element) => {
@@ -11,10 +12,24 @@ export const getBiggestBoundingClientRect = (element) => {
11
12
  const outlineWidth = parseOutlineWidth(computedStyle.outlineWidth);
12
13
  const outlineOffset = parseOutlineOffset(computedStyle.outlineOffset);
13
14
  const rect = treeWalker.currentNode.getBoundingClientRect();
14
- mostLeft = Math.min(mostLeft, rect.left - outlineOffset - outlineWidth);
15
- mostTop = Math.min(mostTop, rect.top - outlineOffset - outlineWidth);
16
- mostRight = Math.max(mostRight, rect.right + outlineOffset + outlineWidth);
17
- mostBottom = Math.max(mostBottom, rect.bottom + outlineOffset + outlineWidth);
15
+ // Calculate box shadow extensions
16
+ const shadows = parseBoxShadow(computedStyle.boxShadow);
17
+ let shadowLeft = 0;
18
+ let shadowRight = 0;
19
+ let shadowTop = 0;
20
+ let shadowBottom = 0;
21
+ for (const shadow of shadows) {
22
+ if (!shadow.inset) {
23
+ shadowLeft = Math.max(shadowLeft, Math.abs(Math.min(shadow.offsetX, 0)) + shadow.blurRadius);
24
+ shadowRight = Math.max(shadowRight, Math.max(shadow.offsetX, 0) + shadow.blurRadius);
25
+ shadowTop = Math.max(shadowTop, Math.abs(Math.min(shadow.offsetY, 0)) + shadow.blurRadius);
26
+ shadowBottom = Math.max(shadowBottom, Math.max(shadow.offsetY, 0) + shadow.blurRadius);
27
+ }
28
+ }
29
+ mostLeft = Math.min(mostLeft, rect.left - outlineOffset - outlineWidth - shadowLeft);
30
+ mostTop = Math.min(mostTop, rect.top - outlineOffset - outlineWidth - shadowTop);
31
+ mostRight = Math.max(mostRight, rect.right + outlineOffset + outlineWidth + shadowRight);
32
+ mostBottom = Math.max(mostBottom, rect.bottom + outlineOffset + outlineWidth + shadowBottom);
18
33
  if (computedStyle.overflow === 'hidden') {
19
34
  if (!skipToNextNonDescendant(treeWalker)) {
20
35
  break;
@@ -1,7 +1,7 @@
1
1
  export declare const makeInternalState: () => {
2
2
  getDrawn3dPixels: () => number;
3
- getDrawn3dTextures: () => number;
4
- add3DTransform: ({ canvasWidth, canvasHeight, }: {
3
+ getPrecomposedTiles: () => number;
4
+ addPrecompose: ({ canvasWidth, canvasHeight, }: {
5
5
  canvasWidth: number;
6
6
  canvasHeight: number;
7
7
  }) => void;
@@ -1,12 +1,12 @@
1
1
  export const makeInternalState = () => {
2
- let drawn3dPixels = 0;
3
- let drawn3dTextures = 0;
2
+ let drawnPrecomposedPixels = 0;
3
+ let precomposedTextures = 0;
4
4
  return {
5
- getDrawn3dPixels: () => drawn3dPixels,
6
- getDrawn3dTextures: () => drawn3dTextures,
7
- add3DTransform: ({ canvasWidth, canvasHeight, }) => {
8
- drawn3dPixels += canvasWidth * canvasHeight;
9
- drawn3dTextures++;
5
+ getDrawn3dPixels: () => drawnPrecomposedPixels,
6
+ getPrecomposedTiles: () => precomposedTextures,
7
+ addPrecompose: ({ canvasWidth, canvasHeight, }) => {
8
+ drawnPrecomposedPixels += canvasWidth * canvasHeight;
9
+ precomposedTextures++;
10
10
  },
11
11
  };
12
12
  };
@@ -47,6 +47,7 @@ type OptionalRenderMediaOnWebOptions<Schema extends AnyZodObject> = {
47
47
  onFrame: OnFrameCallback | null;
48
48
  outputTarget: WebRendererOutputTarget | null;
49
49
  licenseKey: string | undefined;
50
+ muted: boolean;
50
51
  };
51
52
  export type RenderMediaOnWebOptions<Schema extends AnyZodObject, Props extends Record<string, unknown>> = MandatoryRenderMediaOnWebOptions<Schema, Props> & Partial<OptionalRenderMediaOnWebOptions<Schema>> & InputPropsIfHasProps<Schema, Props>;
52
53
  export declare const renderMediaOnWeb: <Schema extends AnyZodObject, Props extends Record<string, unknown>>(options: RenderMediaOnWebOptions<Schema, Props>) => Promise<RenderMediaOnWebResult>;
@@ -21,7 +21,7 @@ import { cleanupStaleOpfsFiles, createWebFsTarget } from './web-fs-target';
21
21
  // TODO: Metadata
22
22
  // TODO: Validating inputs
23
23
  // TODO: Apply defaultCodec
24
- const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTimeoutInMilliseconds, logLevel, mediaCacheSizeInBytes, schema, codec, container, signal, onProgress, hardwareAcceleration, keyframeIntervalInSeconds, videoBitrate, frameRange, transparent, onArtifact, onFrame, outputTarget: userDesiredOutputTarget, licenseKey, }) => {
24
+ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTimeoutInMilliseconds, logLevel, mediaCacheSizeInBytes, schema, codec, container, signal, onProgress, hardwareAcceleration, keyframeIntervalInSeconds, videoBitrate, frameRange, transparent, onArtifact, onFrame, outputTarget: userDesiredOutputTarget, licenseKey, muted, }) => {
25
25
  var _a, _b, _c, _d, _e, _f, _g;
26
26
  const outputTarget = userDesiredOutputTarget === null
27
27
  ? (await canUseWebFsWriter())
@@ -64,7 +64,7 @@ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTi
64
64
  logLevel,
65
65
  mediaCacheSizeInBytes,
66
66
  schema: schema !== null && schema !== void 0 ? schema : null,
67
- audioEnabled: true,
67
+ audioEnabled: !muted,
68
68
  videoEnabled: true,
69
69
  initialFrame: 0,
70
70
  defaultCodec: resolved.defaultCodec,
@@ -118,15 +118,18 @@ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTi
118
118
  });
119
119
  output.addVideoTrack(videoSampleSource);
120
120
  // TODO: Should be able to customize
121
- const defaultAudioEncodingConfig = await getDefaultAudioEncodingConfig();
122
- if (!defaultAudioEncodingConfig) {
123
- return Promise.reject(new Error('No default audio encoding config found'));
121
+ let audioSampleSource = null;
122
+ if (!muted) {
123
+ const defaultAudioEncodingConfig = await getDefaultAudioEncodingConfig();
124
+ if (!defaultAudioEncodingConfig) {
125
+ return Promise.reject(new Error('No default audio encoding config found'));
126
+ }
127
+ audioSampleSource = new AudioSampleSource(defaultAudioEncodingConfig);
128
+ cleanupFns.push(() => {
129
+ audioSampleSource === null || audioSampleSource === void 0 ? void 0 : audioSampleSource.close();
130
+ });
131
+ output.addAudioTrack(audioSampleSource);
124
132
  }
125
- const audioSampleSource = new AudioSampleSource(defaultAudioEncodingConfig);
126
- cleanupFns.push(() => {
127
- audioSampleSource.close();
128
- });
129
- output.addAudioTrack(audioSampleSource);
130
133
  await output.start();
131
134
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
132
135
  throw new Error('renderMediaOnWeb() was cancelled');
@@ -172,7 +175,9 @@ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTi
172
175
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
173
176
  throw new Error('renderMediaOnWeb() was cancelled');
174
177
  }
175
- const audio = onlyInlineAudio({ assets, fps: resolved.fps, frame });
178
+ const audio = muted
179
+ ? null
180
+ : onlyInlineAudio({ assets, fps: resolved.fps, frame });
176
181
  const timestamp = Math.round(((frame - realFrameRange[0]) / resolved.fps) * 1000000);
177
182
  const videoFrame = new VideoFrame(imageData, {
178
183
  timestamp,
@@ -196,7 +201,9 @@ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTi
196
201
  }
197
202
  await Promise.all([
198
203
  addVideoSampleAndCloseFrame(frameToEncode, videoSampleSource),
199
- audio ? addAudioSample(audio, audioSampleSource) : Promise.resolve(),
204
+ audio && audioSampleSource
205
+ ? addAudioSample(audio, audioSampleSource)
206
+ : Promise.resolve(),
200
207
  ]);
201
208
  progress.encodedFrames++;
202
209
  throttledOnProgress === null || throttledOnProgress === void 0 ? void 0 : throttledOnProgress({ ...progress });
@@ -207,7 +214,7 @@ const internalRenderMediaOnWeb = async ({ composition, inputProps, delayRenderTi
207
214
  // Call progress one final time to ensure final state is reported
208
215
  onProgress === null || onProgress === void 0 ? void 0 : onProgress({ ...progress });
209
216
  videoSampleSource.close();
210
- audioSampleSource.close();
217
+ audioSampleSource === null || audioSampleSource === void 0 ? void 0 : audioSampleSource.close();
211
218
  await output.finalize();
212
219
  const mimeType = getMimeType(container);
213
220
  if (webFsTarget) {
@@ -258,7 +265,7 @@ export const renderMediaOnWeb = (options) => {
258
265
  onlyOneRenderAtATimeQueue.ref = onlyOneRenderAtATimeQueue.ref
259
266
  .catch(() => Promise.resolve())
260
267
  .then(() => {
261
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
268
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
262
269
  return internalRenderMediaOnWeb({
263
270
  ...options,
264
271
  delayRenderTimeoutInMilliseconds: (_a = options.delayRenderTimeoutInMilliseconds) !== null && _a !== void 0 ? _a : 30000,
@@ -278,6 +285,7 @@ export const renderMediaOnWeb = (options) => {
278
285
  onFrame: (_p = options.onFrame) !== null && _p !== void 0 ? _p : null,
279
286
  outputTarget: (_q = options.outputTarget) !== null && _q !== void 0 ? _q : null,
280
287
  licenseKey: (_r = options.licenseKey) !== null && _r !== void 0 ? _r : undefined,
288
+ muted: (_s = options.muted) !== null && _s !== void 0 ? _s : false,
281
289
  });
282
290
  });
283
291
  return onlyOneRenderAtATimeQueue.ref;
package/package.json CHANGED
@@ -3,7 +3,7 @@
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.396",
6
+ "version": "4.0.397",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "scripts": {
@@ -16,14 +16,14 @@
16
16
  "author": "Remotion <jonny@remotion.dev>",
17
17
  "license": "UNLICENSED",
18
18
  "dependencies": {
19
- "@remotion/licensing": "4.0.396",
20
- "remotion": "4.0.396",
19
+ "@remotion/licensing": "4.0.397",
20
+ "remotion": "4.0.397",
21
21
  "mediabunny": "1.27.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@remotion/eslint-config-internal": "4.0.396",
25
- "@remotion/player": "4.0.396",
26
- "@remotion/media": "4.0.396",
24
+ "@remotion/eslint-config-internal": "4.0.397",
25
+ "@remotion/player": "4.0.397",
26
+ "@remotion/media": "4.0.397",
27
27
  "@vitejs/plugin-react": "4.1.0",
28
28
  "@vitest/browser-playwright": "4.0.9",
29
29
  "playwright": "1.55.1",