@remotion/timeline-utils 4.0.463 → 4.0.464

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.
@@ -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.463",
6
+ "version": "4.0.464",
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.463",
28
+ "@remotion/eslint-config-internal": "4.0.464",
29
29
  "eslint": "9.19.0",
30
30
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
31
31
  },