blob: fb32f8de46b80fbe54427b24e931b696008947bc [file] [log] [blame]
/*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global bm_keyframeHelper, bm_eventDispatcher*/
var bm_shapeHelper = (function () {
'use strict';
var ob = {}, shapeItemTypes = {
shape: 'sh',
rect: 'rc',
ellipse: 'el',
fill: 'fl',
stroke: 'st',
merge: 'mm',
trim: 'tm',
group: 'gr'
};
function getItemType(matchName) {
switch (matchName) {
case 'ADBE Vector Shape - Group':
return shapeItemTypes.shape;
case 'ADBE Vector Shape - Rect':
return shapeItemTypes.rect;
case 'ADBE Vector Shape - Ellipse':
return shapeItemTypes.ellipse;
case 'ADBE Vector Graphic - Fill':
return shapeItemTypes.fill;
case 'ADBE Vector Graphic - Stroke':
return shapeItemTypes.stroke;
case 'ADBE Vector Graphic - Merge':
return shapeItemTypes.merge;
case 'ADBE Vector Graphic - Trim':
case 'ADBE Vector Filter - Trim':
return shapeItemTypes.trim;
case 'ADBE Vector Group':
return shapeItemTypes.group;
default:
return '';
}
}
function reverseShape(ks) {
var newI = [], newO = [], newV = [];
var i, len;
if (ks.i) {
newI[0] = ks.o[0];
newO[0] = ks.i[0];
newV[0] = ks.v[0];
len = ks.i.length;
var cnt = len - 1;
for (i = 1; i < len; i += 1) {
newI.push(ks.o[cnt]);
newO.push(ks.i[cnt]);
newV.push(ks.v[cnt]);
cnt -= 1;
}
ks.i = newI;
ks.o = newO;
ks.v = newV;
} else {
len = ks.length;
for (i = 0; i < len - 1; i += 1) {
reverseShape(ks[i].s[0]);
reverseShape(ks[i].e[0]);
}
}
}
function iterateProperties(iteratable, array, frameRate) {
var i, len = iteratable.numProperties, ob, prop, itemType;
for (i = 0; i < len; i += 1) {
prop = iteratable.property(i + 1);
if (prop.enabled) {
itemType = getItemType(prop.matchName);
if (itemType === shapeItemTypes.shape) {
ob = {};
ob.ty = itemType;
ob.closed = prop.property('Path').value.closed;
ob.ks = bm_keyframeHelper.exportKeyframes(prop.property('Path'), frameRate);
if (prop.property("Shape Direction").value === 3) {
reverseShape(ob.ks);
}
array.push(ob);
} else if (itemType === shapeItemTypes.rect) {
ob = {};
ob.ty = itemType;
ob.d = prop.property("Shape Direction").value;
ob.s = bm_keyframeHelper.exportKeyframes(prop.property('Size'), frameRate);
ob.p = bm_keyframeHelper.exportKeyframes(prop.property('Position'), frameRate);
ob.r = bm_keyframeHelper.exportKeyframes(prop.property('Roundness'), frameRate);
array.push(ob);
} else if (itemType === shapeItemTypes.ellipse) {
ob = {};
ob.d = prop.property("Shape Direction").value;
ob.ty = itemType;
ob.s = bm_keyframeHelper.exportKeyframes(prop.property('Size'), frameRate);
ob.p = bm_keyframeHelper.exportKeyframes(prop.property('Position'), frameRate);
array.push(ob);
} else if (itemType === shapeItemTypes.fill) {
ob = {};
ob.ty = itemType;
ob.fillEnabled = prop.enabled;
ob.c = bm_keyframeHelper.exportKeyframes(prop.property('Color'), frameRate);
ob.o = bm_keyframeHelper.exportKeyframes(prop.property('Opacity'), frameRate);
array.push(ob);
} else if (itemType === shapeItemTypes.stroke) {
ob = {};
ob.ty = itemType;
ob.fillEnabled = prop.enabled;
ob.c = bm_keyframeHelper.exportKeyframes(prop.property('Color'), frameRate);
ob.o = bm_keyframeHelper.exportKeyframes(prop.property('Opacity'), frameRate);
ob.w = bm_keyframeHelper.exportKeyframes(prop.property('Stroke Width'), frameRate);
ob.lc = prop.property('Line Cap').value;
ob.lj = prop.property('Line Join').value;
if (ob.lj === 1) {
ob.ml = prop.property('Miter Limit').value;
}
var j, jLen = prop.property('Dashes').numProperties;
var dashesData = [];
var changed = false;
for (j = 0; j < jLen; j += 1) {
if (prop.property('Dashes').property(j + 1).numKeys > 0 || (prop.property('Dashes').property(j + 1).name === 'Offset' && changed)) {
changed = true;
var dashData = {};
var name = '';
if (prop.property('Dashes').property(j + 1).name === 'Dash') {
name = 'd';
} else if (prop.property('Dashes').property(j + 1).name === 'Gap') {
name = 'g';
} else if (prop.property('Dashes').property(j + 1).name === 'Offset') {
name = 'o';
}
dashData.n = name;
dashData.v = bm_keyframeHelper.exportKeyframes(prop.property('Dashes').property(j + 1), frameRate);
dashesData.push(dashData);
}
}
if (changed) {
ob.d = dashesData;
}
array.push(ob);
} else if (itemType === shapeItemTypes.merge) {
ob = {};
ob.ty = itemType;
ob.mm = prop.property('ADBE Vector Merge Type').value;
array.push(ob);
} else if (itemType === shapeItemTypes.trim) {
ob = {};
ob.ty = itemType;
ob.s = bm_keyframeHelper.exportKeyframes(prop.property('Start'), frameRate);
ob.e = bm_keyframeHelper.exportKeyframes(prop.property('End'), frameRate);
ob.o = bm_keyframeHelper.exportKeyframes(prop.property('Offset'), frameRate);
ob.m = prop.property('Trim Multiple Shapes').value;
array.push(ob);
} else if (itemType === shapeItemTypes.group) {
ob = {
ty : itemType,
it: []
};
iterateProperties(prop.property('Contents'), ob.it, frameRate);
var trOb = {};
var transformProperty = prop.property('Transform');
trOb.ty = 'tr';
trOb.p = bm_keyframeHelper.exportKeyframes(transformProperty.property('Position'), frameRate);
trOb.a = bm_keyframeHelper.exportKeyframes(transformProperty.property('Anchor Point'), frameRate);
trOb.s = bm_keyframeHelper.exportKeyframes(transformProperty.property('Scale'), frameRate);
trOb.r = bm_keyframeHelper.exportKeyframes(transformProperty.property('Rotation'), frameRate);
trOb.o = bm_keyframeHelper.exportKeyframes(transformProperty.property('Opacity'), frameRate);
ob.it.push(trOb);
array.push(ob);
}
}
}
}
function exportShape(layerInfo, layerOb, frameRate) {
var shapes = [], contents = layerInfo.property('Contents');
layerOb.shapes = shapes;
iterateProperties(contents, shapes, frameRate);
}
ob.exportShape = exportShape;
return ob;
}());