@haiku/player
Version:
Haiku Player is a JavaScript library for building user interfaces
150 lines • 5.27 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var just_curves_1 = require("./vendor/just-curves");
var CENT = 1.0;
var OBJECT = 'object';
var NUMBER = 'number';
var KEYFRAME_ZERO = 0;
var KEYFRAME_MARGIN = 16.666;
var STRING = 'string';
function percentOfTime(t0, t1, tnow) {
var span = t1 - t0;
if (span === 0) {
return CENT;
}
var remaining = t1 - tnow;
return CENT - remaining / span;
}
function valueAtPercent(v0, v1, pc) {
var span = v1 - v0;
var gain = span * pc;
return v0 + gain;
}
function valueAtTime(v0, v1, t0, t1, tnow) {
var pc = percentOfTime(t0, t1, tnow);
return valueAtPercent(v0, v1, pc);
}
function interpolateValue(v0, v1, t0, t1, tnow, curve) {
var pc = percentOfTime(t0, t1, tnow);
if (pc > CENT) {
pc = CENT;
}
if (curve) {
pc = curve(pc);
}
return valueAtPercent(v0, v1, pc);
}
function interpolate(now, curve, started, ends, origin, destination) {
if (Array.isArray(origin) && Array.isArray(destination)) {
var arrayOutput = [];
for (var i = 0; i < origin.length; i++) {
arrayOutput[i] = interpolate(now, curve, started, ends, origin[i], destination[i]);
}
return arrayOutput;
}
if (origin && typeof origin === OBJECT && destination && typeof destination === OBJECT) {
var objectOutput = {};
for (var key in origin) {
objectOutput[key] = interpolate(now, curve, started, ends, origin[key], destination[key]);
}
return objectOutput;
}
if (typeof origin === NUMBER && typeof destination === NUMBER) {
return interpolateValue(origin, destination, started, ends, now, curve);
}
return origin;
}
function ascendingSort(a, b) {
return a - b;
}
function numberize(n) {
return parseInt(n, 10);
}
function sortedKeyframes(keyframeGroup) {
if (keyframeGroup.__sorted) {
return keyframeGroup.__sorted;
}
var keys = Object.keys(keyframeGroup);
var sorted = keys.sort(ascendingSort).map(numberize);
keyframeGroup.__sorted = sorted;
return keyframeGroup.__sorted;
}
function getKeyframesList(keyframeGroup, nowValue) {
var sorted = sortedKeyframes(keyframeGroup);
for (var i = 0; i < sorted.length; i++) {
var j = i + 1;
var current = sorted[i];
var next = sorted[j];
if (current <= nowValue) {
if (next > nowValue) {
return [current, next];
}
if (j >= sorted.length) {
return [current];
}
}
}
}
function calculateValue(keyframeGroup, nowValue) {
if (!keyframeGroup[KEYFRAME_ZERO]) {
keyframeGroup[KEYFRAME_ZERO] = {};
}
var keyframesList = getKeyframesList(keyframeGroup, nowValue);
if (!keyframesList || keyframesList.length < 1) {
return;
}
var currentKeyframe = keyframesList[0];
var currentTransition = keyframeGroup[currentKeyframe];
var nextKeyframe = keyframesList[1];
var nextTransition = keyframeGroup[nextKeyframe];
var finalValue = getTransitionValue(currentKeyframe, currentTransition, nextKeyframe, nextTransition, nowValue);
return finalValue;
}
function calculateValueAndReturnUndefinedIfNotWorthwhile(keyframeGroup, nowValue) {
if (!keyframeGroup[KEYFRAME_ZERO]) {
keyframeGroup[KEYFRAME_ZERO] = {};
}
var keyframesList = getKeyframesList(keyframeGroup, nowValue);
if (!keyframesList || keyframesList.length < 1) {
return void 0;
}
var currentKeyframe = keyframesList[0];
var nextKeyframe = keyframesList[1];
var currentTransition = keyframeGroup[currentKeyframe];
var nextTransition = keyframeGroup[nextKeyframe];
if ((currentTransition && currentTransition.machine) ||
(nextTransition && nextTransition.machine)) {
return getTransitionValue(currentKeyframe, currentTransition, nextKeyframe, nextTransition, nowValue);
}
if (nextKeyframe === undefined) {
if (nowValue <= currentKeyframe + KEYFRAME_MARGIN) {
return getTransitionValue(currentKeyframe, currentTransition, nextKeyframe, nextTransition, nowValue);
}
return void 0;
}
if (nowValue <= nextKeyframe + KEYFRAME_MARGIN) {
return getTransitionValue(currentKeyframe, currentTransition, nextKeyframe, nextTransition, nowValue);
}
return void 0;
}
function getTransitionValue(currentKeyframe, currentTransition, nextKeyframe, nextTransition, nowValue) {
var currentValue = currentTransition.value;
if (!currentTransition.curve) {
return currentValue;
}
if (!nextTransition) {
return currentValue;
}
var currentCurve = currentTransition.curve;
if (typeof currentCurve === STRING) {
currentCurve = just_curves_1.default[currentCurve];
}
var nextValue = nextTransition.value;
var finalValue = interpolate(nowValue, currentCurve, currentKeyframe, nextKeyframe, currentValue, nextValue);
return finalValue;
}
exports.default = {
calculateValue: calculateValue,
calculateValueAndReturnUndefinedIfNotWorthwhile: calculateValueAndReturnUndefinedIfNotWorthwhile,
};
//# sourceMappingURL=Transitions.js.map