@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.
- package/dist/compose.js +11 -5
- package/dist/create-scaffold.js +10 -3
- package/dist/drawing/border-radius.js +9 -32
- package/dist/drawing/calculate-transforms.d.ts +9 -3
- package/dist/drawing/calculate-transforms.js +31 -9
- package/dist/drawing/clamp-rect-to-parent-bounds.d.ts +4 -0
- package/dist/drawing/clamp-rect-to-parent-bounds.js +11 -0
- package/dist/drawing/do-rects-intersect.d.ts +1 -0
- package/dist/drawing/do-rects-intersect.js +6 -0
- package/dist/drawing/draw-box-shadow.d.ts +18 -0
- package/dist/drawing/draw-box-shadow.js +103 -0
- package/dist/drawing/draw-element.d.ts +4 -1
- package/dist/drawing/draw-element.js +37 -6
- package/dist/drawing/draw-outline.js +9 -32
- package/dist/drawing/draw-rounded.d.ts +9 -0
- package/dist/drawing/draw-rounded.js +34 -0
- package/dist/drawing/get-pretransform-rect.js +5 -0
- package/dist/drawing/handle-3d-transform.d.ts +9 -8
- package/dist/drawing/handle-3d-transform.js +11 -25
- package/dist/drawing/handle-mask.d.ts +8 -0
- package/dist/drawing/handle-mask.js +19 -0
- package/dist/drawing/mask-image.d.ts +3 -0
- package/dist/drawing/mask-image.js +14 -0
- package/dist/drawing/parse-linear-gradient.d.ts +14 -0
- package/dist/drawing/parse-linear-gradient.js +260 -0
- package/dist/drawing/precompose.d.ts +11 -0
- package/dist/drawing/precompose.js +13 -0
- package/dist/drawing/process-node.d.ts +4 -3
- package/dist/drawing/process-node.js +89 -14
- package/dist/drawing/round-to-expand-rect.d.ts +1 -0
- package/dist/drawing/round-to-expand-rect.js +7 -0
- package/dist/drawing/text/draw-text.d.ts +5 -1
- package/dist/drawing/text/draw-text.js +10 -5
- package/dist/drawing/text/find-line-breaks.text.d.ts +1 -1
- package/dist/drawing/text/find-line-breaks.text.js +2 -2
- package/dist/drawing/text/handle-text-node.d.ts +2 -1
- package/dist/drawing/text/handle-text-node.js +3 -2
- package/dist/drawing/transform-in-3d.d.ts +3 -1
- package/dist/drawing/transform-in-3d.js +30 -28
- package/dist/drawing/transform.d.ts +2 -1
- package/dist/drawing/transform.js +6 -2
- package/dist/esm/index.mjs +788 -211
- package/dist/get-biggest-bounding-client-rect.js +19 -4
- package/dist/internal-state.d.ts +2 -2
- package/dist/internal-state.js +7 -7
- package/dist/render-media-on-web.d.ts +1 -0
- package/dist/render-media-on-web.js +22 -14
- 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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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;
|
package/dist/internal-state.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const makeInternalState: () => {
|
|
2
2
|
getDrawn3dPixels: () => number;
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
getPrecomposedTiles: () => number;
|
|
4
|
+
addPrecompose: ({ canvasWidth, canvasHeight, }: {
|
|
5
5
|
canvasWidth: number;
|
|
6
6
|
canvasHeight: number;
|
|
7
7
|
}) => void;
|
package/dist/internal-state.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export const makeInternalState = () => {
|
|
2
|
-
let
|
|
3
|
-
let
|
|
2
|
+
let drawnPrecomposedPixels = 0;
|
|
3
|
+
let precomposedTextures = 0;
|
|
4
4
|
return {
|
|
5
|
-
getDrawn3dPixels: () =>
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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:
|
|
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
|
-
|
|
122
|
-
if (!
|
|
123
|
-
|
|
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 =
|
|
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
|
|
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.
|
|
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.
|
|
20
|
-
"remotion": "4.0.
|
|
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.
|
|
25
|
-
"@remotion/player": "4.0.
|
|
26
|
-
"@remotion/media": "4.0.
|
|
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",
|