UNPKG

bodymovin

Version:

After Effects plugin for exporting animations to SVG + JavaScript or canvas + JavaScript

342 lines (300 loc) 8.68 kB
var subframeEnabled = true; var expressionsPlugin; var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); var cachedColors = {}; var bm_rounder = Math.round; var bm_rnd; var bm_pow = Math.pow; var bm_sqrt = Math.sqrt; var bm_abs = Math.abs; var bm_floor = Math.floor; var bm_max = Math.max; var bm_min = Math.min; var blitter = 10; var BMMath = {}; (function(){ var propertyNames = Object.getOwnPropertyNames(Math); var i, len = propertyNames.length; for(i=0;i<len;i+=1){ BMMath[propertyNames[i]] = Math[propertyNames[i]]; } }()); function ProjectInterface(){return {}}; BMMath.random = Math.random; BMMath.abs = function(val){ var tOfVal = typeof val; if(tOfVal === 'object' && val.length){ var absArr = Array.apply(null,{length:val.length}); var i, len = val.length; for(i=0;i<len;i+=1){ absArr[i] = Math.abs(val[i]); } return absArr; } return Math.abs(val); } var defaultCurveSegments = 150; var degToRads = Math.PI/180; var roundCorner = 0.5519; function roundValues(flag){ if(flag){ bm_rnd = Math.round; }else{ bm_rnd = function(val){ return val; }; } } roundValues(false); function roundTo2Decimals(val){ return Math.round(val*10000)/10000; } function roundTo3Decimals(val){ return Math.round(val*100)/100; } function styleDiv(element){ element.style.position = 'absolute'; element.style.top = 0; element.style.left = 0; element.style.display = 'block'; element.style.transformOrigin = element.style.webkitTransformOrigin = '0 0'; element.style.backfaceVisibility = element.style.webkitBackfaceVisibility = 'visible'; element.style.transformStyle = element.style.webkitTransformStyle = element.style.mozTransformStyle = "preserve-3d"; } function styleUnselectableDiv(element){ element.style.userSelect = 'none'; element.style.MozUserSelect = 'none'; element.style.webkitUserSelect = 'none'; element.style.oUserSelect = 'none'; } function BMEnterFrameEvent(n,c,t,d){ this.type = n; this.currentTime = c; this.totalTime = t; this.direction = d < 0 ? -1:1; } function BMCompleteEvent(n,d){ this.type = n; this.direction = d < 0 ? -1:1; } function BMCompleteLoopEvent(n,c,t,d){ this.type = n; this.currentLoop = c; this.totalLoops = t; this.direction = d < 0 ? -1:1; } function BMSegmentStartEvent(n,f,t){ this.type = n; this.firstFrame = f; this.totalFrames = t; } function BMDestroyEvent(n,t){ this.type = n; this.target = t; } function _addEventListener(eventName, callback){ if (!this._cbs[eventName]){ this._cbs[eventName] = []; } this._cbs[eventName].push(callback); return function() { this.removeEventListener(eventName, callback); }.bind(this); } function _removeEventListener(eventName,callback){ if (!callback){ this._cbs[eventName] = null; }else if(this._cbs[eventName]){ var i = 0, len = this._cbs[eventName].length; while(i<len){ if(this._cbs[eventName][i] === callback){ this._cbs[eventName].splice(i,1); i -=1; len -= 1; } i += 1; } if(!this._cbs[eventName].length){ this._cbs[eventName] = null; } } } function _triggerEvent(eventName, args){ if (this._cbs[eventName]) { var len = this._cbs[eventName].length; for (var i = 0; i < len; i++){ this._cbs[eventName][i](args); } } } function randomString(length, chars){ if(chars === undefined){ chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; } var i; var result = ''; for (i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))]; return result; } function HSVtoRGB(h, s, v) { var r, g, b, i, f, p, q, t; if (arguments.length === 1) { s = h.s, v = h.v, h = h.h; } i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return [ r, g, b ]; } function RGBtoHSV(r, g, b) { if (arguments.length === 1) { g = r.g, b = r.b, r = r.r; } var max = Math.max(r, g, b), min = Math.min(r, g, b), d = max - min, h, s = (max === 0 ? 0 : d / max), v = max / 255; switch (max) { case min: h = 0; break; case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break; case g: h = (b - r) + d * 2; h /= 6 * d; break; case b: h = (r - g) + d * 4; h /= 6 * d; break; } return [ h, s, v ]; } function addSaturationToRGB(color,offset){ var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255); hsv[1] += offset; if (hsv[1] > 1) { hsv[1] = 1; } else if (hsv[1] <= 0) { hsv[1] = 0; } return HSVtoRGB(hsv[0],hsv[1],hsv[2]); } function addBrightnessToRGB(color,offset){ var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255); hsv[2] += offset; if (hsv[2] > 1) { hsv[2] = 1; } else if (hsv[2] < 0) { hsv[2] = 0; } return HSVtoRGB(hsv[0],hsv[1],hsv[2]); } function addHueToRGB(color,offset) { var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255); hsv[0] += offset/360; if (hsv[0] > 1) { hsv[0] -= 1; } else if (hsv[0] < 0) { hsv[0] += 1; } return HSVtoRGB(hsv[0],hsv[1],hsv[2]); } function componentToHex(c) { var hex = c.toString(16); return hex.length == 1 ? '0' + hex : hex; } var rgbToHex = (function(){ var colorMap = []; var i; var hex; for(i=0;i<256;i+=1){ hex = i.toString(16); colorMap[i] = hex.length == 1 ? '0' + hex : hex; } return function(r, g, b) { if(r<0){ r = 0; } if(g<0){ g = 0; } if(b<0){ b = 0; } return '#' + colorMap[r] + colorMap[g] + colorMap[b]; }; }()); function fillToRgba(hex,alpha){ if(!cachedColors[hex]){ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); cachedColors[hex] = parseInt(result[1], 16)+','+parseInt(result[2], 16)+','+parseInt(result[3], 16); } return 'rgba('+cachedColors[hex]+','+alpha+')'; } var fillColorToString = (function(){ var colorMap = []; return function(colorArr,alpha){ if(alpha !== undefined){ colorArr[3] = alpha; } if(!colorMap[colorArr[0]]){ colorMap[colorArr[0]] = {}; } if(!colorMap[colorArr[0]][colorArr[1]]){ colorMap[colorArr[0]][colorArr[1]] = {}; } if(!colorMap[colorArr[0]][colorArr[1]][colorArr[2]]){ colorMap[colorArr[0]][colorArr[1]][colorArr[2]] = {}; } if(!colorMap[colorArr[0]][colorArr[1]][colorArr[2]][colorArr[3]]){ colorMap[colorArr[0]][colorArr[1]][colorArr[2]][colorArr[3]] = 'rgba(' + colorArr.join(',')+')'; } return colorMap[colorArr[0]][colorArr[1]][colorArr[2]][colorArr[3]]; }; }()); function RenderedFrame(tr,o) { this.tr = tr; this.o = o; } function iterateDynamicProperties(num){ var i, len = this.dynamicProperties; for(i=0;i<len;i+=1){ this.dynamicProperties[i].getValue(num); } } function reversePath(paths){ var newI = [], newO = [], newV = []; var i, len, newPaths = {}; var init = 0; if (paths.c) { newI[0] = paths.o[0]; newO[0] = paths.i[0]; newV[0] = paths.v[0]; init = 1; } len = paths.i.length; var cnt = len - 1; for (i = init; i < len; i += 1) { newI.push(paths.o[cnt]); newO.push(paths.i[cnt]); newV.push(paths.v[cnt]); cnt -= 1; } newPaths.i = newI; newPaths.o = newO; newPaths.v = newV; return newPaths; }