blob: 387b902eaff1175cb018c8d7648bff7459d16b1a [file] [log] [blame]
var bm_ProjectHelper = (function(){
var fileString = '';
var ob = {};
ob.init = init;
ob.getGradientData = getGradientData;
ob.end = end;
function init(){
fileString = '';
}
function end(){
fileString = '';
}
function getProjectData(){
var proj = app.project;
var ff = proj.file;
var demoFile = new File(ff.absoluteURI);
demoFile.open('r', 'TEXT', '????');
fileString = demoFile.read(demoFile.length);
}
function getGradientData(shapeNavigation, numKeys){
if(!fileString){
getProjectData();
}
numKeys = numKeys ? numKeys : 1;
var gradientIndex = 0, navigationIndex = 0;
var i = 0, len = shapeNavigation.length;
while(i<len){
navigationIndex = fileString.indexOf(shapeNavigation[i],navigationIndex);
i += 1;
}
gradientIndex = fileString.indexOf('ADBE Vector Grad Colors',navigationIndex);
var gradFillIndex = fileString.indexOf('ADBE Vector Graphic - G-Fill',navigationIndex);
var gradStrokeIndex = fileString.indexOf('ADBE Vector Graphic - G-Stroke',navigationIndex);
var limitIndex;
if(gradStrokeIndex !== -1 && gradFillIndex !== -1){
limitIndex = Math.min(gradFillIndex,gradStrokeIndex);
} else {
limitIndex = Math.max(gradFillIndex,gradStrokeIndex);
}
if(limitIndex === -1){
limitIndex = Number.MAX_VALUE;
}
//var regEx = /<prop.map>/g;
var currentKey = 0, keyframes = [], hasOpacity = false, maxOpacities = 0, maxColors = 0;
while(currentKey < numKeys){
var gradientData = {};
gradientIndex = fileString.indexOf('<prop.map',gradientIndex);
if(gradientIndex > limitIndex || (gradientIndex == -1 && limitIndex == Number.MAX_VALUE)){
gradientData.c = [[0,1,1,1],[1,0,0,0]];
maxColors = Math.max(maxColors,2);
} else {
var endMatch = '</prop.map>';
var lastIndex = fileString.indexOf(endMatch,gradientIndex);
var xmlString = fileString.substr(gradientIndex,lastIndex+endMatch.length-gradientIndex);
xmlString = xmlString.replace(/\n/g,'');
var XML_Ob = new XML(xmlString);
var stops = XML_Ob['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'];
var colors = XML_Ob['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'][1]['prop.list'][0]['prop.pair'][0]['prop.list'][0]['prop.pair'];
i = 0;
len = stops.length();
var opacitiesArr = [],op, floats, nextFloats, midPoint, midPosition;
while(i<len){
floats = stops[i]['prop.list'][0]['prop.pair'][0]['array'][0].float;
op = [];
op.push(bm_generalUtils.roundNumber(Number(floats[0].toString()),3));
op.push(bm_generalUtils.roundNumber(Number(floats[2].toString()),3));
if(op[1] !== 1){
hasOpacity = true;
}
opacitiesArr.push(op);
midPosition = bm_generalUtils.roundNumber(Number(floats[1].toString()),3);
if(i<len-1 /*&& midPosition !== 0.5*/){
op = [];
nextFloats = stops[i+1]['prop.list'][0]['prop.pair'][0]['array'][0].float;
midPoint = Number(floats[0].toString()) + (Number(nextFloats[0].toString())-Number(floats[0].toString()))*midPosition;
var midPointValue = Number(floats[2].toString()) + (Number(nextFloats[2].toString())-Number(floats[2].toString()))*0.5;
op.push(bm_generalUtils.roundNumber(midPoint,3));
op.push(bm_generalUtils.roundNumber(midPointValue,3));
opacitiesArr.push(op);
}
i += 1;
}
i = 0;
len = colors.length();
var colorsArr = [];
while(i<len){
floats = colors[i]['prop.list'][0]['prop.pair'][0]['array'][0].float;
op = [];
op.push(bm_generalUtils.roundNumber(Number(floats[0].toString()),3));
op.push(bm_generalUtils.roundNumber(Number(floats[2].toString()),3));
op.push(bm_generalUtils.roundNumber(Number(floats[3].toString()),3));
op.push(bm_generalUtils.roundNumber(Number(floats[4].toString()),3));
colorsArr.push(op);
midPosition = bm_generalUtils.roundNumber(Number(floats[1].toString()),3);
if(i<len-1 /*&& midPosition !== 0.5*/){
op = [];
nextFloats = colors[i+1]['prop.list'][0]['prop.pair'][0]['array'][0].float;
midPoint = Number(floats[0].toString()) + (Number(nextFloats[0].toString())-Number(floats[0].toString()))*midPosition;
var midPointValueR = Number(floats[2].toString()) + (Number(nextFloats[2].toString())-Number(floats[2].toString()))*0.5;
var midPointValueG = Number(floats[3].toString()) + (Number(nextFloats[3].toString())-Number(floats[3].toString()))*0.5;
var midPointValueB = Number(floats[4].toString()) + (Number(nextFloats[4].toString())-Number(floats[4].toString()))*0.5;
op.push(bm_generalUtils.roundNumber(midPoint,3));
op.push(bm_generalUtils.roundNumber(midPointValueR,3));
op.push(bm_generalUtils.roundNumber(midPointValueG,3));
op.push(bm_generalUtils.roundNumber(midPointValueB,3));
colorsArr.push(op);
}
i += 1;
}
gradientData.c = colorsArr;
gradientData.o = opacitiesArr;
maxOpacities = Math.max(maxOpacities,opacitiesArr.length);
maxColors = Math.max(maxColors,colorsArr.length);
}
gradientIndex = lastIndex;
keyframes.push(gradientData);
currentKey += 1;
}
i = 0;
var arr, arrayLength,count,lastValue,offsetValue, mergedKeys = [], mergedArr, j;
while(i<numKeys){
mergedArr = [];
if(keyframes[i].c.length < maxColors){
arr = keyframes[i].c;
arrayLength = arr.length;
lastValue = arr[arrayLength - 1];
offsetValue = lastValue[0];
count = 0;
while(arrayLength + count<maxColors){
offsetValue -= 0.001;
arr.splice(arrayLength-1,0,[offsetValue,lastValue[1],lastValue[2],lastValue[3]]);
count += 1;
}
}
for(j=0;j<maxColors;j+=1){
for(var k = 0; k < 4; k += 1){
mergedArr.push(keyframes[i].c[j][k]);
}
}
if(!hasOpacity){
delete keyframes[i].o;
} else {
if(keyframes[i].o.length < maxOpacities){
arr = keyframes[i].o;
arrayLength = arr.length;
lastValue = arr[arrayLength - 1];
offsetValue = lastValue[0];
count = 0;
while(arrayLength + count<maxOpacities){
offsetValue -= 0.001;
arr.splice(arrayLength-1,0,[offsetValue,lastValue[1],lastValue[2],lastValue[3]]);
count += 1;
}
}
for(j=0;j<maxOpacities;j+=1){
for(var k = 0; k < 2; k += 1){
mergedArr.push(keyframes[i].o[j][k]);
}
}
}
if(numKeys <= 1){
mergedKeys = mergedArr;
} else {
mergedKeys.push(mergedArr);
}
i += 1;
}
return {
m:mergedKeys,
p: maxColors
};
}
return ob;
}())