"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Animation = void 0; const Global_1 = require("./Global"); const Util_1 = require("./Util"); const now = (function () { if (Global_1.glob.performance && Global_1.glob.performance.now) { return function () { return Global_1.glob.performance.now(); }; } return function () { return new Date().getTime(); }; })(); class Animation { constructor(func, layers) { this.id = Animation.animIdCounter++; this.frame = { time: 0, timeDiff: 0, lastTime: now(), frameRate: 0, }; this.func = func; this.setLayers(layers); } setLayers(layers) { let lays = []; if (layers) { lays = Array.isArray(layers) ? layers : [layers]; } this.layers = lays; return this; } getLayers() { return this.layers; } addLayer(layer) { const layers = this.layers; const len = layers.length; for (let n = 0; n < len; n++) { if (layers[n]._id === layer._id) { return false; } } this.layers.push(layer); return true; } isRunning() { const a = Animation; const animations = a.animations; const len = animations.length; for (let n = 0; n < len; n++) { if (animations[n].id === this.id) { return true; } } return false; } start() { this.stop(); this.frame.timeDiff = 0; this.frame.lastTime = now(); Animation._addAnimation(this); return this; } stop() { Animation._removeAnimation(this); return this; } _updateFrameObject(time) { this.frame.timeDiff = time - this.frame.lastTime; this.frame.lastTime = time; this.frame.time += this.frame.timeDiff; this.frame.frameRate = 1000 / this.frame.timeDiff; } static _addAnimation(anim) { this.animations.push(anim); this._handleAnimation(); } static _removeAnimation(anim) { const id = anim.id; const animations = this.animations; const len = animations.length; for (let n = 0; n < len; n++) { if (animations[n].id === id) { this.animations.splice(n, 1); break; } } } static _runFrames() { const layerHash = {}; const animations = this.animations; for (let n = 0; n < animations.length; n++) { const anim = animations[n]; const layers = anim.layers; const func = anim.func; anim._updateFrameObject(now()); const layersLen = layers.length; let needRedraw; if (func) { needRedraw = func.call(anim, anim.frame) !== false; } else { needRedraw = true; } if (!needRedraw) { continue; } for (let i = 0; i < layersLen; i++) { const layer = layers[i]; if (layer._id !== undefined) { layerHash[layer._id] = layer; } } } for (let key in layerHash) { if (!layerHash.hasOwnProperty(key)) { continue; } layerHash[key].batchDraw(); } } static _animationLoop() { const Anim = Animation; if (Anim.animations.length) { Anim._runFrames(); Util_1.Util.requestAnimFrame(Anim._animationLoop); } else { Anim.animRunning = false; } } static _handleAnimation() { if (!this.animRunning) { this.animRunning = true; Util_1.Util.requestAnimFrame(this._animationLoop); } } } exports.Animation = Animation; Animation.animations = []; Animation.animIdCounter = 0; Animation.animRunning = false;