blob: a395c5fa983d59d5879d0b8ca883c057d0a0c75c [file] [log] [blame]
/*jslint vars: true, plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global $, alertData, successData, bodymovin, mainController */
var importSVGController = (function () {
'use strict';
var ob = {};
var csInterface, svgContainer, view;
ob.importSVG = importSVG;
ob.init = init;
ob.show = show;
ob.hide = hide;
function importSVG() {
var eScript = 'bm_main.browseFile()';
csInterface.evalScript(eScript);
}
function deltaTransformPoint(matrix, point) {
var dx = point.x * matrix.a + point.y * matrix.c + 0;
var dy = point.x * matrix.b + point.y * matrix.d + 0;
return { x: dx, y: dy };
}
function decomposeMatrix(matrix) {
// @see https://gist.github.com/2052247
// calculate delta transform point
var px = deltaTransformPoint(matrix, { x: 0, y: 1 });
var py = deltaTransformPoint(matrix, { x: 1, y: 0 });
// calculate skew
var skewX = ((180 / Math.PI) * Math.atan2(px.y, px.x) - 90);
var skewY = ((180 / Math.PI) * Math.atan2(py.y, py.x));
return {
translateX: matrix.e,
translateY: matrix.f,
scaleX: Math.sqrt(matrix.a * matrix.a + matrix.b * matrix.b),
scaleY: Math.sqrt(matrix.c * matrix.c + matrix.d * matrix.d),
skewX: skewX,
skewY: skewY,
rotation: skewX // rotation is the same as skew x
};
}
var hexDigits = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
//Function to convert hex format to a rgb color
function rgb2hex(rgb) {
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
function hex(x) {
return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
}
function convertToHex(color){
var hexRegex = /^#(?:[0-9a-f]{3}){1,2}$/i;
if(hexRegex.test(color)){
if(color.length === 4){
var col1 = color.substr(1,1);
var col2 = color.substr(2,1);
var col3 = color.substr(3,1);
color = '#';
color += col1 + col1;
color += col2 + col2;
color += col3 + col3;
}
} else{
if(color.indexOf('(') === -1){
svgContainer.css('color',color);
color = getComputedStyle(svgContainer[0], null).color;
}
color = rgb2hex(color);
}
return color;
}
function getColor(elem){
//var color = elem.getAttribute('fill');
var color = getComputedStyle(elem, null).fill;
if(color){
color = convertToHex(color);
return color;
}
return null;
}
function getStrokeColor(elem){
//var color = elem.getAttribute('stroke');
var color = getComputedStyle(elem, null).stroke;
if(color){
color = convertToHex(color);
return color;
}
return null;
}
function getStrokeWidth(elem){
//var width = elem.getAttribute('stroke-width');
var width = getComputedStyle(elem, null).strokeWidth;
if(width){
width = parseFloat(width);
return width;
}
return null;
}
function getFillOpacity(elem){
//var opacity = elem.getAttribute('fill-opacity');
var opacity = getComputedStyle(elem, null).fillOpacity;
if(opacity){
return opacity;
}
return null;
}
function getOpacity(elem){
//var opacity = elem.getAttribute('opacity');
var opacity = getComputedStyle(elem, null).opacity;
if(opacity){
return opacity;
}
return null;
}
function getStrokeOpacity(elem){
//var opacity = elem.getAttribute('stroke-opacity');
var opacity = getComputedStyle(elem, null).strokeOpacity;
if(opacity){
return opacity;
}
return null;
}
function getTransformationMatrix(elem, matr){
var transform = getComputedStyle(elem, null).transform;
var transformAttr = elem.getAttribute('transform');
console.log('transformtransform: ',transform);
console.log('transformAttrtransformAttr: ',transformAttr);
}
function exportStyleAttributes(elem, ob){
ob.co = getColor(elem);
ob.fop = getFillOpacity(elem);
ob.op = getOpacity(elem);
ob.stOp = getStrokeOpacity(elem);
ob.stCo = getStrokeColor(elem);
ob.stW = getStrokeWidth(elem);
ob.id = elem.getAttribute('id');
if(ob.stCo !== "#876678"){
if(ob.stOp === 0) {
//ob.stOp = 1;
}
ob.st = true;
}
}
function exportMoveToSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y
}
}
function exportCubicToSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y,
x1: elem.x1,
y1: elem.y1,
x2: elem.x2,
y2: elem.y2
}
}
function exportCubicSmoothSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y,
x2: elem.x2,
y2: elem.y2
}
}
function exportQuadraticToSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y,
x1: elem.x1,
y1: elem.y1
}
}
function exportQuadraticSmoothSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y,
}
}
function exportLinetoVertical(elem){
return {
ty: elem.pathSegType,
y: elem.y
}
}
function exportLinetoHorizontal(elem){
return {
ty: elem.pathSegType,
x: elem.x
}
}
function exportLineToSegment(elem){
return {
ty: elem.pathSegType,
x: elem.x,
y: elem.y
}
}
function exportCloseSegment(elem){
return {
ty: elem.pathSegType
}
}
function exportG(elem){
var ob = {};
ob.ty = 'g';
exportStyleAttributes(elem,ob);
var m = new Matrix();
var transform = getComputedStyle(elem, null).transform;
var transformAttr = elem.getAttribute('transform');
console.log('transform: ',transform);
console.log('transformAttr: ',transformAttr);
ob.elems = iterateElems(elem);
return ob;
}
function exportPath(elem){
var ob = {};
ob.ty = 'path';
var segments = elem.pathSegList ;
var i, len = segments.length;
var segmentsData = [];
for (i = 0; i < len; i += 1) {
segmentsData.push(getSegmentData(segments[i]));
}
ob.segments = segmentsData;
exportStyleAttributes(elem,ob);
return ob;
}
function exportPolygon(elem){
var ob = {};
ob.ty = 'polygon';
var points = elem.getAttribute('points').trim();
var arr = points.split(' ');
var pointsArr = [];
var i, len = arr.length;
for (i = 0; i < len; i += 1) {
var pair = arr[i].split(',');
pointsArr.push(pair);
}
ob.points = pointsArr;
exportStyleAttributes(elem,ob);
return ob;
}
function exportPolyline(elem){
var ob = {};
ob.ty = 'polyline';
var points = elem.getAttribute('points').trim();
var arr = points.split(' ');
var pointsArr = [];
var i, len = arr.length;
for (i = 0; i < len; i += 1) {
var pair = arr[i].split(',');
pointsArr.push(pair);
}
ob.points = pointsArr;
exportStyleAttributes(elem,ob);
return ob;
}
function exportLine(elem){
var ob = {};
ob.ty = 'polyline';
var x1 = elem.getAttribute('x1');
var x2 = elem.getAttribute('x2');
var y1 = elem.getAttribute('y1');
var y2 = elem.getAttribute('y2');
ob.points = [[x1,y1],[x2,y2]];
exportStyleAttributes(elem,ob);
return ob;
}
function exportRect(elem){
var ob = {};
ob.ty = 'rect';
ob.x = elem.getAttribute('x') || 0;
ob.y = elem.getAttribute('y') || 0;
ob.width = elem.getAttribute('width');
ob.height = elem.getAttribute('height');
ob.rx = elem.getAttribute('rx') || elem.getAttribute('ry');
exportStyleAttributes(elem,ob);
return ob;
}
function exportEllipse(elem){
var ob = {};
ob.ty = 'ellipse';
ob.cx = elem.getAttribute('cx') || 0;
ob.cy = elem.getAttribute('cy') || 0;
ob.rx = elem.getAttribute('rx');
ob.ry = elem.getAttribute('ry');
exportStyleAttributes(elem,ob);
return ob;
}
function exportCircle(elem){
var ob = {};
ob.ty = 'ellipse';
ob.cx = elem.getAttribute('cx') || 0;
ob.cy = elem.getAttribute('cy') || 0;
ob.rx = elem.getAttribute('r');
ob.ry = ob.rx;
exportStyleAttributes(elem,ob);
return ob;
}
function getSegmentData(elem){
var ob = {};
switch(elem.pathSegType) {
case 1:
return exportCloseSegment(elem);
break;
case 2:
return exportMoveToSegment(elem);
break;
case 4:
case 5:
return exportLineToSegment(elem);
break;
case 6:
case 7:
return exportCubicToSegment(elem);
break;
case 12:
case 13:
return exportLinetoHorizontal(elem);
break;
case 14:
case 15:
return exportLinetoVertical(elem);
break;
case 16:
case 17:
return exportCubicSmoothSegment(elem);
break;
case 18:
case 19:
return exportQuadraticSmoothSegment(elem);
break;
case 8:
case 9:
return exportQuadraticToSegment(elem);
break;
}
return ob;
}
function iterateElems(elem,m) {
var arr = [];
var children = elem.childNodes;
var i, len = children.length, child, elemData;
for( i = 0; i < len; i += 1) {
child = children[i];
elemData = null;
var ty = child.nodeName;
switch(ty) {
case 'g':
elemData = exportG(child);
break;
case 'path':
elemData = exportPath(child);
break;
case 'polygon':
elemData = exportPolygon(child);
break;
case 'polyline':
elemData = exportPolyline(child);
break;
case 'line':
elemData = exportLine(child);
break;
case 'rect':
elemData = exportRect(child);
break;
case 'ellipse':
elemData = exportEllipse(child);
break;
case 'circle':
elemData = exportCircle(child);
break;
}
if(elemData){
elemData.tr = getTransformationMatrix(elem, m);
arr.push(elemData);
}
}
return arr;
}
function addToDOM(data, name) {
//data = '<style type="text/css">*{opacity:0.91232123}</style>' + data;
svgContainer.html(data);
var svgSelector = svgContainer.find('svg');
if (!svgSelector.length) {
return;
}
var svgElem = svgSelector[0];
var w, h;
var viewBox = svgElem.getAttribute('viewBox');
if (!viewBox) {
w = parseInt(svgElem.getAttribute('width'), 10);
h = parseInt(svgElem.getAttribute('height'), 10);
} else {
var viewboxSizes = viewBox.split(' ');
w = parseInt(viewboxSizes[2], 10);
h = parseInt(viewboxSizes[3], 10);
}
var svgData = {
w: w,
h: h,
name: name,
elems: []
};
var mat = new Matrix();
svgData.elems = iterateElems(svgElem, mat);
var eScript = 'bm_svgImporter.createSvg(' + JSON.stringify(svgData) + ')';
csInterface.evalScript(eScript);
}
function loadSVG(path, name) {
var xhr = new XMLHttpRequest();
xhr.open('GET', path, true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
addToDOM(xhr.responseText, name);
} else {
try {
addToDOM(xhr.responseText, name);
} catch (err) {
}
}
}
};
}
function handleFileUri(ev) {
console.log(ev.data);
loadSVG(ev.data.path, ev.data.name);
}
function show(){
csInterface.addEventListener('bm:file:uri', handleFileUri);
view.show();
}
function hide(){
csInterface.removeEventListener('bm:file:uri', handleFileUri);
view.hide();
}
function showSelection() {
mainController.showView('selection');
}
function init(csI) {
view = $("#svgImporter");
view.hide();
csInterface = csI;
svgContainer = $('#svgContainer');
svgContainer.on('click', function(){
svgContainer.html('');
})
var button = $('#svgImporter .buttons .import');
button.on('click', importSVG);
var backButton = $('#svgImporter .buttons .return');
backButton.on('click', showSelection);
}
return ob;
}
());