| function SVGTextElement(data,globalData,comp){ |
| this.textSpans = []; |
| this.renderType = 'svg'; |
| this.initElement(data,globalData,comp); |
| } |
| |
| extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], SVGTextElement); |
| |
| SVGTextElement.prototype.createContent = function(){ |
| |
| if (this.data.singleShape && !this.globalData.fontManager.chars) { |
| this.textContainer = createNS('text'); |
| } |
| }; |
| |
| SVGTextElement.prototype.buildTextContents = function(textArray) { |
| var i = 0, len = textArray.length; |
| var textContents = [], currentTextContent = ''; |
| while (i < len) { |
| if(textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) { |
| textContents.push(currentTextContent); |
| currentTextContent = ''; |
| } else { |
| currentTextContent += textArray[i]; |
| } |
| i += 1; |
| } |
| textContents.push(currentTextContent); |
| return textContents; |
| } |
| |
| SVGTextElement.prototype.buildNewText = function(){ |
| var i, len; |
| |
| var documentData = this.textProperty.currentData; |
| this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0); |
| if(documentData.fc) { |
| this.layerElement.setAttribute('fill', this.buildColor(documentData.fc)); |
| }else{ |
| this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)'); |
| } |
| if(documentData.sc){ |
| this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc)); |
| this.layerElement.setAttribute('stroke-width', documentData.sw); |
| } |
| this.layerElement.setAttribute('font-size', documentData.finalSize); |
| var fontData = this.globalData.fontManager.getFontByName(documentData.f); |
| if(fontData.fClass){ |
| this.layerElement.setAttribute('class',fontData.fClass); |
| } else { |
| this.layerElement.setAttribute('font-family', fontData.fFamily); |
| var fWeight = documentData.fWeight, fStyle = documentData.fStyle; |
| this.layerElement.setAttribute('font-style', fStyle); |
| this.layerElement.setAttribute('font-weight', fWeight); |
| } |
| |
| var letters = documentData.l || []; |
| var usesGlyphs = !!this.globalData.fontManager.chars; |
| len = letters.length; |
| |
| var tSpan; |
| var matrixHelper = this.mHelper; |
| var shapes, shapeStr = '', singleShape = this.data.singleShape; |
| var xPos = 0, yPos = 0, firstLine = true; |
| var trackingOffset = documentData.tr/1000*documentData.finalSize; |
| if(singleShape && !usesGlyphs && !documentData.sz) { |
| var tElement = this.textContainer; |
| var justify = 'start'; |
| switch(documentData.j) { |
| case 1: |
| justify = 'end'; |
| break; |
| case 2: |
| justify = 'middle'; |
| break; |
| } |
| tElement.setAttribute('text-anchor',justify); |
| tElement.setAttribute('letter-spacing',trackingOffset); |
| var textContent = this.buildTextContents(documentData.finalText); |
| len = textContent.length; |
| yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0; |
| for ( i = 0; i < len; i += 1) { |
| tSpan = this.textSpans[i] || createNS('tspan'); |
| tSpan.textContent = textContent[i]; |
| tSpan.setAttribute('x', 0); |
| tSpan.setAttribute('y', yPos); |
| tSpan.style.display = 'inherit'; |
| tElement.appendChild(tSpan); |
| this.textSpans[i] = tSpan; |
| yPos += documentData.finalLineHeight; |
| } |
| |
| this.layerElement.appendChild(tElement); |
| } else { |
| var cachedSpansLength = this.textSpans.length; |
| var shapeData, charData; |
| for (i = 0; i < len; i += 1) { |
| if(!usesGlyphs || !singleShape || i === 0){ |
| tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text'); |
| if (cachedSpansLength <= i) { |
| tSpan.setAttribute('stroke-linecap', 'butt'); |
| tSpan.setAttribute('stroke-linejoin','round'); |
| tSpan.setAttribute('stroke-miterlimit','4'); |
| this.textSpans[i] = tSpan; |
| this.layerElement.appendChild(tSpan); |
| } |
| tSpan.style.display = 'inherit'; |
| } |
| |
| matrixHelper.reset(); |
| matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100); |
| if (singleShape) { |
| if(letters[i].n) { |
| xPos = -trackingOffset; |
| yPos += documentData.yOffset; |
| yPos += firstLine ? 1 : 0; |
| firstLine = false; |
| } |
| this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos); |
| xPos += letters[i].l || 0; |
| //xPos += letters[i].val === ' ' ? 0 : trackingOffset; |
| xPos += trackingOffset; |
| } |
| if(usesGlyphs) { |
| charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily); |
| shapeData = charData && charData.data || {}; |
| shapes = shapeData.shapes ? shapeData.shapes[0].it : []; |
| if(!singleShape){ |
| tSpan.setAttribute('d',this.createPathShape(matrixHelper,shapes)); |
| } else { |
| shapeStr += this.createPathShape(matrixHelper,shapes); |
| } |
| } else { |
| if(singleShape) { |
| tSpan.setAttribute("transform", "translate(" + matrixHelper.props[12] + "," + matrixHelper.props[13] + ")"); |
| } |
| tSpan.textContent = letters[i].val; |
| tSpan.setAttributeNS("http://www.w3.org/XML/1998/namespace", "xml:space","preserve"); |
| } |
| // |
| } |
| if (singleShape && tSpan) { |
| tSpan.setAttribute('d',shapeStr); |
| } |
| } |
| while (i < this.textSpans.length){ |
| this.textSpans[i].style.display = 'none'; |
| i += 1; |
| } |
| |
| this._sizeChanged = true; |
| }; |
| |
| SVGTextElement.prototype.sourceRectAtTime = function(time){ |
| this.prepareFrame(this.comp.renderedFrame - this.data.st); |
| this.renderInnerContent(); |
| if(this._sizeChanged){ |
| this._sizeChanged = false; |
| var textBox = this.layerElement.getBBox(); |
| this.bbox = { |
| top: textBox.y, |
| left: textBox.x, |
| width: textBox.width, |
| height: textBox.height |
| }; |
| } |
| return this.bbox; |
| }; |
| |
| SVGTextElement.prototype.renderInnerContent = function(){ |
| |
| if(!this.data.singleShape){ |
| this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag); |
| if(this.lettersChangedFlag || this.textAnimator.lettersChangedFlag){ |
| this._sizeChanged = true; |
| var i,len; |
| var renderedLetters = this.textAnimator.renderedLetters; |
| |
| var letters = this.textProperty.currentData.l; |
| |
| len = letters.length; |
| var renderedLetter, textSpan; |
| for(i=0;i<len;i+=1){ |
| if(letters[i].n){ |
| continue; |
| } |
| renderedLetter = renderedLetters[i]; |
| textSpan = this.textSpans[i]; |
| if(renderedLetter._mdf.m) { |
| textSpan.setAttribute('transform',renderedLetter.m); |
| } |
| if(renderedLetter._mdf.o) { |
| textSpan.setAttribute('opacity',renderedLetter.o); |
| } |
| if(renderedLetter._mdf.sw){ |
| textSpan.setAttribute('stroke-width',renderedLetter.sw); |
| } |
| if(renderedLetter._mdf.sc){ |
| textSpan.setAttribute('stroke',renderedLetter.sc); |
| } |
| if(renderedLetter._mdf.fc){ |
| textSpan.setAttribute('fill',renderedLetter.fc); |
| } |
| } |
| } |
| } |
| }; |