| 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]]; |
| } |
| }()); |
| |
| 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 val; |
| |
| } |
| var defaultCurveSegments = 75; |
| 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); |
| |
| } |
| |
| 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 LetterProps(o,sw,sc,fc,m,p){ |
| this.o = o; |
| this.sw = sw; |
| this.sc = sc; |
| this.fc = fc; |
| this.m = m; |
| this.props = p; |
| } |
| |
| function iterateDynamicProperties(num){ |
| var i, len = this.dynamicProperties; |
| for(i=0;i<len;i+=1){ |
| this.dynamicProperties[i].getValue(num); |
| } |
| } |
| |
| function reversePath(paths, isClosed){ |
| var newI = [], newO = [], newV = []; |
| var i, len, newPaths = {}; |
| var init = 0; |
| if (isClosed) { |
| 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; |
| } |