blob: f28994897de80b6836bf2c7e82d6ccdd1f687152 [file] [log] [blame]
var bm_svgImporter = (function () {
'use strict';
var ob = {};
ob.createSvg = createSvg;
function hexToR(h) {return parseInt((cutHex(h)).substring(0, 2), 16)}
function hexToG(h) {return parseInt((cutHex(h)).substring(2, 4), 16)}
function hexToB(h) {return parseInt((cutHex(h)).substring(4, 6), 16)}
function cutHex(h) {return (h.charAt(0) === "#") ? h.substring(1, 7) : h}
function addAttributes(group, data, inherited){
bm_eventDispatcher.log(inherited);
var color = data.co || inherited.co;
var R = hexToR(color);
var G = hexToG(color);
var B = hexToB(color);
var co = group.property("Contents").addProperty("ADBE Vector Graphic - Fill");
var prop = co.property('Color');
prop.setValue([R/255,G/255,B/255,1]);
var fop = data.fop || inherited.fop;
var opacityProperty = co.property('Opacity');
opacityProperty.setValue(fop*100);
if(data.st || inherited.st){
var st = group.property("Contents").addProperty("ADBE Vector Graphic - Stroke");
color = data.stCo || inherited.stCo;
R = hexToR(color);
G = hexToG(color);
B = hexToB(color);
prop = st.property('Color');
prop.setValue([R/255,G/255,B/255,1]);
op = data.stOp || inherited.stOp;
opacityProperty = st.property('Opacity');
opacityProperty.setValue(op*100);
var strokeWidthProperty = st.property('Stroke Width');
var stW = data.stW || inherited.stW;
strokeWidthProperty.setValue(stW);
}
addTransformAttributes(group, data, inherited);
}
function addTransformAttributes(group, data, inherited) {
var transformProperty = group.property('Transform');
var trOp = transformProperty.property('Opacity');
var op = data.op || inherited.op;
trOp.setValue(op*100);
}
function addPath(group, element, offsetX, offsetY, inherited) {
var gr = group.property("Contents").addProperty("ADBE Vector Group");
var path, i, len = element.segments.length;
var vertices = [], inPoints = [], outPoints = [];
var segmentOb, lastOb, count = 1, lastX = 0, lastY = 0;
//offsetX = offsetY = 0;
for( i = 0; i < len; i += 1) {
segmentOb = element.segments[i];
if (segmentOb.ty === 8) {
/*Control1X = StartX + (.66 * (ControlX - StartX))
Control2X = EndX + (.66 * (ControlX - EndX))*/
var c1x = lastX + (2/3*(segmentOb.x1 - lastX));
var c1y = lastY + (2/3*(segmentOb.y1 - lastY));
var c2x = segmentOb.x + (2/3*(segmentOb.x1 - segmentOb.x));
var c2y = segmentOb.y + (2/3*(segmentOb.y1 - segmentOb.y));
outPoints[count - 1] = [c1x - lastX,c1y - lastY];
vertices[count] = [segmentOb.x - offsetX,segmentOb.y - offsetY];
inPoints[count] = [c2x - segmentOb.x,c2y - segmentOb.y];
count += 1;
lastOb = segmentOb;
lastX = segmentOb.x;
lastY = segmentOb.y;
} else if (segmentOb.ty === 9) {
var x = segmentOb.x + lastX;
var y = segmentOb.y + lastY;
var x1 = segmentOb.x1 + lastX;
var y1 = segmentOb.y1 + lastY;
var c1x = lastX + (2/3*(x1 - lastX));
var c1y = lastY + (2/3*(y1 - lastY));
var c2x = x + (2/3*(x1 - x));
var c2y = y + (2/3*(y1 - y));
outPoints[count - 1] = [c1x - lastX,c1y - lastY];
vertices[count] = [x - offsetX,y - offsetY];
inPoints[count] = [c2x - x,c2y - y];
count += 1;
lastOb = segmentOb;
lastX = lastX + segmentOb.x;
lastY = lastY + segmentOb.y;
} else if (segmentOb.ty === 4) {
outPoints[count - 1] = [0,0];
vertices[count] = [segmentOb.x - offsetX,segmentOb.y - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = segmentOb.x;
lastY = segmentOb.y;
} else if (segmentOb.ty === 5) {
outPoints[count - 1] = [0,0];
vertices[count] = [lastX + segmentOb.x - offsetX,lastY + segmentOb.y - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = lastX + segmentOb.x;
lastY = lastY + segmentOb.y;
} else if (segmentOb.ty === 12) {
outPoints[count - 1] = [0,0];
vertices[count] = [segmentOb.x - offsetX, lastY - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = segmentOb.x;
lastY = lastY;
} else if (segmentOb.ty === 13) {
outPoints[count - 1] = [0,0];
vertices[count] = [lastX + segmentOb.x - offsetX, lastY - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = lastX + segmentOb.x;
lastY = lastY;
} else if (segmentOb.ty === 14) {
outPoints[count - 1] = [0,0];
vertices[count] = [lastX - offsetX,segmentOb.y - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = lastX;
lastY = segmentOb.y;
} else if (segmentOb.ty === 15) {
outPoints[count - 1] = [0,0];
vertices[count] = [lastX - offsetX,lastY + segmentOb.y - offsetY];
inPoints[count] = [0,0];
count += 1;
lastOb = segmentOb;
lastX = lastX;
lastY = lastY + segmentOb.y;
} else if(segmentOb.ty === 7) {
outPoints[count - 1] = [segmentOb.x1,segmentOb.y1];
vertices[count] = [segmentOb.x + lastX - offsetX,segmentOb.y + lastY - offsetY];
inPoints[count] = [lastX - (segmentOb.x + lastX) + segmentOb.x2, lastY - (segmentOb.y + lastY) + segmentOb.y2];
count += 1;
lastOb = segmentOb;
lastX = lastX + segmentOb.x;
lastY = lastY + segmentOb.y;
} else if (segmentOb.ty === 16) {
outPoints[count - 1] = [-inPoints[count - 1][0],-inPoints[count - 1][1]];
vertices[count] = [segmentOb.x - offsetX,segmentOb.y - offsetY];
inPoints[count] = [segmentOb.x2 - segmentOb.x,segmentOb.y2 - segmentOb.y];
count += 1;
lastOb = segmentOb;
lastX = segmentOb.x;
lastY = segmentOb.y;
} else if(segmentOb.ty === 17) {
outPoints[count - 1] = [-inPoints[count - 1][0],-inPoints[count - 1][1]];
vertices[count] = [segmentOb.x + lastX - offsetX,segmentOb.y + lastY - offsetY];
inPoints[count] = [lastX - (segmentOb.x + lastX) + segmentOb.x2, lastY - (segmentOb.y + lastY) + segmentOb.y2];
count += 1;
lastOb = segmentOb;
lastX = lastX + segmentOb.x;
lastY = lastY + segmentOb.y;
} else if (segmentOb.ty === 6) {
outPoints[count - 1] = [segmentOb.x1 - lastX,segmentOb.y1 - lastY];
vertices[count] = [segmentOb.x - offsetX,segmentOb.y - offsetY];
inPoints[count] = [segmentOb.x2 - segmentOb.x,segmentOb.y2 - segmentOb.y];
count += 1;
lastOb = segmentOb;
lastX = segmentOb.x;
lastY = segmentOb.y;
} else if (segmentOb.ty === 2) {
if(lastOb){
outPoints[count-1] = [0,0];
inPoints[0] = [0,0];
/*path.vertices = vertices;
path.inPoints = inPoints;
path.outPoints = outPoints;*/
var myShape = path.property('Path').value;
/*bm_eventDispatcher.log(vertices);
bm_eventDispatcher.log(inPoints);
bm_eventDispatcher.log(outPoints);*/
myShape.vertices = vertices;
myShape.inTangents = inPoints;
myShape.outTangents = outPoints;
myShape.closed = true;
path.property('Path').setValue(myShape);
}
path = gr.property("Contents").addProperty("ADBE Vector Shape - Group");
vertices = [];
inPoints = [];
outPoints = [];
vertices.push([segmentOb.x - offsetX,segmentOb.y - offsetY]);
lastX = segmentOb.x;
lastY = segmentOb.y;
count= 1;
}
}
if(lastOb){
outPoints[count-1] = [0,0];
inPoints[0] = [0,0];
/*path.vertices = vertices;
path.inPoints = inPoints;
path.outPoints = outPoints;*/
/*vertices = [[100,100],[200,100]];
outPoints = [[0,-100],[0,0]];
inPoints = [[0,0],[0,-100]];*/
/*bm_eventDispatcher.log(vertices);
bm_eventDispatcher.log(outPoints);
bm_eventDispatcher.log(inPoints);*/
var myShape = path.property('Path').value;
myShape.vertices = vertices;
myShape.inTangents = inPoints;
myShape.outTangents = outPoints;
myShape.closed = true;
path.property('Path').setValue(myShape);
}
addAttributes(gr, element, inherited);
}
function addPolygon(group, element, offsetX, offsetY, inherited){
var gr = group.property("Contents").addProperty("ADBE Vector Group");
var points = element.points;
var i, len = points.length;
var vertices = [];
var inPoints = [];
var outPoints = [];
for (i = 0; i < len; i += 1) {
vertices.push([points[i][0] - offsetX, points[i][1] - offsetY]);
inPoints.push([0, 0]);
outPoints.push([0, 0]);
}
var path = gr.property("Contents").addProperty("ADBE Vector Shape - Group");
var myShape = path.property('Path').value;
myShape.vertices = vertices;
myShape.inTangents = inPoints;
myShape.outTangents = outPoints;
myShape.closed = element.ty === 'polygon';
path.property('Path').setValue(myShape);
addAttributes(gr, element, inherited);
}
function addRect(group, element, offsetX, offsetY, inherited){
var gr = group.property("Contents").addProperty("ADBE Vector Group");
var rect = gr.property("Contents").addProperty("ADBE Vector Shape - Rect");
rect.property('Size').setValue([element.width,element.height]);
rect.property('Position').setValue([element.x - offsetX + element.width/2,element.y - offsetY + element.height/2]);
rect.property('Roundness').setValue(element.rx);
addAttributes(gr, element, inherited);
}
function addEllipse(group, element, offsetX, offsetY, inherited){
var gr = group.property("Contents").addProperty("ADBE Vector Group");
var ell = gr.property("Contents").addProperty("ADBE Vector Shape - Ellipse");
ell.property('Size').setValue([element.rx*2,element.ry*2]);
ell.property('Position').setValue([element.cx - offsetX,element.cy - offsetY]);
addAttributes(gr, element, inherited);
}
function addElements(group, data,offsetX,offsetY, inheritedData, isFirst){
var inherited = {
co: data.co || inheritedData.co,
fop: data.fop || inheritedData.fop,
stCo: data.stCo || inheritedData.stCo,
stOp: data.stOp || inheritedData.stOp,
stW: data.stW || inheritedData.stW,
st: data.st || inheritedData.st,
op: data.op || inheritedData.op
}
var elements = data.elems;
var gr;
var i, len = elements.length;
if(!isFirst){
gr = group.property("Contents").addProperty("ADBE Vector Group");
for(i = len - 1; i >= 0; i -= 1){
if(isFirst){
gr = group.layers.addShape();
}
if(elements[i].ty === 'g'){
addElements(gr,elements[i],offsetX,offsetY, inherited, false);
} else if(elements[i].ty === 'path'){
addPath(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'polygon' || elements[i].ty === 'polyline'){
addPolygon(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'rect'){
addRect(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'ellipse'){
addEllipse(gr,elements[i],offsetX,offsetY, inherited);
}
}
addTransformAttributes(gr, data, inherited);
} else {
for(i = 0; i < len; i += 1){
gr = group.layers.addShape();
if(elements[i].ty === 'g'){
addElements(gr,elements[i],offsetX,offsetY, inherited, false);
} else if(elements[i].ty === 'path'){
addPath(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'polygon' || elements[i].ty === 'polyline'){
addPolygon(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'rect'){
addRect(gr,elements[i],offsetX,offsetY, inherited);
} else if(elements[i].ty === 'ellipse'){
addEllipse(gr,elements[i],offsetX,offsetY, inherited);
}
if(elements[i].id){
gr.name = elements[i].id;
}
}
}
}
function createSvg(data) {
var comp = app.project.items.addComp('svg', data.w, data.h, 1, 1, 1);
comp.name = data.name;
//var shapeLayer = comp.layers.addShape();
var inheritedData = {
co: "#000000",
fop: 1,
stCo: "#000000",
stOp: 1,
stW: 1,
st: false,
op: 1,
}
addElements(comp, data, data.w/2,data.h/2, inheritedData, true);
}
return ob;
}())