| function ShapeItemElement(data,parentElement,globalData){ |
| this.stylesList = []; |
| this.viewData = []; |
| this.currentMatrix = new Matrix(); |
| this.shape = parentElement; |
| this.data = data; |
| this.globalData = globalData; |
| this.searchShapes(this.data,this.viewData); |
| styleUnselectableDiv(this.shape); |
| this.currentTrim = { |
| s:0, |
| e:100, |
| o:0, |
| active : false |
| } |
| } |
| |
| ShapeItemElement.prototype.searchShapes = function(arr,data){ |
| var i, len = arr.length - 1; |
| var j, jLen; |
| var k, kLen; |
| var pathNode; |
| var ownArrays = []; |
| for(i=len;i>=0;i-=1){ |
| if(arr[i].ty == 'fl' || arr[i].ty == 'st'){ |
| data[i] = { |
| renderedFrames : [], |
| lastData : { |
| c: '', |
| o:'', |
| w: '' |
| } |
| }; |
| var pathElement = document.createElementNS(svgNS, "path"); |
| this.shape.appendChild(pathElement); |
| this.stylesList.push({ |
| pathElement: pathElement, |
| type: arr[i].ty, |
| d: '' |
| }); |
| 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 |
| } |
| }; |
| }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; |
| for(j=0;j<jLen;j+=1){ |
| if(!this.stylesList[j].closed){ |
| data[i].styles.push(this.stylesList[j]); |
| if(this.stylesList[j].type == 'st'){ |
| this.stylesList[j].pathElement.setAttribute('fill-opacity',0); |
| this.stylesList[j].pathElement.setAttribute('stroke-linejoin','round'); |
| this.stylesList[j].pathElement.setAttribute('stroke-linecap','round'); |
| } |
| } |
| } |
| } |
| } |
| 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){ |
| this.stylesList[i].pathElement.setAttribute('d',''); |
| } |
| }; |
| |
| ShapeItemElement.prototype.renderShape = function(num,parentTransform,items,data){ |
| 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; |
| } |
| if(this.currentTrim.active){ |
| this.currentTrim.active = false; |
| } |
| 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'){ |
| // |
| } |
| } |
| len = this.stylesList.length; |
| for(i=0;i<len;i+=1){ |
| this.stylesList[i].pathElement.setAttribute('d',this.stylesList[i].d); |
| } |
| |
| }; |
| |
| ShapeItemElement.prototype.renderPath = function(pathData,viewData,num,transform){ |
| if(!viewData.renderedFrames[this.globalData.frameNum]){ |
| //// |
| |
| var pathNodes = pathData.renderedData[num].path.pathNodes; |
| if(!pathNodes.v || !pathNodes.v[0]){ |
| return; |
| } |
| var pathV = pathNodes.v; |
| var pathO = pathNodes.o; |
| var pathI = pathNodes.i; |
| var k,kLen = pathV.length; |
| var pathStringTransformed = " M"+transform.mat.applyToPointStringified(pathV[0][0],pathV[0][1]); |
| for(k=1;k<kLen;k++){ |
| pathStringTransformed += " C"+transform.mat.applyToPointStringified(pathO[k-1][0],pathO[k-1][1]) + " "+transform.mat.applyToPointStringified(pathI[k][0],pathI[k][1]) + " "+transform.mat.applyToPointStringified(pathV[k][0],pathV[k][1]); |
| } |
| if(pathData.closed !== false){ |
| pathStringTransformed += " C"+transform.mat.applyToPointStringified(pathO[k-1][0],pathO[k-1][1]) + " "+transform.mat.applyToPointStringified(pathI[0][0],pathI[0][1]) + " "+transform.mat.applyToPointStringified(pathV[0][0],pathV[0][1]); |
| } |
| |
| //// |
| viewData.renderedFrames[this.globalData.frameNum] = { |
| dTr: pathStringTransformed |
| }; |
| } |
| var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum]; |
| var i, len; |
| |
| len = viewData.styles.length; |
| for(i=0;i<len;i+=1){ |
| viewData.styles[i].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]){ |
| viewData.renderedFrames[this.globalData.frameNum] = { |
| c: fillData.color, |
| o: fillData.opacity*groupTransform.opacity |
| } |
| } |
| |
| var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum]; |
| var c = renderedFrameData.c; |
| var o = renderedFrameData.o; |
| if(viewData.lastData.c != c){ |
| styleElem.pathElement.setAttribute('fill',c); |
| } |
| if(viewData.lastData.o != o){ |
| styleElem.pathElement.setAttribute('fill-opacity',o); |
| } |
| viewData.lastData.c = c; |
| viewData.lastData.o = o; |
| }; |
| |
| ShapeItemElement.prototype.renderStroke = function(styleData,viewData,num,groupTransform){ |
| var fillData = styleData.renderedData[num]; |
| var styleElem = viewData.style; |
| if(!viewData.renderedFrames[this.globalData.frameNum]){ |
| viewData.renderedFrames[this.globalData.frameNum] = { |
| c: fillData.color, |
| o: fillData.opacity*groupTransform.opacity, |
| w: fillData.width |
| }; |
| 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; |
| if(d){ |
| var j, jLen = d.length; |
| var dasharray = ''; |
| var 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.c != c){ |
| styleElem.pathElement.setAttribute('stroke',c); |
| } |
| if(viewData.lastData.o != o){ |
| styleElem.pathElement.setAttribute('stroke-opacity',o); |
| } |
| if(viewData.lastData.w != w){ |
| styleElem.pathElement.setAttribute('stroke-width',w); |
| } |
| if(d){ |
| if(viewData.lastData.da != dasharray){ |
| styleElem.pathElement.setAttribute('stroke-dasharray',dasharray); |
| } |
| if(viewData.lastData.do != dashoffset){ |
| styleElem.pathElement.setAttribute('stroke-dashoffset',dashoffset); |
| } |
| } |
| viewData.lastData.c = c; |
| viewData.lastData.o = o; |
| viewData.lastData.w = w; |
| if(d){ |
| viewData.lastData.da = dasharray; |
| viewData.lastData.do = dashoffset; |
| } |
| }; |