@remotion/timeline-utils 4.0.463 → 4.0.465
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/esm/index.mjs +67 -0
- package/dist/image-thumbnail/draw-repeating-image-thumbnail.d.ts +9 -0
- package/dist/image-thumbnail/draw-repeating-image-thumbnail.js +47 -0
- package/dist/image-thumbnail/get-scaled-image-thumbnail-dimensions.d.ts +8 -0
- package/dist/image-thumbnail/get-scaled-image-thumbnail-dimensions.js +17 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -1
- package/package.json +2 -2
package/dist/esm/index.mjs
CHANGED
|
@@ -284,6 +284,71 @@ var sliceWaveformPeaks = ({
|
|
|
284
284
|
const endPeakIndex = Math.ceil((startTimeInSeconds + durationInSeconds) * TARGET_SAMPLE_RATE);
|
|
285
285
|
return peaks.subarray(Math.max(0, startPeakIndex), Math.min(peaks.length, endPeakIndex));
|
|
286
286
|
};
|
|
287
|
+
// src/image-thumbnail/get-scaled-image-thumbnail-dimensions.ts
|
|
288
|
+
var getScaledImageThumbnailDimensions = ({
|
|
289
|
+
naturalWidth,
|
|
290
|
+
naturalHeight,
|
|
291
|
+
canvasHeight
|
|
292
|
+
}) => {
|
|
293
|
+
if (naturalWidth === 0 || naturalHeight === 0 || canvasHeight === 0) {
|
|
294
|
+
return {
|
|
295
|
+
scaledWidth: 0,
|
|
296
|
+
scaledHeight: 0
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const scale = canvasHeight / naturalHeight;
|
|
300
|
+
return {
|
|
301
|
+
scaledWidth: naturalWidth * scale,
|
|
302
|
+
scaledHeight: canvasHeight
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
// src/image-thumbnail/draw-repeating-image-thumbnail.ts
|
|
307
|
+
var createOffscreenCanvas = (width, height) => {
|
|
308
|
+
if (typeof document !== "undefined") {
|
|
309
|
+
const canvas = document.createElement("canvas");
|
|
310
|
+
canvas.width = width;
|
|
311
|
+
canvas.height = height;
|
|
312
|
+
return canvas;
|
|
313
|
+
}
|
|
314
|
+
if (typeof OffscreenCanvas !== "undefined") {
|
|
315
|
+
return new OffscreenCanvas(width, height);
|
|
316
|
+
}
|
|
317
|
+
throw new Error("No canvas implementation available");
|
|
318
|
+
};
|
|
319
|
+
var drawRepeatingImageThumbnail = ({
|
|
320
|
+
canvas,
|
|
321
|
+
image
|
|
322
|
+
}) => {
|
|
323
|
+
const ctx = canvas.getContext("2d");
|
|
324
|
+
if (!ctx) {
|
|
325
|
+
throw new Error("Failed to get canvas context");
|
|
326
|
+
}
|
|
327
|
+
const { width, height } = canvas;
|
|
328
|
+
if (width === 0 || height === 0) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const { scaledWidth, scaledHeight } = getScaledImageThumbnailDimensions({
|
|
332
|
+
naturalWidth: image.naturalWidth,
|
|
333
|
+
naturalHeight: image.naturalHeight,
|
|
334
|
+
canvasHeight: height
|
|
335
|
+
});
|
|
336
|
+
if (scaledWidth === 0 || scaledHeight === 0) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const offscreen = createOffscreenCanvas(scaledWidth, scaledHeight);
|
|
340
|
+
const offCtx = offscreen.getContext("2d");
|
|
341
|
+
if (!offCtx) {
|
|
342
|
+
throw new Error("Failed to get offscreen canvas context");
|
|
343
|
+
}
|
|
344
|
+
offCtx.drawImage(image, 0, 0, scaledWidth, scaledHeight);
|
|
345
|
+
const pattern = ctx.createPattern(offscreen, "repeat-x");
|
|
346
|
+
if (!pattern) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
ctx.fillStyle = pattern;
|
|
350
|
+
ctx.fillRect(0, 0, width, height);
|
|
351
|
+
};
|
|
287
352
|
// src/extract-frames.ts
|
|
288
353
|
import {
|
|
289
354
|
ALL_FORMATS as ALL_FORMATS2,
|
|
@@ -661,6 +726,7 @@ export {
|
|
|
661
726
|
makeAudioWaveformWorker,
|
|
662
727
|
loadWaveformPeaks,
|
|
663
728
|
getTimestampFromFrameDatabaseKey,
|
|
729
|
+
getScaledImageThumbnailDimensions,
|
|
664
730
|
getLoopDisplayWidth,
|
|
665
731
|
getFrameDatabaseKeyPrefix,
|
|
666
732
|
getDurationOfOneFrame,
|
|
@@ -672,6 +738,7 @@ export {
|
|
|
672
738
|
ensureSlots,
|
|
673
739
|
emitWaveformProgress,
|
|
674
740
|
drawSlot,
|
|
741
|
+
drawRepeatingImageThumbnail,
|
|
675
742
|
drawBars,
|
|
676
743
|
createWaveformPeakProcessor,
|
|
677
744
|
calculateTimestampSlots,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type ImageWithNaturalDimensions = CanvasImageSource & {
|
|
2
|
+
readonly naturalWidth: number;
|
|
3
|
+
readonly naturalHeight: number;
|
|
4
|
+
};
|
|
5
|
+
export declare const drawRepeatingImageThumbnail: ({ canvas, image, }: {
|
|
6
|
+
readonly canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
7
|
+
readonly image: ImageWithNaturalDimensions;
|
|
8
|
+
}) => void;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.drawRepeatingImageThumbnail = void 0;
|
|
4
|
+
const get_scaled_image_thumbnail_dimensions_1 = require("./get-scaled-image-thumbnail-dimensions");
|
|
5
|
+
const createOffscreenCanvas = (width, height) => {
|
|
6
|
+
if (typeof document !== 'undefined') {
|
|
7
|
+
const canvas = document.createElement('canvas');
|
|
8
|
+
canvas.width = width;
|
|
9
|
+
canvas.height = height;
|
|
10
|
+
return canvas;
|
|
11
|
+
}
|
|
12
|
+
if (typeof OffscreenCanvas !== 'undefined') {
|
|
13
|
+
return new OffscreenCanvas(width, height);
|
|
14
|
+
}
|
|
15
|
+
throw new Error('No canvas implementation available');
|
|
16
|
+
};
|
|
17
|
+
const drawRepeatingImageThumbnail = ({ canvas, image, }) => {
|
|
18
|
+
const ctx = canvas.getContext('2d');
|
|
19
|
+
if (!ctx) {
|
|
20
|
+
throw new Error('Failed to get canvas context');
|
|
21
|
+
}
|
|
22
|
+
const { width, height } = canvas;
|
|
23
|
+
if (width === 0 || height === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const { scaledWidth, scaledHeight } = (0, get_scaled_image_thumbnail_dimensions_1.getScaledImageThumbnailDimensions)({
|
|
27
|
+
naturalWidth: image.naturalWidth,
|
|
28
|
+
naturalHeight: image.naturalHeight,
|
|
29
|
+
canvasHeight: height,
|
|
30
|
+
});
|
|
31
|
+
if (scaledWidth === 0 || scaledHeight === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const offscreen = createOffscreenCanvas(scaledWidth, scaledHeight);
|
|
35
|
+
const offCtx = offscreen.getContext('2d');
|
|
36
|
+
if (!offCtx) {
|
|
37
|
+
throw new Error('Failed to get offscreen canvas context');
|
|
38
|
+
}
|
|
39
|
+
offCtx.drawImage(image, 0, 0, scaledWidth, scaledHeight);
|
|
40
|
+
const pattern = ctx.createPattern(offscreen, 'repeat-x');
|
|
41
|
+
if (!pattern) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
ctx.fillStyle = pattern;
|
|
45
|
+
ctx.fillRect(0, 0, width, height);
|
|
46
|
+
};
|
|
47
|
+
exports.drawRepeatingImageThumbnail = drawRepeatingImageThumbnail;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const getScaledImageThumbnailDimensions: ({ naturalWidth, naturalHeight, canvasHeight, }: {
|
|
2
|
+
readonly naturalWidth: number;
|
|
3
|
+
readonly naturalHeight: number;
|
|
4
|
+
readonly canvasHeight: number;
|
|
5
|
+
}) => {
|
|
6
|
+
scaledWidth: number;
|
|
7
|
+
scaledHeight: number;
|
|
8
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getScaledImageThumbnailDimensions = void 0;
|
|
4
|
+
const getScaledImageThumbnailDimensions = ({ naturalWidth, naturalHeight, canvasHeight, }) => {
|
|
5
|
+
if (naturalWidth === 0 || naturalHeight === 0 || canvasHeight === 0) {
|
|
6
|
+
return {
|
|
7
|
+
scaledWidth: 0,
|
|
8
|
+
scaledHeight: 0,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const scale = canvasHeight / naturalHeight;
|
|
12
|
+
return {
|
|
13
|
+
scaledWidth: naturalWidth * scale,
|
|
14
|
+
scaledHeight: canvasHeight,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.getScaledImageThumbnailDimensions = getScaledImageThumbnailDimensions;
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export { loadWaveformPeaks } from './audio-waveform/load-waveform-peaks';
|
|
|
5
5
|
export { makeAudioWaveformWorker } from './audio-waveform/make-audio-waveform-worker';
|
|
6
6
|
export { sliceWaveformPeaks } from './audio-waveform/slice-waveform-peaks';
|
|
7
7
|
export { createWaveformPeakProcessor, emitWaveformProgress, } from './audio-waveform/waveform-peak-processor';
|
|
8
|
+
export { drawRepeatingImageThumbnail } from './image-thumbnail/draw-repeating-image-thumbnail';
|
|
9
|
+
export { getScaledImageThumbnailDimensions } from './image-thumbnail/get-scaled-image-thumbnail-dimensions';
|
|
8
10
|
export { extractFrames } from './extract-frames';
|
|
9
11
|
export type { ExtractFramesProps, ExtractFramesTimestampsInSecondsFn, } from './extract-frames';
|
|
10
12
|
export { addFrameToCache, aspectRatioCache, frameDatabase, getAspectRatioFromCache, getFrameDatabaseKeyPrefix, getTimestampFromFrameDatabaseKey, makeFrameDatabaseKey, } from './frame-database';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resizeVideoFrame = exports.WEBCODECS_TIMESCALE = exports.getDurationOfOneFrame = exports.fillWithCachedFrames = exports.fillFrameWhereItFits = exports.ensureSlots = exports.drawSlot = exports.calculateTimestampSlots = exports.shouldTileLoopDisplay = exports.getLoopDisplayWidth = exports.makeFrameDatabaseKey = exports.getTimestampFromFrameDatabaseKey = exports.getFrameDatabaseKeyPrefix = exports.getAspectRatioFromCache = exports.frameDatabase = exports.aspectRatioCache = exports.addFrameToCache = exports.extractFrames = exports.emitWaveformProgress = exports.createWaveformPeakProcessor = exports.sliceWaveformPeaks = exports.makeAudioWaveformWorker = exports.loadWaveformPeaks = exports.drawBars = exports.TARGET_SAMPLE_RATE = void 0;
|
|
3
|
+
exports.resizeVideoFrame = exports.WEBCODECS_TIMESCALE = exports.getDurationOfOneFrame = exports.fillWithCachedFrames = exports.fillFrameWhereItFits = exports.ensureSlots = exports.drawSlot = exports.calculateTimestampSlots = exports.shouldTileLoopDisplay = exports.getLoopDisplayWidth = exports.makeFrameDatabaseKey = exports.getTimestampFromFrameDatabaseKey = exports.getFrameDatabaseKeyPrefix = exports.getAspectRatioFromCache = exports.frameDatabase = exports.aspectRatioCache = exports.addFrameToCache = exports.extractFrames = exports.getScaledImageThumbnailDimensions = exports.drawRepeatingImageThumbnail = exports.emitWaveformProgress = exports.createWaveformPeakProcessor = exports.sliceWaveformPeaks = exports.makeAudioWaveformWorker = exports.loadWaveformPeaks = exports.drawBars = exports.TARGET_SAMPLE_RATE = void 0;
|
|
4
4
|
const constants_1 = require("./audio-waveform/constants");
|
|
5
5
|
Object.defineProperty(exports, "TARGET_SAMPLE_RATE", { enumerable: true, get: function () { return constants_1.TARGET_SAMPLE_RATE; } });
|
|
6
6
|
const draw_peaks_1 = require("./audio-waveform/draw-peaks");
|
|
@@ -14,6 +14,10 @@ Object.defineProperty(exports, "sliceWaveformPeaks", { enumerable: true, get: fu
|
|
|
14
14
|
const waveform_peak_processor_1 = require("./audio-waveform/waveform-peak-processor");
|
|
15
15
|
Object.defineProperty(exports, "createWaveformPeakProcessor", { enumerable: true, get: function () { return waveform_peak_processor_1.createWaveformPeakProcessor; } });
|
|
16
16
|
Object.defineProperty(exports, "emitWaveformProgress", { enumerable: true, get: function () { return waveform_peak_processor_1.emitWaveformProgress; } });
|
|
17
|
+
const draw_repeating_image_thumbnail_1 = require("./image-thumbnail/draw-repeating-image-thumbnail");
|
|
18
|
+
Object.defineProperty(exports, "drawRepeatingImageThumbnail", { enumerable: true, get: function () { return draw_repeating_image_thumbnail_1.drawRepeatingImageThumbnail; } });
|
|
19
|
+
const get_scaled_image_thumbnail_dimensions_1 = require("./image-thumbnail/get-scaled-image-thumbnail-dimensions");
|
|
20
|
+
Object.defineProperty(exports, "getScaledImageThumbnailDimensions", { enumerable: true, get: function () { return get_scaled_image_thumbnail_dimensions_1.getScaledImageThumbnailDimensions; } });
|
|
17
21
|
const extract_frames_1 = require("./extract-frames");
|
|
18
22
|
Object.defineProperty(exports, "extractFrames", { enumerable: true, get: function () { return extract_frames_1.extractFrames; } });
|
|
19
23
|
const frame_database_1 = require("./frame-database");
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/timeline-utils"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/timeline-utils",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.465",
|
|
7
7
|
"description": "Internal utilities for rendering Remotion timelines",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"scripts": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@mediabunny/server": "1.45.0",
|
|
28
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
28
|
+
"@remotion/eslint-config-internal": "4.0.465",
|
|
29
29
|
"eslint": "9.19.0",
|
|
30
30
|
"@typescript/native-preview": "7.0.0-dev.20260217.1"
|
|
31
31
|
},
|