blob: e7ab617ffb5ff8912d53a6e7bbbc0d2465841b75 [file] [log] [blame]
function SVGBaseElement(data,parentContainer,globalData,comp, placeholder){
this.globalData = globalData;
this.comp = comp;
this.data = data;
this.matteElement = null;
this.parentContainer = parentContainer;
this.layerId = placeholder ? placeholder.layerId : 'ly_'+randomString(10);
this.placeholder = placeholder;
this.init();
};
createElement(BaseElement, SVGBaseElement);
SVGBaseElement.prototype.createElements = function(){
if(this.data.td){
if(this.data.td == 3){
this.layerElement = document.createElementNS(svgNS,'mask');
this.layerElement.setAttribute('id',this.layerId);
this.layerElement.setAttribute('mask-type','luminance');
this.globalData.defs.appendChild(this.layerElement);
}else if(this.data.td == 2){
var maskGroup = document.createElementNS(svgNS,'mask');
maskGroup.setAttribute('id',this.layerId);
maskGroup.setAttribute('mask-type','alpha');
var maskGrouper = document.createElementNS(svgNS,'g');
maskGroup.appendChild(maskGrouper);
this.layerElement = document.createElementNS(svgNS,'g');
var fil = document.createElementNS(svgNS,'filter');
var filId = randomString(10);
fil.setAttribute('id',filId);
fil.setAttribute('filterUnits','objectBoundingBox');
fil.setAttribute('x','0%');
fil.setAttribute('y','0%');
fil.setAttribute('width','100%');
fil.setAttribute('height','100%');
var feCTr = document.createElementNS(svgNS,'feComponentTransfer');
feCTr.setAttribute('in','SourceGraphic');
fil.appendChild(feCTr);
var feFunc = document.createElementNS(svgNS,'feFuncA');
feFunc.setAttribute('type','table');
feFunc.setAttribute('tableValues','1.0 0.0');
feCTr.appendChild(feFunc);
this.globalData.defs.appendChild(fil);
var alphaRect = document.createElementNS(svgNS,'rect');
alphaRect.setAttribute('width',this.comp.data ? this.comp.data.w : this.globalData.compSize.w);
alphaRect.setAttribute('height',this.comp.data ? this.comp.data.h : this.globalData.compSize.h);
alphaRect.setAttribute('x','0');
alphaRect.setAttribute('y','0');
alphaRect.setAttribute('fill','#ffffff');
alphaRect.setAttribute('opacity','0');
maskGrouper.setAttribute('filter','url(#'+filId+')');
maskGrouper.appendChild(alphaRect);
maskGrouper.appendChild(this.layerElement);
this.globalData.defs.appendChild(maskGroup);
}else{
this.layerElement = document.createElementNS(svgNS,'g');
var masker = document.createElementNS(svgNS,'mask');
masker.setAttribute('id',this.layerId);
masker.setAttribute('mask-type','alpha');
masker.appendChild(this.layerElement);
this.globalData.defs.appendChild(masker);
}
if(this.data.hasMask){
this.maskedElement = this.layerElement;
}
}else if(this.data.hasMask || this.data.tt){
this.layerElement = document.createElementNS(svgNS,'g');
if(this.data.tt){
this.matteElement = document.createElementNS(svgNS,'g');
this.matteElement.appendChild(this.layerElement);
this.baseElement = this.matteElement;
//this.appendNodeToParent(this.matteElement);
}else{
this.baseElement = this.layerElement;
//this.appendNodeToParent(this.layerElement);
}
if(this.data.hasMask){
this.maskedElement = this.layerElement;
}
}else{
this.layerElement = document.createElementNS(svgNS,'g');
this.baseElement = this.layerElement;
//this.appendNodeToParent(this.layerElement);
}
if((this.data.ln || this.data.cl) && (this.data.ty === 4 || this.data.ty === 0)){
if(this.data.ln){
this.layerElement.setAttribute('id',this.data.ln);
}
if(this.data.cl){
this.layerElement.setAttribute('class',this.data.cl);
}
}
if(this.data.ty === 0 && !this.checkMasks()){
var cp = document.createElementNS(svgNS, 'clipPath');
var pt = document.createElementNS(svgNS,'path');
pt.setAttribute('d','M0,0 L'+this.data.w+',0'+' L'+this.data.w+','+this.data.h+' L0,'+this.data.h+'z');
var clipId = 'cp_'+randomString(8);
cp.setAttribute('id',clipId);
this.layerElement.setAttribute('clip-path','url(#'+clipId+')');
cp.appendChild(pt);
this.globalData.defs.appendChild(cp);
}
if(this.data.bm !== 0){
this.setBlendMode();
}
if(this.layerElement !== this.parentContainer){
this.placeholder = null;
}
/* Todo performance killer
if(this.data.sy){
var filterID = 'st_'+randomString(10);
var c = this.data.sy[0].c.k;
var r = this.data.sy[0].s.k;
var expansor = document.createElementNS(svgNS,'filter');
expansor.setAttribute('id',filterID);
var feFlood = document.createElementNS(svgNS,'feFlood');
this.feFlood = feFlood;
if(!c[0].e){
feFlood.setAttribute('flood-color','rgb('+c[0]+','+c[1]+','+c[2]+')');
}
feFlood.setAttribute('result','base');
expansor.appendChild(feFlood);
var feMorph = document.createElementNS(svgNS,'feMorphology');
feMorph.setAttribute('operator','dilate');
feMorph.setAttribute('in','SourceGraphic');
feMorph.setAttribute('result','bigger');
this.feMorph = feMorph;
if(!r.length){
feMorph.setAttribute('radius',this.data.sy[0].s.k);
}
expansor.appendChild(feMorph);
var feColorMatrix = document.createElementNS(svgNS,'feColorMatrix');
feColorMatrix.setAttribute('result','mask');
feColorMatrix.setAttribute('in','bigger');
feColorMatrix.setAttribute('type','matrix');
feColorMatrix.setAttribute('values','0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0');
expansor.appendChild(feColorMatrix);
var feComposite = document.createElementNS(svgNS,'feComposite');
feComposite.setAttribute('result','drop');
feComposite.setAttribute('in','base');
feComposite.setAttribute('in2','mask');
feComposite.setAttribute('operator','in');
expansor.appendChild(feComposite);
var feBlend = document.createElementNS(svgNS,'feBlend');
feBlend.setAttribute('in','SourceGraphic');
feBlend.setAttribute('in2','drop');
feBlend.setAttribute('mode','normal');
expansor.appendChild(feBlend);
this.globalData.defs.appendChild(expansor);
var cont = document.createElementNS(svgNS,'g');
if(this.layerElement === this.parentContainer){
this.layerElement = cont;
}else{
cont.appendChild(this.layerElement);
}
cont.setAttribute('filter','url(#'+filterID+')');
if(this.data.td){
cont.setAttribute('data-td',this.data.td);
}
if(this.data.td == 3){
this.globalData.defs.appendChild(cont);
}else if(this.data.td == 2){
maskGrouper.appendChild(cont);
}else if(this.data.td == 1){
masker.appendChild(cont);
}else{
if(this.data.hasMask && this.data.tt){
this.matteElement.appendChild(cont);
}else{
this.appendNodeToParent(cont);
}
}
}*/
if(this.data.ef){
this.effectsManager = new SVGEffects(this);
}
this.checkParenting();
};
SVGBaseElement.prototype.setBlendMode = BaseElement.prototype.setBlendMode;
SVGBaseElement.prototype.renderFrame = function(parentTransform){
if(this.data.ty === 3 || this.data.hd){
return false;
}
if(!this.isVisible){
return this.isVisible;
}
this.lastNum = this.currentFrameNum;
this.finalTransform.opMdf = this.finalTransform.op.mdf;
this.finalTransform.matMdf = this.finalTransform.mProp.mdf;
this.finalTransform.opacity = this.finalTransform.op.v;
if(this.firstFrame){
this.finalTransform.opMdf = true;
this.finalTransform.matMdf = true;
}
var mat;
var finalMat = this.finalTransform.mat;
if(this.hierarchy){
var i, len = this.hierarchy.length;
mat = this.finalTransform.mProp.v.props;
finalMat.cloneFromProps(mat);
for(i=0;i<len;i+=1){
this.finalTransform.matMdf = this.hierarchy[i].finalTransform.mProp.mdf ? true : this.finalTransform.matMdf;
mat = this.hierarchy[i].finalTransform.mProp.v.props;
finalMat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],mat[12],mat[13],mat[14],mat[15]);
}
}else{
if(this.isVisible){
finalMat.cloneFromProps(this.finalTransform.mProp.v.props);
}
}
if(parentTransform){
mat = parentTransform.mat.props;
finalMat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],mat[12],mat[13],mat[14],mat[15]);
this.finalTransform.opacity *= parentTransform.opacity;
this.finalTransform.opMdf = parentTransform.opMdf ? true : this.finalTransform.opMdf;
this.finalTransform.matMdf = parentTransform.matMdf ? true : this.finalTransform.matMdf;
}
if(this.finalTransform.matMdf && this.layerElement){
this.layerElement.setAttribute('transform',finalMat.to2dCSS());
}
if(this.finalTransform.opMdf && this.layerElement){
this.layerElement.setAttribute('opacity',this.finalTransform.opacity);
}
if(this.data.hasMask){
this.maskManager.renderFrame(finalMat);
}
if(this.effectsManager){
this.effectsManager.renderFrame(this.firstFrame);
}
return this.isVisible;
};
SVGBaseElement.prototype.destroy = function(){
this.layerElement = null;
this.parentContainer = null;
if(this.matteElement) {
this.matteElement = null;
}
if(this.maskManager) {
this.maskManager.destroy();
}
};
SVGBaseElement.prototype.getBaseElement = function(){
return this.baseElement;
};
SVGBaseElement.prototype.addMasks = function(data){
this.maskManager = new MaskElement(data,this,this.globalData);
};
SVGBaseElement.prototype.setMatte = function(id){
if(!this.matteElement){
return;
}
this.matteElement.setAttribute("mask", "url(#" + id + ")");
};
SVGBaseElement.prototype.setMatte = function(id){
if(!this.matteElement){
return;
}
this.matteElement.setAttribute("mask", "url(#" + id + ")");
};
SVGBaseElement.prototype.hide = function(){
};