@pixerate/editor 0.230.0 → 0.231.1
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/{chunk-A57ZQDNN.cjs → chunk-5T3H7CGG.cjs} +14 -4
- package/dist/{chunk-ONNNNGNS.js → chunk-CSM5T6SE.js} +13 -3
- package/dist/image-editor/controller.d.cts +12 -0
- package/dist/image-editor/controller.d.ts +12 -0
- package/dist/image-editor/index.cjs +176 -131
- package/dist/image-editor/index.js +47 -2
- package/dist/paint-editor/index.cjs +2 -2
- package/dist/paint-editor/index.js +1 -1
- package/dist/video-editor/camera-tools.d.cts +10 -0
- package/dist/video-editor/camera-tools.d.ts +10 -0
- package/dist/video-editor/camera.d.cts +47 -0
- package/dist/video-editor/camera.d.ts +47 -0
- package/dist/video-editor/check.d.cts +1 -1
- package/dist/video-editor/check.d.ts +1 -1
- package/dist/video-editor/controller.d.cts +37 -2
- package/dist/video-editor/controller.d.ts +37 -2
- package/dist/video-editor/effect-tools.d.cts +2 -1
- package/dist/video-editor/effect-tools.d.ts +2 -1
- package/dist/video-editor/index.cjs +690 -375
- package/dist/video-editor/index.d.cts +2 -0
- package/dist/video-editor/index.d.ts +2 -0
- package/dist/video-editor/index.js +331 -16
- package/dist/video-editor/keyframes.d.cts +10 -3
- package/dist/video-editor/keyframes.d.ts +10 -3
- package/dist/video-editor/parse.d.cts +5 -3
- package/dist/video-editor/parse.d.ts +5 -3
- package/dist/video-editor/tools.d.cts +18 -0
- package/dist/video-editor/tools.d.ts +18 -0
- package/dist/video-editor/types.d.cts +37 -1
- package/dist/video-editor/types.d.ts +37 -1
- package/package.json +1 -1
|
@@ -155,11 +155,20 @@ var withEase = (key, ease) => {
|
|
|
155
155
|
const { ease: _old, ...rest } = key;
|
|
156
156
|
return ease === void 0 || ease === "linear" ? rest : { ...rest, ease };
|
|
157
157
|
};
|
|
158
|
-
function sortVideoKeys(keys) {
|
|
158
|
+
function sortVideoKeys(keys, options = {}) {
|
|
159
159
|
const sorted = [...keys].sort((a, b) => a.t - b.t);
|
|
160
|
-
|
|
160
|
+
const problem = videoKeyTimesProblem(sorted, options.jumps !== false);
|
|
161
|
+
if (problem) throw new Error(problem);
|
|
161
162
|
return sorted;
|
|
162
163
|
}
|
|
164
|
+
function videoKeyTimesProblem(keys, jumps = true) {
|
|
165
|
+
for (let i = 1; i < keys.length; i++) {
|
|
166
|
+
if (Math.abs(keys[i].t - keys[i - 1].t) >= 1e-6) continue;
|
|
167
|
+
if (!jumps) return `Two keys are at ${keys[i].t} ms; give each key its own time.`;
|
|
168
|
+
if (i >= 2 && Math.abs(keys[i].t - keys[i - 2].t) < 1e-6) return `Three keys are at ${keys[i].t} ms; a time takes one key, or two for a jump (the value just before, then the value after).`;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
163
172
|
function setVideoKey(prop, key, fallback) {
|
|
164
173
|
const keys = isVideoKeyframes(prop) ? prop.keys.filter((k) => Math.abs(k.t - key.t) >= 1e-6) : [];
|
|
165
174
|
if (!isVideoKeyframes(prop)) {
|
|
@@ -207,7 +216,7 @@ function videoKeyframeFfmpegExpr(prop, time, fallback, step) {
|
|
|
207
216
|
for (let i = points.length - 2; i >= 0; i--) {
|
|
208
217
|
const [t0, v0] = points[i];
|
|
209
218
|
const [t1, v1] = points[i + 1];
|
|
210
|
-
const seg = holds.has(i) || v0 === v1 ? fmt(v0) : `${fmt(v0)}${signed((v1 - v0) / (t1 - t0))}*(${time}${signed(-t0)})`;
|
|
219
|
+
const seg = holds.has(i) || v0 === v1 || t1 <= t0 ? fmt(v0) : `${fmt(v0)}${signed((v1 - v0) / (t1 - t0))}*(${time}${signed(-t0)})`;
|
|
211
220
|
expr = `if(lt(${time},${fmt(t1)}),${seg},${expr})`;
|
|
212
221
|
}
|
|
213
222
|
return `if(lt(${time},${fmt(points[0][0])}),${fmt(points[0][1])},${expr})`;
|
|
@@ -2610,4 +2619,5 @@ function buildFfmpeg(project, options, measure) {
|
|
|
2610
2619
|
|
|
2611
2620
|
|
|
2612
2621
|
|
|
2613
|
-
|
|
2622
|
+
|
|
2623
|
+
exports.VIDEO_FITS = VIDEO_FITS; exports.VIDEO_TRANSITION_TYPES = VIDEO_TRANSITION_TYPES; exports.VIDEO_WIPE_DIRECTIONS = VIDEO_WIPE_DIRECTIONS; exports.videoTransitionAudioCurve = videoTransitionAudioCurve; exports.VIDEO_BLEND_MODES = VIDEO_BLEND_MODES; exports.VIDEO_CLIP_ANIMATION_EFFECTS = VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_MASK_SHAPES = VIDEO_MASK_SHAPES; exports.VIDEO_FADE_CURVES = VIDEO_FADE_CURVES; exports.VIDEO_ADJUSTMENT_SCOPES = VIDEO_ADJUSTMENT_SCOPES; exports.VIDEO_PLACEMENT_MODES = VIDEO_PLACEMENT_MODES; exports.VIDEO_CLIP_TYPES = VIDEO_CLIP_TYPES; exports.VIDEO_EASE_NAMES = VIDEO_EASE_NAMES; exports.VIDEO_KEYFRAME_PROPERTIES = VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_TRANSFORM_PROPERTIES = VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_KEYFRAME_LIMITS = VIDEO_KEYFRAME_LIMITS; exports.isVideoKeyframes = isVideoKeyframes; exports.videoEaseBezier = videoEaseBezier; exports.videoEaseProgress = videoEaseProgress; exports.videoValueAt = videoValueAt; exports.videoKeysOf = videoKeysOf; exports.retimeVideoAnimatable = retimeVideoAnimatable; exports.splitVideoAnimatable = splitVideoAnimatable; exports.sortVideoKeys = sortVideoKeys; exports.videoKeyTimesProblem = videoKeyTimesProblem; exports.setVideoKey = setVideoKey; exports.removeVideoKey = removeVideoKey; exports.videoKeyframeBreakpoints = videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = videoKeyframeFfmpegExpr; exports.VIDEO_LUT_MAX_SIZE = VIDEO_LUT_MAX_SIZE; exports.parseVideoCubeLut = parseVideoCubeLut; exports.videoLutFromFunction = videoLutFromFunction; exports.videoLutToCube = videoLutToCube; exports.applyVideoLut = applyVideoLut; exports.videoSkinToneWeight = videoSkinToneWeight; exports.applyVideoLutToPixels = applyVideoLutToPixels; exports.videoLutSvgApproximation = videoLutSvgApproximation; exports.VideoLutCache = VideoLutCache; exports.VIDEO_GRADE_CONTROLS = VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = VIDEO_GRADE_PRESET_NAMES; exports.normalizeVideoGradeLut = normalizeVideoGradeLut; exports.normalizeVideoGrade = normalizeVideoGrade; exports.videoGradePreset = videoGradePreset; exports.videoGradeLook = videoGradeLook; exports.videoGradeSteps = videoGradeSteps; exports.videoGradeStepMatrix = videoGradeStepMatrix; exports.applyVideoGrade = applyVideoGrade; exports.videoGradeStepSvgValues = videoGradeStepSvgValues; exports.videoLutSvgPrimitives = videoLutSvgPrimitives; exports.videoGradeSvgFilter = videoGradeSvgFilter; exports.videoGradeGainsFilterId = videoGradeGainsFilterId; exports.videoGradeCssFilter = videoGradeCssFilter; exports.videoGradeSvgDefs = videoGradeSvgDefs; exports.videoGradeFfmpegFilters = videoGradeFfmpegFilters; exports.videoClipSourceTime = videoClipSourceTime; exports.videoClipSpeedAt = videoClipSpeedAt; exports.videoSpeedRampKeys = videoSpeedRampKeys; exports.checkVideoTimeRemap = checkVideoTimeRemap; exports.videoTimeRemapSpan = videoTimeRemapSpan; exports.videoTimeRemapBreakpoints = videoTimeRemapBreakpoints; exports.videoSpeedRampEdit = videoSpeedRampEdit; exports.videoFreezeFrameEdit = videoFreezeFrameEdit; exports.videoSlowMotionRamp = videoSlowMotionRamp; exports.VIDEO_TIME_EPSILON = VIDEO_TIME_EPSILON; exports.videoClipEnd = videoClipEnd; exports.videoClipTypeLabel = videoClipTypeLabel; exports.videoTrackSyncLocked = videoTrackSyncLocked; exports.videoClipSpeed = videoClipSpeed; exports.videoClipSourceRange = videoClipSourceRange; exports.videoFrameDuration = videoFrameDuration; exports.snapToVideoFrame = snapToVideoFrame; exports.videoFrames = videoFrames; exports.isVideoDropFrameRate = isVideoDropFrameRate; exports.videoTimecodeFrames = videoTimecodeFrames; exports.formatVideoTimecode = formatVideoTimecode; exports.formatVideoTimecodeFrames = formatVideoTimecodeFrames; exports.videoHourFrames = videoHourFrames; exports.formatVideoSeconds = formatVideoSeconds; exports.videoAssetHasSound = videoAssetHasSound; exports.videoAssetMap = videoAssetMap; exports.videoSequenceMap = videoSequenceMap; exports.videoSequenceDuration = videoSequenceDuration; exports.videoSequenceChildren = videoSequenceChildren; exports.findVideoSequenceCycle = findVideoSequenceCycle; exports.allVideoTracks = allVideoTracks; exports.sortedVideoClips = sortedVideoClips; exports.findVideoClip = findVideoClip; exports.allVideoClipIds = allVideoClipIds; exports.findVideoSequenceClip = findVideoSequenceClip; exports.videoProjectDuration = videoProjectDuration; exports.videoClipBefore = videoClipBefore; exports.videoClipAfter = videoClipAfter; exports.videoClipHandles = videoClipHandles; exports.videoClipOverhang = videoClipOverhang; exports.videoSnapPoints = videoSnapPoints; exports.snapVideoTime = snapVideoTime; exports.findVideoGaps = findVideoGaps; exports.videoOverlap = videoOverlap; exports.nextFreeVideoSlot = nextFreeVideoSlot; exports.videoClipsAt = videoClipsAt; exports.VIDEO_CLIP_ANIMATION_DURATION = VIDEO_CLIP_ANIMATION_DURATION; exports.videoClipAnimationProperties = videoClipAnimationProperties; exports.videoClipAnimationSpans = videoClipAnimationSpans; exports.videoClipAnimated = videoClipAnimated; exports.VIDEO_MASK_DEFAULTS = VIDEO_MASK_DEFAULTS; exports.normalizeVideoClipMask = normalizeVideoClipMask; exports.videoMaskPolygon = videoMaskPolygon; exports.videoLayerMask = videoLayerMask; exports.videoMaskSvgPath = videoMaskSvgPath; exports.videoMaskContains = videoMaskContains; exports.videoEffectValuesAt = videoEffectValuesAt; exports.videoTransformAt = videoTransformAt; exports.placeVideoRect = placeVideoRect; exports.videoTextStyle = videoTextStyle; exports.videoTitleFrame = videoTitleFrame; exports.videoTransitionEase = videoTransitionEase; exports.videoFadeCurveGain = videoFadeCurveGain; exports.videoClipSoundGain = videoClipSoundGain; exports.videoFrameAt = videoFrameAt; exports.videoLayersWithoutTransitionEffects = videoLayersWithoutTransitionEffects; exports.videoFrameLeafLayers = videoFrameLeafLayers; exports.videoProjectEffects = videoProjectEffects; exports.videoClipEffectUses = videoClipEffectUses; exports.videoLayersUseEffects = videoLayersUseEffects; exports.videoEffectFrameTime = videoEffectFrameTime; exports.videoEffectLayerKey = videoEffectLayerKey; exports.mixEffectPixels = mixEffectPixels; exports.overEffectPixels = overEffectPixels; exports.VideoEffectsEngine = VideoEffectsEngine; exports.VIDEO_EFFECT_PLACES = VIDEO_EFFECT_PLACES; exports.checkVideoEffectPlace = checkVideoEffectPlace; exports.checkVideoEffectValues = checkVideoEffectValues; exports.videoIrisRadius = videoIrisRadius; exports.videoWipeRect = videoWipeRect; exports.videoFrameToSvg = videoFrameToSvg; exports.videoProjectSvg = videoProjectSvg; exports.videoContactSheetSvg = videoContactSheetSvg; exports.drawVideoFrame = drawVideoFrame; exports.renderVideoFrameExact = renderVideoFrameExact; exports.toVideoEdl = toVideoEdl; exports.videoFfmpegUnsupportedEffects = videoFfmpegUnsupportedEffects; exports.videoFfmpegUnsupportedFeatures = videoFfmpegUnsupportedFeatures; exports.parseVideoLoudnessMeasurement = parseVideoLoudnessMeasurement; exports.ffmpegFilterValue = ffmpegFilterValue; exports.videoShellQuote = videoShellQuote; exports.toVideoFfmpeg = toVideoFfmpeg; exports.toVideoLoudnessMeasure = toVideoLoudnessMeasure;
|
|
@@ -155,11 +155,20 @@ var withEase = (key, ease) => {
|
|
|
155
155
|
const { ease: _old, ...rest } = key;
|
|
156
156
|
return ease === void 0 || ease === "linear" ? rest : { ...rest, ease };
|
|
157
157
|
};
|
|
158
|
-
function sortVideoKeys(keys) {
|
|
158
|
+
function sortVideoKeys(keys, options = {}) {
|
|
159
159
|
const sorted = [...keys].sort((a, b) => a.t - b.t);
|
|
160
|
-
|
|
160
|
+
const problem = videoKeyTimesProblem(sorted, options.jumps !== false);
|
|
161
|
+
if (problem) throw new Error(problem);
|
|
161
162
|
return sorted;
|
|
162
163
|
}
|
|
164
|
+
function videoKeyTimesProblem(keys, jumps = true) {
|
|
165
|
+
for (let i = 1; i < keys.length; i++) {
|
|
166
|
+
if (Math.abs(keys[i].t - keys[i - 1].t) >= 1e-6) continue;
|
|
167
|
+
if (!jumps) return `Two keys are at ${keys[i].t} ms; give each key its own time.`;
|
|
168
|
+
if (i >= 2 && Math.abs(keys[i].t - keys[i - 2].t) < 1e-6) return `Three keys are at ${keys[i].t} ms; a time takes one key, or two for a jump (the value just before, then the value after).`;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
163
172
|
function setVideoKey(prop, key, fallback) {
|
|
164
173
|
const keys = isVideoKeyframes(prop) ? prop.keys.filter((k) => Math.abs(k.t - key.t) >= 1e-6) : [];
|
|
165
174
|
if (!isVideoKeyframes(prop)) {
|
|
@@ -207,7 +216,7 @@ function videoKeyframeFfmpegExpr(prop, time, fallback, step) {
|
|
|
207
216
|
for (let i = points.length - 2; i >= 0; i--) {
|
|
208
217
|
const [t0, v0] = points[i];
|
|
209
218
|
const [t1, v1] = points[i + 1];
|
|
210
|
-
const seg = holds.has(i) || v0 === v1 ? fmt(v0) : `${fmt(v0)}${signed((v1 - v0) / (t1 - t0))}*(${time}${signed(-t0)})`;
|
|
219
|
+
const seg = holds.has(i) || v0 === v1 || t1 <= t0 ? fmt(v0) : `${fmt(v0)}${signed((v1 - v0) / (t1 - t0))}*(${time}${signed(-t0)})`;
|
|
211
220
|
expr = `if(lt(${time},${fmt(t1)}),${seg},${expr})`;
|
|
212
221
|
}
|
|
213
222
|
return `if(lt(${time},${fmt(points[0][0])}),${fmt(points[0][1])},${expr})`;
|
|
@@ -2487,6 +2496,7 @@ export {
|
|
|
2487
2496
|
retimeVideoAnimatable,
|
|
2488
2497
|
splitVideoAnimatable,
|
|
2489
2498
|
sortVideoKeys,
|
|
2499
|
+
videoKeyTimesProblem,
|
|
2490
2500
|
setVideoKey,
|
|
2491
2501
|
removeVideoKey,
|
|
2492
2502
|
videoKeyframeBreakpoints,
|
|
@@ -1023,6 +1023,18 @@ export declare class ImageEditorController {
|
|
|
1023
1023
|
* non-pixel layer, or when the layer is completely transparent.
|
|
1024
1024
|
*/
|
|
1025
1025
|
getLayerDataURL(id: string): string | null;
|
|
1026
|
+
private maskedImageCache;
|
|
1027
|
+
/**
|
|
1028
|
+
* A pixel layer's own pixels with its raster and vector masks applied, cropped to what shows: a
|
|
1029
|
+
* PNG data URL and its document bounds, or `null` for an unknown or non-pixel layer, or when
|
|
1030
|
+
* nothing shows. Opacity, blending, filters and effects are left out, as in `getLayerDataURL`.
|
|
1031
|
+
* Use it for a masked layer, whose stored pixels (a whole copy, for Separate Subject's subject)
|
|
1032
|
+
* are not what it shows.
|
|
1033
|
+
*/
|
|
1034
|
+
getMaskedLayerImage(id: string): {
|
|
1035
|
+
url: string;
|
|
1036
|
+
bounds: CropBox;
|
|
1037
|
+
} | null;
|
|
1026
1038
|
/**
|
|
1027
1039
|
* Composites the layer stack in document space without a canvas (annotation layers need one
|
|
1028
1040
|
* and are left out): `rect` (default: the canvas) as RGBA, straight alpha. Crop, rotation and
|
|
@@ -1023,6 +1023,18 @@ export declare class ImageEditorController {
|
|
|
1023
1023
|
* non-pixel layer, or when the layer is completely transparent.
|
|
1024
1024
|
*/
|
|
1025
1025
|
getLayerDataURL(id: string): string | null;
|
|
1026
|
+
private maskedImageCache;
|
|
1027
|
+
/**
|
|
1028
|
+
* A pixel layer's own pixels with its raster and vector masks applied, cropped to what shows: a
|
|
1029
|
+
* PNG data URL and its document bounds, or `null` for an unknown or non-pixel layer, or when
|
|
1030
|
+
* nothing shows. Opacity, blending, filters and effects are left out, as in `getLayerDataURL`.
|
|
1031
|
+
* Use it for a masked layer, whose stored pixels (a whole copy, for Separate Subject's subject)
|
|
1032
|
+
* are not what it shows.
|
|
1033
|
+
*/
|
|
1034
|
+
getMaskedLayerImage(id: string): {
|
|
1035
|
+
url: string;
|
|
1036
|
+
bounds: CropBox;
|
|
1037
|
+
} | null;
|
|
1026
1038
|
/**
|
|
1027
1039
|
* Composites the layer stack in document space without a canvas (annotation layers need one
|
|
1028
1040
|
* and are left out): `rect` (default: the canvas) as RGBA, straight alpha. Crop, rotation and
|