blob: 612315f1294ae4c9f5615cd678f386ff861aad4e [file] [log] [blame]
var TextData_Helper = (function(){
var ob = {};
var matrixHelper = new Matrix();
function getMult(ind,s,e,ne,xe,type){
var easer = bez.getEasingCurve(ne/100,0,1-xe/100,1);
var mult = 0;
if(type == 2){
if(e === s){
mult = ind >= e ? 1 : 0;
}else{
mult = Math.max(0,Math.min(0.5/(e-s) + (ind-s)/(e-s),1));
}
mult = easer('',mult,0,1,1);
}else if(type == 3){
if(e === s){
mult = ind >= e ? 0 : 1;
}else{
mult = 1 - Math.max(0,Math.min(0.5/(e-s) + (ind-s)/(e-s),1));
}
mult = easer('',mult,0,1,1);
}else if(type == 4){
if(e === s){
mult = ind >= e ? 0 : 1;
}else{
mult = Math.max(0,Math.min(0.5/(e-s) + (ind-s)/(e-s),1));
if(mult<.5){
mult *= 2;
}else{
mult = 1 - mult;
}
}
}else {
if(ind >= Math.floor(s)){
if(ind-s < 0){
mult = 1 - (s - ind);
}else{
mult = Math.max(0,Math.min(e-ind,1));
}
}
}
return mult;
}
function LetterProps(o,sw,sc,fc,m,p){
this.o = o;
this.sw = sw;
this.sc = sc;
this.fc = fc;
this.m = m;
this.props = p;
}
function getMeasures(data, num, renderType){
var xPos,yPos;
var i, len;
var documentData = data.t.d;
var letters = documentData.l;
if('m' in data.t.p) {
var mask = data.masksProperties[data.t.p.m];
var paths = mask.paths[num].pathNodes;
var pathInfo = {
tLength: 0,
segments: []
};
len = paths.v.length - 1;
var pathData;
for (i = 0; i < len; i += 1) {
pathData = {
s: paths.v[i],
e: paths.v[i + 1],
to: [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
ti: [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]
};
bez.buildBezierData(pathData);
pathInfo.tLength += pathData.bezierData.segmentLength;
pathInfo.segments.push(pathData);
}
i = len;
if (mask.cl) {
pathData = {
s: paths.v[i],
e: paths.v[0],
to: [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
ti: [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]
};
bez.buildBezierData(pathData);
pathInfo.tLength += pathData.bezierData.segmentLength;
pathInfo.segments.push(pathData);
}
var currentLength = data.renderedData[num].t.p[0], segmentInd = 0, pointInd = 1, currentPoint, prevPoint, points;
var segmentLength = 0, flag = true;
var segments = pathInfo.segments;
if (currentLength < 0 && mask.cl) {
if (pathInfo.tLength < Math.abs(currentLength)) {
currentLength = -Math.abs(currentLength) % pathInfo.tLength;
}
segmentInd = segments.length - 1;
points = segments[segmentInd].bezierData.points;
pointInd = points.length - 1;
while (currentLength < 0) {
currentLength += points[pointInd].partialLength;
pointInd -= 1;
if (pointInd < 0) {
segmentInd -= 1;
points = segments[segmentInd].bezierData.points;
pointInd = points.length - 1;
}
}
}
points = segments[segmentInd].bezierData.points;
prevPoint = points[pointInd - 1];
currentPoint = points[pointInd];
var partialLength = currentPoint.partialLength;
var perc, tanAngle;
}
len = letters.length;
xPos = 0;
yPos = 0;
var yOff = data.t.d.s*1.2*.714;
var firstLine = true;
var renderedData = data.renderedData[num].t, animatorProps;
var j, jLen;
var lettersValue = new Array(len), letterValue, lettersChangedFlag = false;
jLen = renderedData.a.length;
var ranges = [], totalChars, divisor;
var lastLetters = data._letters, lastLetter;
for(j=0;j<jLen;j+=1){
totalChars = data.t.a[j].totalChars;
divisor = data.t.a[j].s.r === 2 ? 1 : 100/totalChars;
if(!('e' in renderedData.a[j].s)){
renderedData.a[j].s.e = data.t.a[j].s.r === 2 ? totalChars : 100;
}
var o = renderedData.a[j].s.o/divisor;
if(o === 0 && renderedData.a[j].s.s === 0 && renderedData.a[j].s.e === divisor){
}
var s = renderedData.a[j].s.s/divisor + o;
var e = (renderedData.a[j].s.e/divisor) + o;
if(s>e){
var _s = s;
s = e;
e = _s;
}
ranges.push({s:s,e:e,ne:renderedData.a[j].s.ne,xe:renderedData.a[j].s.xe});
}
var mult, ind = -1, offf, xPathPos, yPathPos;
var initPathPos = currentLength,initSegmentInd = segmentInd, initPointInd = pointInd;
var elemOpacity;
var sc,sw,fc,k;
var lineLength = 0;
var letterSw,letterSc,letterFc,letterM,letterP,letterO;
for( i = 0; i < len; i += 1) {
matrixHelper.reset();
switch(documentData.j){
case 1:
matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]),0);
break;
case 2:
matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line])/2,0);
break;
}
elemOpacity = 1;
if(letters[i].n) {
xPos = 0;
yPos += documentData.yOffset;
yPos += firstLine ? 1 : 0;
currentLength = initPathPos ;
firstLine = false;
lineLength = 0;
if('m' in data.t.p) {
segmentInd = initSegmentInd;
pointInd = initPointInd;
points = segments[segmentInd].bezierData.points;
prevPoint = points[pointInd - 1];
currentPoint = points[pointInd];
partialLength = currentPoint.partialLength;
segmentLength = 0;
}
lettersValue[i] = emptyProp;
}else{
if('m' in data.t.p) {
if(ind !== letters[i].ind){
if(letters[ind]){
currentLength += letters[ind].extra;
}
currentLength += letters[i].an/2;
ind = letters[i].ind;
}
currentLength += renderedData.m.a[0]*letters[i].an/200;
var animatorOffset = 0;
for(j=0;j<jLen;j+=1){
animatorProps = renderedData.a[j].a;
if ('p' in animatorProps && 's' in ranges[j]) {
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
animatorOffset += animatorProps.p[0] * mult;
}
}
flag = true;
while (flag) {
if (segmentLength + partialLength >= currentLength + animatorOffset || !points) {
perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength;
xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc;
yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc;
matrixHelper.translate(xPathPos,yPathPos);
if (data.t.p.p) {
tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]);
var rot = Math.atan(tanAngle) * 180 / Math.PI;
if (currentPoint.point[0] < prevPoint.point[0]) {
rot += 180;
}
matrixHelper.rotate(rot*Math.PI/180);
}
matrixHelper.translate(0,(renderedData.m.a[1]*yOff/100 + yPos));
flag = false;
} else if (points) {
segmentLength += currentPoint.partialLength;
pointInd += 1;
if (pointInd >= points.length) {
pointInd = 0;
segmentInd += 1;
if (!segments[segmentInd]) {
if (mask.cl) {
pointInd = 0;
segmentInd = 0;
points = segments[segmentInd].bezierData.points;
} else {
points = null;
}
} else {
points = segments[segmentInd].bezierData.points;
}
}
if (points) {
prevPoint = currentPoint;
currentPoint = points[pointInd];
partialLength = currentPoint.partialLength;
}
}
}
offf = letters[i].an/2 - letters[i].add;
}else{
matrixHelper.translate(xPos,yPos);
offf = letters[i].an/2 - letters[i].add;
matrixHelper.translate(offf,0);
matrixHelper.translate(renderedData.m.a[0]*letters[i].an/200, renderedData.m.a[1]*yOff/100);
}
lineLength += letters[i].l/2;
for(j=0;j<jLen;j+=1){
animatorProps = renderedData.a[j].a;
if ('t' in animatorProps && 's' in ranges[j]) {
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
if('m' in data.t.p) {
currentLength += animatorProps.t*mult;
}else{
xPos += animatorProps.t*mult;
}
}
}
lineLength += letters[i].l/2;
for(j=0;j<jLen;j+=1){
animatorProps = renderedData.a[j].a;
if ('p' in animatorProps && 's' in ranges[j]) {
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
if('m' in data.t.p) {
matrixHelper.translate(0, animatorProps.p[1] * mult);
}else{
matrixHelper.translate(animatorProps.p[0] * mult, animatorProps.p[1] * mult);
}
}
}
if(documentData.strokeWidthAnim) {
sw = data.t.d.sw || 0;
}
if(documentData.strokeColorAnim) {
if(data.t.d.sc){
sc = [data.t.d.sc[0], data.t.d.sc[1], data.t.d.sc[2]];
}else{
sc = [0,0,0];
}
}
if(documentData.fillColorAnim) {
fc = [data.t.d.fc[0], data.t.d.fc[1], data.t.d.fc[2]];
}
for(j=0;j<jLen;j+=1) {
animatorProps = renderedData.a[j].a;
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
if ('r' in animatorProps && 's' in ranges[j]) {
matrixHelper.rotate(animatorProps.r*mult*Math.PI/180);
}
if ('o' in animatorProps && 's' in ranges[j]) {
elemOpacity += ((animatorProps.o/100)*mult - elemOpacity)*mult;
}
if (documentData.strokeWidthAnim && 'sw' in animatorProps && 's' in ranges[j]) {
sw += animatorProps.sw*mult;
}
if (documentData.strokeColorAnim && 'sc' in animatorProps && 's' in ranges[j]) {
for(k=0;k<3;k+=1){
sc[k] = Math.round(sc[k] + (animatorProps.sc[k] - sc[k])*mult);
}
}
if (documentData.fillColorAnim && 'fc' in animatorProps && 's' in ranges[j]) {
for(k=0;k<3;k+=1){
fc[k] = Math.round(fc[k] + (animatorProps.fc[k] - fc[k])*mult);
}
}
}
if(documentData.strokeWidthAnim){
letterSw = sw < 0 ? 0 : sw;
}
if(documentData.strokeColorAnim){
letterSc = 'rgb('+sc[0]+','+sc[1]+','+sc[2]+')';
}
if(documentData.fillColorAnim){
letterFc = 'rgb('+fc[0]+','+fc[1]+','+fc[2]+')';
}
for(j=0;j<jLen;j+=1){
animatorProps = renderedData.a[j].a;
if ('s' in animatorProps && 's' in ranges[j]) {
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
matrixHelper.scale(1+((animatorProps.s[0]/100-1)*mult),1+((animatorProps.s[1]/100-1)*mult));
}
}
for(j=0;j<jLen;j+=1){
animatorProps = renderedData.a[j].a;
if ('a' in animatorProps && 's' in ranges[j]) {
mult = getMult(letters[i].anIndexes[j],ranges[j].s,ranges[j].e,ranges[j].ne,ranges[j].xe,data.t.a[j].s.sh);
matrixHelper.translate(-animatorProps.a[0]*mult, -animatorProps.a[1]*mult);
}
}
if('m' in data.t.p) {
matrixHelper.translate(-renderedData.m.a[0]*letters[i].an/200, -renderedData.m.a[1]*yOff/100);
currentLength -= renderedData.m.a[0]*letters[i].an/200;
if(letters[i+1] && ind !== letters[i+1].ind){
currentLength += letters[i].an / 2;
currentLength += documentData.tr/1000*data.t.d.s;
}
matrixHelper.translate(-offf,0);
}else{
matrixHelper.translate(-offf,0);
matrixHelper.translate(-renderedData.m.a[0]*letters[i].an/200,-renderedData.m.a[1]*yOff/100);
xPos += letters[i].l + documentData.tr/1000*data.t.d.s;
}
if(renderType === 'svg'){
letterM = matrixHelper.toCSS();
}else{
letterP = [matrixHelper.props[0],matrixHelper.props[1],matrixHelper.props[2],matrixHelper.props[3],matrixHelper.props[4],matrixHelper.props[5]];
}
letterO = elemOpacity;
if(lastLetters){
lastLetter = lastLetters[i];
if(lastLetter.o !== letterO || lastLetter.sw !== letterSw || lastLetter.sc !== letterSc || lastLetter.fc !== letterFc){
lettersChangedFlag = true;
letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,letterM,letterP);
}else{
if(renderType === 'svg' && lastLetter.m !== letterM){
lettersChangedFlag = true;
letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,letterM);
}else if(renderType !== 'svg' && (lastLetter.props[1] !== matrixHelper.props[1] || lastLetter.props[2] !== matrixHelper.props[2] || lastLetter.props[3] !== matrixHelper.props[3] || lastLetter.props[4] !== matrixHelper.props[4] || lastLetter.props[5] !== matrixHelper.props[5])){
lettersChangedFlag = true;
letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,null,[matrixHelper.props[0],matrixHelper.props[1],matrixHelper.props[2],matrixHelper.props[3],matrixHelper.props[4],matrixHelper.props[5]]);
}else{
letterValue = lastLetter;
}
}
}else{
lettersChangedFlag = true;
letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,letterM,letterP);
}
lettersValue[i] = letterValue;
}
}
if(lettersChangedFlag){
data.renderedData[num].t.l = lettersValue;
data._letters = lettersValue;
}else{
data.renderedData[num].t.l = lastLetters;
}
}
var emptyProp = new LetterProps();
ob.getMeasures = getMeasures;
return ob;
}());