blob: 3d38fc50984e8fa1cb1a9d7fb4c02413d02adf92 [file] [log] [blame]
function ShapeItemElement(data,parentElement,parentContainer,placeholder,globalData){
this.lcEnum = {
'1': 'butt',
'2': 'round',
'3': 'butt'
};
this.ljEnum = {
'1': 'miter',
'2': 'round',
'3': 'bevel'
};
this.stylesList = [];
this.viewData = [];
this.shape = parentElement;
this.parentContainer = parentContainer;
this.placeholder = placeholder;
this.data = data;
this.globalData = globalData;
this.searchShapes(this.data,this.viewData);
styleUnselectableDiv(this.shape);
}
ShapeItemElement.prototype.appendNodeToParent = BaseElement.prototype.appendNodeToParent;
ShapeItemElement.prototype.searchShapes = function(arr,data){
var i, len = arr.length - 1;
var j, jLen;
var ownArrays = [];
for(i=len;i>=0;i-=1){
if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
data[i] = {
renderedFrames : [],
lastData : {
c: '',
o:-1,
w: ''
}
};
var pathElement;
if(arr[i].ty == 'st') {
pathElement = document.createElementNS(svgNS, "g");
pathElement.setAttribute('stroke-linecap', this.lcEnum[arr[i].lc] || 'round');
pathElement.setAttribute('stroke-linejoin',this.ljEnum[arr[i].lj] || 'round');
pathElement.setAttribute('fill-opacity','0');
if(arr[i].lj == 1) {
pathElement.setAttribute('stroke-miterlimit',arr[i].ml);
}
}else{
pathElement = document.createElementNS(svgNS, "path");
}
if(this.shape === this.parentContainer){
this.appendNodeToParent(pathElement);
}else{
this.shape.appendChild(pathElement);
}
this.stylesList.push({
pathElement: pathElement,
type: arr[i].ty,
d: '',
ld: ''
});
data[i].style = this.stylesList[this.stylesList.length - 1];
ownArrays.push(data[i].style);
}else if(arr[i].ty == 'gr'){
data[i] = {
it: []
};
this.searchShapes(arr[i].it,data[i].it);
}else if(arr[i].ty == 'tr'){
data[i] = {
transform : {
mat: new Matrix(),
opacity: 1
},
elements: []
};
}else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el'){
data[i] = {
elements : [],
renderedFrames : [],
styles : [],
lastData : {
d: '',
o:'',
tr:''
}
};
jLen = this.stylesList.length;
var element, hasStrokes = false, hasFills = false;
for(j=0;j<jLen;j+=1){
if(!this.stylesList[j].closed){
if(this.stylesList[j].type === 'st'){
hasStrokes = true;
element = document.createElementNS(svgNS, "path");
this.stylesList[j].pathElement.appendChild(element);
data[i].elements.push({
ty:this.stylesList[j].type,
el:element
});
}else{
hasFills = true;
data[i].elements.push({
ty:this.stylesList[j].type,
st: this.stylesList[j]
});
}
}
}
data[i].st = hasStrokes;
data[i].fl = hasFills;
}
}
len = ownArrays.length;
for(i=0;i<len;i+=1){
ownArrays[i].closed = true;
}
};
ShapeItemElement.prototype.getElement = function(){
return this.shape;
};
ShapeItemElement.prototype.hideShape = function(){
var i, len = this.stylesList.length;
for(i=len-1;i>=0;i-=1){
if(this.stylesList[i].type === 'st'){
this.stylesList[i].pathElement.setAttribute('visibility','hidden');
this.stylesList[i].ld = 0;
}else{
this.stylesList[i].pathElement.setAttribute('d','M 0,0');
this.stylesList[i].ld = 'M 0,0';
}
}
};
ShapeItemElement.prototype.renderShape = function(num,parentTransform,items,data,isMain){
var i, len;
if(!items){
items = this.data;
len = this.stylesList.length;
for(i=0;i<len;i+=1){
this.stylesList[i].d = '';
}
}
if(!data){
data = this.viewData;
}
this.frameNum = num;
///
///
len = items.length - 1;
var groupTransform,groupMatrix;
groupTransform = parentTransform;
for(i=len;i>=0;i-=1){
if(items[i].ty == 'tr'){
var mtArr = items[i].renderedData[num].mtArr;
groupTransform = data[i].transform;
groupMatrix = groupTransform.mat;
groupMatrix.reset();
if(parentTransform){
var props = parentTransform.mat.props;
groupTransform.opacity = parentTransform.opacity;
groupTransform.opacity *= items[i].renderedData[num].o;
groupMatrix.transform(props[0],props[1],props[2],props[3],props[4],props[5]);
}else{
groupTransform.opacity = items[i].renderedData[num].o;
}
groupMatrix.transform(mtArr[0],mtArr[1],mtArr[2],mtArr[3],mtArr[4],mtArr[5]).translate(-items[i].renderedData[num].a[0],-items[i].renderedData[num].a[1]);
}else if(items[i].ty == 'sh'){
this.renderPath(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'el'){
this.renderPath(items[i],data[i],num,groupTransform);
//this.renderEllipse(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'rc'){
if(items[i].trimmed){
this.renderPath(items[i],data[i],num,groupTransform);
}else{
this.renderRect(items[i],data[i],num,groupTransform);
}
}else if(items[i].ty == 'fl'){
this.renderFill(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'st'){
this.renderStroke(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'gr'){
this.renderShape(num,groupTransform,items[i].it,data[i].it);
}else if(items[i].ty == 'tm'){
//
}
}
if(!isMain){
return;
}
len = this.stylesList.length;
for(i=0;i<len;i+=1){
if(this.stylesList[i].type === 'fl'){
if(this.stylesList[i].d == '' && this.stylesList[i].ld !== ''){
this.stylesList[i].pathElement.setAttribute('d','M 0,0');
this.stylesList[i].ld = this.stylesList[i].d;
}else if(this.stylesList[i].ld !== this.stylesList[i].d){
this.stylesList[i].pathElement.setAttribute('d',this.stylesList[i].d);
this.stylesList[i].ld = this.stylesList[i].d;
}
}else if(this.stylesList[i].ld === 0){
this.stylesList[i].ld = 1;
this.stylesList[i].pathElement.setAttribute('visibility','visible');
}
}
};
ShapeItemElement.prototype.renderPath = function(pathData,viewData,num,groupTransform){
var len,i;
if(!viewData.renderedFrames[this.globalData.frameNum]){
var pathNodes = pathData.renderedData[num].path.pathNodes;
var t = '';
var pathStringTransformed = '';
var pathStringNonTransformed = '';
if(pathNodes.v){
len = pathNodes.v.length;
var stops = pathNodes.s ? pathNodes.s : [];
for(i=1;i<len;i+=1){
if(stops[i-1]){
if(viewData.st){
pathStringNonTransformed += " M"+bm_rnd(stops[i-1][0])+','+bm_rnd(stops[i-1][1]);
}
if(viewData.fl) {
pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(stops[i - 1][0], stops[i - 1][1]);
}
}else if(i==1){
if(viewData.st) {
pathStringNonTransformed += " M" + bm_rnd(pathNodes.v[0][0]) + ',' + bm_rnd(pathNodes.v[0][1]);
}
if(viewData.fl) {
pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
}
}
if(viewData.st) {
pathStringNonTransformed += " C" + bm_rnd(pathNodes.o[i - 1][0]) + ',' + bm_rnd(pathNodes.o[i - 1][1]) + " " + bm_rnd(pathNodes.i[i][0]) + ',' + bm_rnd(pathNodes.i[i][1]) + " " + bm_rnd(pathNodes.v[i][0]) + ',' + bm_rnd(pathNodes.v[i][1]);
}
if(viewData.fl) {
pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
}
}
if(len == 1){
if(stops[0]){
if(viewData.st) {
pathStringNonTransformed += " M" + bm_rnd(stops[0][0]) + ',' + bm_rnd(stops[0][1]);
}
if(viewData.fl) {
pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(stops[0][0], stops[0][1]);
}
}else{
if(viewData.st) {
pathStringNonTransformed += " M" + bm_rnd(pathNodes.v[0][0]) + ',' + bm_rnd(pathNodes.v[0][1]);
}
if(viewData.fl) {
pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
}
}
}
if(pathData.closed && !(pathData.trimmed && !pathNodes.c)){
if(viewData.st) {
pathStringNonTransformed += " C" + bm_rnd(pathNodes.o[i - 1][0]) + ',' + bm_rnd(pathNodes.o[i - 1][1]) + " " + bm_rnd(pathNodes.i[0][0]) + ',' + bm_rnd(pathNodes.i[0][1]) + " " + bm_rnd(pathNodes.v[0][0]) + ',' + bm_rnd(pathNodes.v[0][1]);
}
if(viewData.fl) {
pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
}
}
if(viewData.st) {
t = 'matrix(' + groupTransform.mat.props.join(',') + ')';
}
}
viewData.renderedFrames[this.globalData.frameNum] = {
dTr: pathStringTransformed,
dNTr: pathStringNonTransformed,
t: t
};
}
var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
len = viewData.elements.length;
for(i=0;i<len;i+=1){
if(viewData.elements[i].ty === 'st'){
if(viewData.ld != renderedFrameData.dNTr) {
viewData.elements[i].el.setAttribute('d', renderedFrameData.dNTr);
viewData.ld = renderedFrameData.dNTr;
}
if(viewData.lt != renderedFrameData.t) {
viewData.elements[i].el.setAttribute('transform',renderedFrameData.t);
viewData.lt = renderedFrameData.t;
}
}else{
viewData.elements[i].st.d += renderedFrameData.dTr;
}
}
};
ShapeItemElement.prototype.renderFill = function(styleData,viewData,num, groupTransform){
var fillData = styleData.renderedData[num];
var styleElem = viewData.style;
if(!viewData.renderedFrames[this.globalData.frameNum]){
if(viewData._ld && viewData._ld.c === fillData.color && viewData._ld.o === fillData.opacity*groupTransform.opacity){
viewData.renderedFrames[this.globalData.frameNum] = viewData._ld;
return;
}else{
viewData._ld = {
c: fillData.color,
o: fillData.opacity*groupTransform.opacity
};
viewData.renderedFrames[this.globalData.frameNum] = viewData._ld;
}
}
var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
if(viewData.lastData.c != renderedFrameData.c){
styleElem.pathElement.setAttribute('fill',renderedFrameData.c);
viewData.lastData.c = renderedFrameData.c;
}
if(viewData.lastData.o != renderedFrameData.o){
styleElem.pathElement.setAttribute('fill-opacity',renderedFrameData.o);
viewData.lastData.o = renderedFrameData.o;
}
};
ShapeItemElement.prototype.renderStroke = function(styleData,viewData,num, groupTransform){
var fillData = styleData.renderedData[num];
var styleElem = viewData.style;
if(!viewData.renderedFrames[this.globalData.frameNum]){
if(viewData._ld && viewData._ld.c === fillData.color && viewData._ld.o === fillData.opacity*groupTransform.opacity && viewData._ld.w === fillData.width){
viewData.renderedFrames[this.globalData.frameNum] = viewData._ld;
return;
}else{
viewData._ld = {
c: fillData.color,
o: fillData.opacity*groupTransform.opacity,
w: fillData.width
};
viewData.renderedFrames[this.globalData.frameNum] = viewData._ld;
}
if(fillData.dashes){
viewData.renderedFrames[this.globalData.frameNum].d = fillData.dashes;
}
}
var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
var c = renderedFrameData.c;
var o = renderedFrameData.o;
var w = renderedFrameData.w;
var d = renderedFrameData.d;
var dasharray,dashoffset;
if(d){
var j, jLen = d.length;
dasharray = '';
dashoffset = '';
for(j=0;j<jLen;j+=1){
if(d[j].n != 'o'){
dasharray += ' ' + d[j].v;
}else{
dashoffset += d[j].v;
}
}
if(viewData.lastData.da != dasharray){
styleElem.pathElement.setAttribute('stroke-dasharray',dasharray);
viewData.lastData.da = dasharray;
}
if(viewData.lastData.do != dashoffset){
styleElem.pathElement.setAttribute('stroke-dashoffset',dashoffset);
viewData.lastData.do = dashoffset;
}
}
if(viewData.lastData.c != c){
styleElem.pathElement.setAttribute('stroke',c);
viewData.lastData.c = c;
}
if(viewData.lastData.o != o){
styleElem.pathElement.setAttribute('stroke-opacity',o);
viewData.lastData.o = o;
}
if(viewData.lastData.w !== w){
styleElem.pathElement.setAttribute('stroke-width',w);
viewData.lastData.w = w;
}
};
ShapeItemElement.prototype.destroy = function(items, data){
this.shape = null;
this.data = null;
this.viewData = null;
this.parentContainer = null;
this.placeholder = null;
/*if(!items){
items = this.data;
}
if(!data){
data = this.viewData;
}
var i, len = items.length;
var groupTransform,groupMatrix;
groupTransform = parentTransform;
for(i = 0; i < len; i += 1){
if(items[i].ty == 'tr'){
}else if(items[i].ty == 'sh'){
this.renderPath(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'el'){
this.renderPath(items[i],data[i],num,groupTransform);
//this.renderEllipse(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'rc'){
if(items[i].trimmed){
this.renderPath(items[i],data[i],num,groupTransform);
}else{
this.renderRect(items[i],data[i],num,groupTransform);
}
}else if(items[i].ty == 'fl'){
this.renderFill(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'st'){
this.renderStroke(items[i],data[i],num,groupTransform);
}else if(items[i].ty == 'gr'){
this.renderShape(num,groupTransform,items[i].it,data[i].it);
}else if(items[i].ty == 'tm'){
//
}
}*/
};