UNPKG

bodymovin

Version:

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

104 lines (100 loc) 4.97 kB
function SVGStrokeEffect(elem, filterManager){ this.initialized = false; this.filterManager = filterManager; this.elem = elem; this.paths = []; } SVGStrokeEffect.prototype.initialize = function(){ var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes; var path,groupPath, i, len; if(this.filterManager.effectElements[1].p.v === 1){ len = this.elem.maskManager.masksProperties.length; i = 0; } else { i = this.filterManager.effectElements[0].p.v - 1; len = i + 1; } groupPath = document.createElementNS(svgNS,'g'); groupPath.setAttribute('fill','none'); groupPath.setAttribute('stroke-linecap','round'); groupPath.setAttribute('stroke-dashoffset',1); for(i;i<len;i+=1){ path = document.createElementNS(svgNS,'path'); groupPath.appendChild(path); this.paths.push({p:path,m:i}); } if(this.filterManager.effectElements[10].p.v === 3){ var mask = document.createElementNS(svgNS,'mask'); var id = 'stms_' + randomString(10); mask.setAttribute('id',id); mask.setAttribute('mask-type','alpha'); mask.appendChild(groupPath); this.elem.globalData.defs.appendChild(mask); var g = document.createElementNS(svgNS,'g'); g.setAttribute('mask','url(' + locationHref + '#'+id+')'); if(elemChildren[0]){ g.appendChild(elemChildren[0]); } this.elem.layerElement.appendChild(g); this.masker = mask; groupPath.setAttribute('stroke','#fff'); } else if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){ if(this.filterManager.effectElements[10].p.v === 2){ var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes; while(elemChildren.length){ this.elem.layerElement.removeChild(elemChildren[0]); } } this.elem.layerElement.appendChild(groupPath); this.elem.layerElement.removeAttribute('mask'); groupPath.setAttribute('stroke','#fff'); } this.initialized = true; this.pathMasker = groupPath; } SVGStrokeEffect.prototype.renderFrame = function(forceRender){ if(!this.initialized){ this.initialize(); } var i, len = this.paths.length; var mask, path; for(i=0;i<len;i+=1){ mask = this.elem.maskManager.viewData[this.paths[i].m]; path = this.paths[i].p; if(forceRender || this.filterManager.mdf || mask.prop.mdf){ path.setAttribute('d',mask.lastPath); } if(forceRender || this.filterManager.effectElements[9].p.mdf || this.filterManager.effectElements[4].p.mdf || this.filterManager.effectElements[7].p.mdf || this.filterManager.effectElements[8].p.mdf || mask.prop.mdf){ var dasharrayValue; if(this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100){ var s = Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100; var e = Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100; var l = path.getTotalLength(); dasharrayValue = '0 0 0 ' + l*s + ' '; var lineLength = l*(e-s); var segment = 1+this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100; var units = Math.floor(lineLength/segment); var j; for(j=0;j<units;j+=1){ dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100 + ' '; } dasharrayValue += '0 ' + l*10 + ' 0 0'; } else { dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100; } path.setAttribute('stroke-dasharray',dasharrayValue); } } if(forceRender || this.filterManager.effectElements[4].p.mdf){ this.pathMasker.setAttribute('stroke-width',this.filterManager.effectElements[4].p.v*2); } if(forceRender || this.filterManager.effectElements[6].p.mdf){ this.pathMasker.setAttribute('opacity',this.filterManager.effectElements[6].p.v); } if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){ if(forceRender || this.filterManager.effectElements[3].p.mdf){ var color = this.filterManager.effectElements[3].p.v; this.pathMasker.setAttribute('stroke','rgb('+bm_floor(color[0]*255)+','+bm_floor(color[1]*255)+','+bm_floor(color[2]*255)+')'); } } };