blob: 1224750be6cd3d1defbe1e9ec87c4b431617b18a [file] [log] [blame]
function dataFunctionManager(){
//var tCanvasHelper = document.createElement('canvas').getContext('2d');
function completeLayers(layers, comps, fontManager){
var layerData;
var animArray, lastFrame;
var i, len = layers.length;
var j, jLen, k, kLen;
for(i=0;i<len;i+=1){
layerData = layers[i];
if(!('ks' in layerData) || layerData.completed){
continue;
}
layerData.completed = true;
if(layerData.tt){
layers[i-1].td = layerData.tt;
}
animArray = [];
lastFrame = -1;
if(layerData.hasMask){
var maskProps = layerData.masksProperties;
jLen = maskProps.length;
for(j=0;j<jLen;j+=1){
if(maskProps[j].pt.k.i){
convertPathsToAbsoluteValues(maskProps[j].pt.k);
}else{
kLen = maskProps[j].pt.k.length;
for(k=0;k<kLen;k+=1){
if(maskProps[j].pt.k[k].s){
convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);
}
if(maskProps[j].pt.k[k].e){
convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]);
}
}
}
}
}
if(layerData.ty===0){
layerData.layers = findCompLayers(layerData.refId, comps);
completeLayers(layerData.layers,comps, fontManager);
}else if(layerData.ty === 4){
completeShapes(layerData.shapes);
}else if(layerData.ty == 5){
completeText(layerData, fontManager);
}
}
}
function findCompLayers(id,comps){
var i = 0, len = comps.length;
while(i<len){
if(comps[i].id === id){
return comps[i].layers;
}
i += 1;
}
}
function completeShapes(arr){
var i, len = arr.length;
var j, jLen;
var hasPaths = false;
for(i=len-1;i>=0;i-=1){
if(arr[i].ty == 'sh'){
if(arr[i].ks.k.i){
convertPathsToAbsoluteValues(arr[i].ks.k);
}else{
jLen = arr[i].ks.k.length;
for(j=0;j<jLen;j+=1){
if(arr[i].ks.k[j].s){
convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);
}
if(arr[i].ks.k[j].e){
convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]);
}
}
}
hasPaths = true;
}else if(arr[i].ty == 'gr'){
completeShapes(arr[i].it);
}
}
if(hasPaths){
//mx: distance
//ss: sensitivity
//dc: decay
/*arr.push({
"ty": "ms",
"mx":20,
"ss":10,
"dc":0.001,
"maxDist":200
});*/
}
}
function convertPathsToAbsoluteValues(path){
var i, len = path.i.length;
for(i=0;i<len;i+=1){
path.i[i][0] += path.v[i][0];
path.i[i][1] += path.v[i][1];
path.o[i][0] += path.v[i][0];
path.o[i][1] += path.v[i][1];
}
}
function checkVersion(minimum,animVersionString){
var animVersion = animVersionString ? animVersionString.split('.') : [100,100,100];
if(minimum[0]>animVersion[0]){
return true;
} else if(animVersion[0] > minimum[0]){
return false;
}
if(minimum[1]>animVersion[1]){
return true;
} else if(animVersion[1] > minimum[1]){
return false;
}
if(minimum[2]>animVersion[2]){
return true;
} else if(animVersion[2] > minimum[2]){
return false;
}
}
var checkColors = (function(){
var minimumVersion = [4,1,9];
function iterateShapes(shapes){
var i, len = shapes.length;
var j, jLen;
for(i=0;i<len;i+=1){
if(shapes[i].ty === 'gr'){
iterateShapes(shapes[i].it);
}else if(shapes[i].ty === 'fl' || shapes[i].ty === 'st'){
if(shapes[i].c.k && shapes[i].c.k[0].i){
jLen = shapes[i].c.k.length;
for(j=0;j<jLen;j+=1){
if(shapes[i].c.k[j].s){
shapes[i].c.k[j].s[0] /= 255;
shapes[i].c.k[j].s[1] /= 255;
shapes[i].c.k[j].s[2] /= 255;
shapes[i].c.k[j].s[3] /= 255;
}
if(shapes[i].c.k[j].e){
shapes[i].c.k[j].e[0] /= 255;
shapes[i].c.k[j].e[1] /= 255;
shapes[i].c.k[j].e[2] /= 255;
shapes[i].c.k[j].e[3] /= 255;
}
}
} else {
shapes[i].c.k[0] /= 255;
shapes[i].c.k[1] /= 255;
shapes[i].c.k[2] /= 255;
shapes[i].c.k[3] /= 255;
}
}
}
}
function iterateLayers(layers){
var i, len = layers.length;
for(i=0;i<len;i+=1){
if(layers[i].ty === 4){
iterateShapes(layers[i].shapes);
}
}
}
return function (animationData){
if(checkVersion(minimumVersion,animationData.v)){
iterateLayers(animationData.layers);
if(animationData.assets){
var i, len = animationData.assets.length;
for(i=0;i<len;i+=1){
if(animationData.assets[i].layers){
iterateLayers(animationData.assets[i].layers);
}
}
}
}
}
}());
/*function blitPaths(path){
var i, len = path.i.length;
for(i=0;i<len;i+=1){
path.i[i][0] /= blitter;
path.i[i][1] /= blitter;
path.o[i][0] /= blitter;
path.o[i][1] /= blitter;
path.v[i][0] /= blitter;
path.v[i][1] /= blitter;
}
}
function blitShapes(arr){
var i, len = arr.length;
var j, jLen;
var hasPaths = false;
for(i=len-1;i>=0;i-=1){
if(arr[i].ty == 'sh'){
if(arr[i].ks.k.i){
blitPaths(arr[i].ks.k);
}else{
jLen = arr[i].ks.k.length;
for(j=0;j<jLen;j+=1){
if(arr[i].ks.k[j].s){
blitPaths(arr[i].ks.k[j].s[0]);
}
if(arr[i].ks.k[j].e){
blitPaths(arr[i].ks.k[j].e[0]);
}
}
}
hasPaths = true;
}else if(arr[i].ty == 'gr'){
blitShapes(arr[i].it);
}else if(arr[i].ty == 'rc'){
blitProperty(arr[i].p);
blitProperty(arr[i].s);
}else if(arr[i].ty == 'st'){
blitProperty(arr[i].w);
}else if(arr[i].ty == 'tr'){
blitProperty(arr[i].p);
blitProperty(arr[i].sk);
blitProperty(arr[i].a);
}else if(arr[i].ty == 'el'){
blitProperty(arr[i].p);
blitProperty(arr[i].s);
}else if(arr[i].ty == 'rd'){
blitProperty(arr[i].r);
}else{
//console.log(arr[i].ty );
}
}
}
function blitText(data, fontManager){
}
function blitValue(val){
if(typeof(val) === 'number'){
val /= blitter;
} else {
var i = val.length-1;
while(i>=0){
val[i] /= blitter;
i-=1;
}
}
return val;
}
function blitProperty(data){
if(!data.k.length){
data.k = blitValue(data.k);
}else if(typeof(data.k[0]) === 'number'){
data.k = blitValue(data.k);
} else {
var i, len = data.k.length;
for(i=0;i<len;i+=1){
if(data.k[i].s){
//console.log('pre S: ', data.k[i].s);
data.k[i].s = blitValue(data.k[i].s);
//console.log('post S: ', data.k[i].s);
}
if(data.k[i].e){
//console.log('pre E: ', data.k[i].e);
data.k[i].e = blitValue(data.k[i].e);
//console.log('post E: ', data.k[i].e);
}
}
}
}
function blitLayers(layers,comps, fontManager){
var layerData;
var animArray, lastFrame;
var i, len = layers.length;
var j, jLen, k, kLen;
for(i=0;i<len;i+=1){
layerData = layers[i];
if(!('ks' in layerData)){
continue;
}
blitProperty(layerData.ks.a);
blitProperty(layerData.ks.p);
layerData.completed = true;
if(layerData.tt){
layers[i-1].td = layerData.tt;
}
animArray = [];
lastFrame = -1;
if(layerData.hasMask){
var maskProps = layerData.masksProperties;
jLen = maskProps.length;
for(j=0;j<jLen;j+=1){
if(maskProps[j].pt.k.i){
blitPaths(maskProps[j].pt.k);
}else{
kLen = maskProps[j].pt.k.length;
for(k=0;k<kLen;k+=1){
if(maskProps[j].pt.k[k].s){
blitPaths(maskProps[j].pt.k[k].s[0]);
}
if(maskProps[j].pt.k[k].e){
blitPaths(maskProps[j].pt.k[k].e[0]);
}
}
}
}
}
if(layerData.ty===0){
layerData.w = Math.round(layerData.w/blitter);
layerData.h = Math.round(layerData.h/blitter);
blitLayers(layerData.layers,comps, fontManager);
}else if(layerData.ty === 4){
blitShapes(layerData.shapes);
}else if(layerData.ty == 5){
blitText(layerData, fontManager);
}else if(layerData.ty == 1){
layerData.sh /= blitter;
layerData.sw /= blitter;
} else {
}
}
}
function blitAnimation(animationData,comps, fontManager){
blitLayers(animationData.layers,comps, fontManager);
}*/
function completeData(animationData, fontManager){
if(animationData.__complete){
return;
}
checkColors(animationData);
completeLayers(animationData.layers, animationData.assets, fontManager);
animationData.__complete = true;
//blitAnimation(animationData, animationData.assets, fontManager);
}
function completeText(data, fontManager){
var letters = [];
var documentData = data.t.d;
var i, len;
var newLineFlag, index = 0, val;
var anchorGrouping = data.t.m.g;
var currentSize = 0, currentPos = 0, currentLine = 0, lineWidths = [];
var lineWidth = 0;
var maxLineWidth = 0;
var j, jLen;
var fontData = fontManager.getFontByName(documentData.f);
var charData, cLength = 0;
var styles = fontData.fStyle.split(' ');
var fWeight = 'normal', fStyle = 'normal';
len = styles.length;
for(i=0;i<len;i+=1){
if (styles[i].toLowerCase() === 'italic') {
fStyle = 'italic';
}else if (styles[i].toLowerCase() === 'bold') {
fWeight = '700';
} else if (styles[i].toLowerCase() === 'black') {
fWeight = '900';
} else if (styles[i].toLowerCase() === 'medium') {
fWeight = '500';
} else if (styles[i].toLowerCase() === 'regular' || styles[i].toLowerCase() === 'normal') {
fWeight = '400';
} else if (styles[i].toLowerCase() === 'light' || styles[i].toLowerCase() === 'thin') {
fWeight = '200';
}
}
documentData.fWeight = fWeight;
documentData.fStyle = fStyle;
len = documentData.t.length;
if(documentData.sz){
var fit = false;
var boxWidth = documentData.sz[0];
var boxHeight = documentData.sz[1];
var fontSize = documentData.s;
var lineH = documentData.lh || 1.2*fontSize;
var tmpCnt = fontSize;
documentData.mf = documentData.mf || 20;
var minFontSize = Math.min(documentData.mf,fontSize);
console.log('fontSize::', fontSize);
console.log('lineH::', lineH);
var lineHPerc = lineH/fontSize;
while(!fit){
lineWidth = 0;
maxLineWidth = 0;
tmpCnt += 1;
var lastSpaceIndex = -1;
var totalHeight = 0;
var documentText = documentData.t;
len = documentText.length;
for(i=0;i<len;i+=1){
newLineFlag = false;
if(documentText.charAt(i) === ' '){
lastSpaceIndex = i;
}else if(documentText.charCodeAt(i) === 13){
lineWidth = 0;
newLineFlag = true;
totalHeight += fontSize*lineHPerc;
}
if(fontManager.chars){
charData = fontManager.getCharData(documentText.charAt(i), fontData.fStyle, fontData.fFamily);
cLength = newLineFlag ? 0 : charData.w*fontSize/100;
}else{
//tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;
cLength = fontManager.measureText(documentText.charAt(i), documentData.f, fontSize);
}
if(lineWidth + cLength > boxWidth){
if(fontSize === minFontSize && totalHeight + fontSize*lineHPerc > boxHeight){
var charTimes = 1;
var ellipsisString = '…';
var ellipsisData = fontManager.getCharData('…', fontData.fStyle, fontData.fFamily);
if(!ellipsisData){
ellipsisData = fontManager.getCharData('.', fontData.fStyle, fontData.fFamily);
charTimes = 3;
ellipsisString = '...';
}
var ellipsisLength = ellipsisData ? charTimes*ellipsisData.w*fontSize/100 : 0;
ellipsisString = ellipsisData ? ellipsisString : '';
var lastChar = i;
while(lineWidth + ellipsisLength > boxWidth){
charData = fontManager.getCharData(documentText.charAt(lastChar), fontData.fStyle, fontData.fFamily);
cLength = charData.w*fontSize/100;
lineWidth -= cLength;
lastChar -= 1;
}
documentText = documentText.substr(0,lastChar) + ellipsisString;
break;
}
if(lastSpaceIndex === -1){
//i -= 1;
documentText = documentText.substr(0,i) + "\r" + documentText.substr(i);
len += 1;
}else {
i = lastSpaceIndex;
documentText = documentText.substr(0,i) + "\r" + documentText.substr(i+1);
}
lastSpaceIndex = -1;
lineWidth = 0;
totalHeight += fontSize*lineHPerc;
}else {
lineWidth += cLength;
}
}
totalHeight += fontSize;
if(totalHeight < boxHeight || fontSize<=minFontSize){
fit = true;
} else {
documentText = documentData.t;
fontSize -= 1;
}
}
documentData.s = fontSize;
documentData.lh = fontSize*lineHPerc;
documentData.t = documentText;
console.log('fontSize*lineHPerc', fontSize*lineHPerc);
console.log('fontSize', fontSize);
len = documentData.t.length;
}
lineWidth = 0;
cLength = 0;
for (i = 0;i < len ;i += 1) {
newLineFlag = false;
if(documentData.t.charAt(i) === ' '){
val = '\u00A0';
}else if(documentData.t.charCodeAt(i) === 13){
lineWidths.push(lineWidth);
maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
lineWidth = 0;
val = '';
newLineFlag = true;
currentLine += 1;
}else{
val = documentData.t.charAt(i);
}
if(fontManager.chars){
charData = fontManager.getCharData(documentData.t.charAt(i), fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);
cLength = newLineFlag ? 0 : charData.w*documentData.s/100;
}else{
//var charWidth = fontManager.measureText(val, documentData.f, documentData.s);
//tCanvasHelper.font = documentData.s + 'px '+ fontManager.getFontByName(documentData.f).fFamily;
cLength = fontManager.measureText(val, documentData.f, documentData.s);
}
//
lineWidth += cLength;
letters.push({l:cLength,an:cLength,add:currentSize,n:newLineFlag, anIndexes:[], val: val, line: currentLine});
if(anchorGrouping == 2){
currentSize += cLength;
if(val == '' || val == '\u00A0' || i == len - 1){
if(val == '' || val == '\u00A0'){
currentSize -= cLength;
}
while(currentPos<=i){
letters[currentPos].an = currentSize;
letters[currentPos].ind = index;
letters[currentPos].extra = cLength;
currentPos += 1;
}
index += 1;
currentSize = 0;
}
}else if(anchorGrouping == 3){
currentSize += cLength;
if(val == '' || i == len - 1){
if(val == ''){
currentSize -= cLength;
}
while(currentPos<=i){
letters[currentPos].an = currentSize;
letters[currentPos].ind = index;
letters[currentPos].extra = cLength;
currentPos += 1;
}
currentSize = 0;
index += 1;
}
}else{
letters[index].ind = index;
letters[index].extra = 0;
index += 1;
}
}
documentData.l = letters;
maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;
lineWidths.push(lineWidth);
if(documentData.sz){
documentData.boxWidth = documentData.sz[0];
data.t.d.justifyOffset = 0;
}else{
documentData.boxWidth = maxLineWidth;
switch(documentData.j){
case 1:
data.t.d.justifyOffset = - documentData.boxWidth;
break;
case 2:
data.t.d.justifyOffset = - documentData.boxWidth/2;
break;
default:
data.t.d.justifyOffset = 0;
}
}
documentData.lineWidths = lineWidths;
var animators = data.t.a;
jLen = animators.length;
var based, ind, indexes = [];
for(j=0;j<jLen;j+=1){
if(animators[j].a.sc){
documentData.strokeColorAnim = true;
}
if(animators[j].a.sw){
documentData.strokeWidthAnim = true;
}
if(animators[j].a.fc || animators[j].a.fh || animators[j].a.fs || animators[j].a.fb){
documentData.fillColorAnim = true;
}
ind = 0;
based = animators[j].s.b;
for(i=0;i<len;i+=1){
letters[i].anIndexes[j] = ind;
if((based == 1 && letters[i].val != '') || (based == 2 && letters[i].val != '' && letters[i].val != '\u00A0') || (based == 3 && (letters[i].n || letters[i].val == '\u00A0' || i == len - 1)) || (based == 4 && (letters[i].n || i == len - 1))){
if(animators[j].s.rn === 1){
indexes.push(ind);
}
ind += 1;
}
}
data.t.a[j].s.totalChars = ind;
var currentInd = -1, newInd;
if(animators[j].s.rn === 1){
for(i = 0; i < len; i += 1){
if(currentInd != letters[i].anIndexes[j]){
currentInd = letters[i].anIndexes[j];
newInd = indexes.splice(Math.floor(Math.random()*indexes.length),1)[0];
}
letters[i].anIndexes[j] = newInd;
}
}
}
if(jLen === 0 && !('m' in data.t.p)){
data.singleShape = true;
}
documentData.yOffset = documentData.lh || documentData.s*1.2;
documentData.ascent = fontData.ascent*documentData.s/100;
}
var moduleOb = {};
moduleOb.completeData = completeData;
return moduleOb;
}
var dataManager = dataFunctionManager();