| function SVGEffects(elem){ |
| var i, len = elem.data.ef.length; |
| var filId = randomString(10); |
| var fil = filtersFactory.createFilter(filId); |
| var count = 0; |
| this.filters = []; |
| var filterManager; |
| for(i=0;i<len;i+=1){ |
| if(elem.data.ef[i].ty === 20){ |
| count += 1; |
| filterManager = new SVGTintFilter(fil, elem.effects.effectElements[i]); |
| this.filters.push(filterManager); |
| }else if(elem.data.ef[i].ty === 21){ |
| count += 1; |
| filterManager = new SVGFillFilter(fil, elem.effects.effectElements[i]); |
| this.filters.push(filterManager); |
| }else if(elem.data.ef[i].ty === 22){ |
| filterManager = new SVGStrokeEffect(elem, elem.effects.effectElements[i]); |
| this.filters.push(filterManager); |
| } |
| } |
| if(count){ |
| elem.globalData.defs.appendChild(fil); |
| elem.layerElement.setAttribute('filter','url(#'+filId+')'); |
| } |
| } |
| |
| SVGEffects.prototype.renderFrame = function(firstFrame){ |
| var i, len = this.filters.length; |
| for(i=0;i<len;i+=1){ |
| this.filters[i].renderFrame(firstFrame); |
| } |
| }; |
| |
| function SVGTintFilter(filter, filterManager){ |
| this.filterManager = filterManager; |
| var feColorMatrix = document.createElementNS(svgNS,'feColorMatrix'); |
| feColorMatrix.setAttribute('type','matrix'); |
| feColorMatrix.setAttribute('color-interpolation-filters','linearRGB'); |
| feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0'); |
| feColorMatrix.setAttribute('result','f1'); |
| filter.appendChild(feColorMatrix); |
| feColorMatrix = document.createElementNS(svgNS,'feColorMatrix'); |
| feColorMatrix.setAttribute('type','matrix'); |
| feColorMatrix.setAttribute('color-interpolation-filters','sRGB'); |
| feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0'); |
| feColorMatrix.setAttribute('result','f2'); |
| filter.appendChild(feColorMatrix); |
| this.matrixFilter = feColorMatrix; |
| if(filterManager.effectElements[2].p.v !== 100 || filterManager.effectElements[2].p.k){ |
| var feMerge = document.createElementNS(svgNS,'feMerge'); |
| filter.appendChild(feMerge); |
| var feMergeNode; |
| feMergeNode = document.createElementNS(svgNS,'feMergeNode'); |
| feMergeNode.setAttribute('in','SourceGraphic'); |
| feMerge.appendChild(feMergeNode); |
| feMergeNode = document.createElementNS(svgNS,'feMergeNode'); |
| feMergeNode.setAttribute('in','f2'); |
| feMerge.appendChild(feMergeNode); |
| } |
| } |
| |
| SVGTintFilter.prototype.renderFrame = function(forceRender){ |
| if(forceRender || this.filterManager.mdf){ |
| var colorBlack = this.filterManager.effectElements[0].p.v; |
| var colorWhite = this.filterManager.effectElements[1].p.v; |
| var opacity = this.filterManager.effectElements[2].p.v/100; |
| this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0'); |
| } |
| }; |
| |
| function SVGFillFilter(filter, filterManager){ |
| this.filterManager = filterManager; |
| var feColorMatrix = document.createElementNS(svgNS,'feColorMatrix'); |
| feColorMatrix.setAttribute('type','matrix'); |
| feColorMatrix.setAttribute('color-interpolation-filters','sRGB'); |
| feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0'); |
| filter.appendChild(feColorMatrix); |
| this.matrixFilter = feColorMatrix; |
| } |
| SVGFillFilter.prototype.renderFrame = function(forceRender){ |
| if(forceRender || this.filterManager.mdf){ |
| var color = this.filterManager.effectElements[2].p.v; |
| var opacity = this.filterManager.effectElements[6].p.v; |
| this.matrixFilter.setAttribute('values','0 0 0 0 '+color[0]+' 0 0 0 0 '+color[1]+' 0 0 0 0 '+color[2]+' 0 0 0 '+opacity+' 0'); |
| } |
| }; |
| |
| 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(#'+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)+')'); |
| } |
| } |
| }; |