From a779a74aa9917892fc465f4b2cec54bd4f219d77 Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Thu, 14 Feb 2013 15:19:46 +0000 Subject: [PATCH] Add fully qualified function calls, shuffle a couple tiny functions into svgutils.js, add an empty coords.js module for later git-svn-id: http://svg-edit.googlecode.com/svn/trunk@2390 eee81c28-f429-11dd-99c0-75d572ba1ddd --- Makefile | 1 + editor/coords.js | 27 +++ editor/svg-editor.html | 1 + editor/svgcanvas.js | 365 ++++++++++++++++++++--------------------- editor/svgutils.js | 22 ++- test/all_tests.html | 1 + test/coords_test.html | 38 +++++ 7 files changed, 262 insertions(+), 193 deletions(-) create mode 100644 editor/coords.js create mode 100644 test/coords_test.html diff --git a/Makefile b/Makefile index 52b55c68..091887a3 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ JS_FILES=\ svgutils.js \ sanitize.js \ history.js \ + coords.js \ select.js \ draw.js \ path.js \ diff --git a/editor/coords.js b/editor/coords.js new file mode 100644 index 00000000..e5cec667 --- /dev/null +++ b/editor/coords.js @@ -0,0 +1,27 @@ +/** + * Coords. + * + * Licensed under the MIT License + * + */ + +// Dependencies: +// 1) svgtransformlist.js +// 2) math.js +// 3) svgutils.js +// 4) jquery.js +// 5) history.js + +var svgedit = svgedit || {}; + +(function() { + +if (!svgedit.coords) { + svgedit.coords = {}; +} + +// TODO: Move remapElement() into here. +// TODO: Move updateClipPath() into here. +// TODO: Move recalculateDimensions() into here. + +})(); \ No newline at end of file diff --git a/editor/svg-editor.html b/editor/svg-editor.html index 2486f933..ff1c4c23 100644 --- a/editor/svg-editor.html +++ b/editor/svg-editor.html @@ -36,6 +36,7 @@ + diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 66c9d92d..5893ade3 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -313,6 +313,7 @@ svgedit.utilities.init({ getSelectedElements: function() { return selectedElements; }, getSVGContent: function() { return svgcontent; } }); +var findDefs = canvas.findDefs = svgedit.utilities.findDefs; var getUrlFromAttr = canvas.getUrlFromAttr = svgedit.utilities.getUrlFromAttr; var getHref = canvas.getHref = svgedit.utilities.getHref; var setHref = canvas.setHref = svgedit.utilities.setHref; @@ -320,6 +321,7 @@ var getPathBBox = svgedit.utilities.getPathBBox; var getBBox = canvas.getBBox = svgedit.utilities.getBBox; var getRotationAngle = canvas.getRotationAngle = svgedit.utilities.getRotationAngle; var getElem = canvas.getElem = svgedit.utilities.getElem; +var getRefElem = canvas.getRefElem = svgedit.utilities.getRefElem; var assignAttributes = canvas.assignAttributes = svgedit.utilities.assignAttributes; var cleanupElement = this.cleanupElement = svgedit.utilities.cleanupElement; @@ -457,10 +459,10 @@ var restoreRefElems = function(elem) { for(var o in attrs) { var val = attrs[o]; if (val && val.indexOf('url(') === 0) { - var id = getUrlFromAttr(val).substr(1); + var id = svgedit.utilities.getUrlFromAttr(val).substr(1); var ref = getElem(id); if(!ref) { - findDefs().appendChild(removedElements[id]); + svgedit.utilities.findDefs().appendChild(removedElements[id]); delete removedElements[id]; } } @@ -965,15 +967,6 @@ this.prepareSvg = function(newDoc) { } }; -// Function getRefElem -// Get the reference element associated with the given attribute value -// -// Parameters: -// attrVal - The attribute value as a string -var getRefElem = this.getRefElem = function(attrVal) { - return getElem(getUrlFromAttr(attrVal).substr(1)); -} - // Function: ffClone // Hack for Firefox bugs where text element features aren't updated or get // messed up. See issue 136 and issue 137. @@ -1017,7 +1010,7 @@ this.setRotationAngle = function(val, preventUndo) { var oldTransform = elem.getAttribute("transform"); var bbox = svgedit.utilities.getBBox(elem); var cx = bbox.x+bbox.width/2, cy = bbox.y+bbox.height/2; - var tlist = getTransformList(elem); + var tlist = svgedit.transformlist.getTransformList(elem); // only remove the real rotational transform if present (i.e. at index=0) if (tlist.numberOfItems > 0) { @@ -1028,7 +1021,7 @@ this.setRotationAngle = function(val, preventUndo) { } // find R_nc and insert it if (val != 0) { - var center = transformPoint(cx,cy,transformListToTransform(tlist).matrix); + var center = svgedit.math.transformPoint(cx,cy,svgedit.math.transformListToTransform(tlist).matrix); var R_nc = svgroot.createSVGTransform(); R_nc.setRotate(val, center.x, center.y); if(tlist.numberOfItems) { @@ -1049,7 +1042,7 @@ this.setRotationAngle = function(val, preventUndo) { changeSelectedAttribute("transform",newTransform,selectedElements); call("changed", selectedElements); } - var pointGripContainer = getElem("pathpointgrip_container"); + var pointGripContainer = svgedit.utilities.getElem("pathpointgrip_container"); // if(elem.nodeName == "path" && pointGripContainer) { // pathActions.setPointContainerTransform(elem.getAttribute("transform")); // } @@ -1068,7 +1061,7 @@ var recalculateAllSelectedDimensions = this.recalculateAllSelectedDimensions = f var i = selectedElements.length; while(i--) { var elem = selectedElements[i]; -// if(getRotationAngle(elem) && !hasMatrixTransform(getTransformList(elem))) continue; +// if(svgedit.utilities.getRotationAngle(elem) && !svgedit.math.hasMatrixTransform(getTransformList(elem))) continue; var cmd = recalculateDimensions(elem); if (cmd) { batchCmd.addSubCommand(cmd); @@ -1099,7 +1092,7 @@ var logMatrix = function(m) { // m - Matrix object to use for remapping coordinates var remapElement = this.remapElement = function(selected,changes,m) { - var remap = function(x,y) { return transformPoint(x,y,m); }, + var remap = function(x,y) { return svgedit.math.transformPoint(x,y,m); }, scalew = function(w) { return m.a*w; }, scaleh = function(h) { return m.d*h; }, doSnapping = curConfig.gridSnapping && selected.parentNode.parentNode.localName === "svg", @@ -1114,7 +1107,7 @@ var remapElement = this.remapElement = function(selected,changes,m) { var attrVal = selected.getAttribute(type); if(attrVal && attrVal.indexOf('url(') === 0) { if(m.a < 0 || m.d < 0) { - var grad = getRefElem(attrVal); + var grad = svgedit.utilities.getRefElem(attrVal); var newgrad = grad.cloneNode(true); if(m.a < 0) { @@ -1133,7 +1126,7 @@ var remapElement = this.remapElement = function(selected,changes,m) { newgrad.setAttribute('y2', -(y2 - 1)); } newgrad.id = getNextId(); - findDefs().appendChild(newgrad); + svgedit.utilities.findDefs().appendChild(newgrad); selected.setAttribute(type, 'url(#' + newgrad.id + ')'); } @@ -1146,23 +1139,37 @@ var remapElement = this.remapElement = function(selected,changes,m) { var elName = selected.tagName; - if(elName === "g" || elName === "text" || elName === "use") { + if(elName === "g" || elName === "text" || elName == "tspan" || elName === "use") { // if it was a translate, then just update x,y if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && (m.e != 0 || m.f != 0) ) { // [T][M] = [M][T'] // therefore [T'] = [M_inv][T][M] - var existing = transformListToTransform(selected).matrix, - t_new = matrixMultiply(existing.inverse(), m, existing); + var existing = svgedit.math.transformListToTransform(selected).matrix, + t_new = svgedit.math.matrixMultiply(existing.inverse(), m, existing); changes.x = parseFloat(changes.x) + t_new.e; changes.y = parseFloat(changes.y) + t_new.f; + // TODO(codedread): Special handing for tspans: + // + // + // ... + // + // + // + // Note that if the element's x/y coordinates are being + // adjusted, the tspan's x/y coordinates also need to be similarly + // transformed as the coordinate space is not nested: + // + // ... + // + } else { // we just absorb all matrices into the element and don't do any remapping - var chlist = getTransformList(selected); + var chlist = svgedit.transformlist.getTransformList(selected); var mt = svgroot.createSVGTransform(); - mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix,m)); + mt.setMatrix(matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix,m)); chlist.clear(); chlist.appendItem(mt); } @@ -1179,9 +1186,9 @@ var remapElement = this.remapElement = function(selected,changes,m) { // Allow images to be inverted (give them matrix when flipped) if(elName === 'image' && (m.a < 0 || m.d < 0)) { // Convert to matrix - var chlist = getTransformList(selected); + var chlist = svgedit.transformlist.getTransformList(selected); var mt = svgroot.createSVGTransform(); - mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix,m)); + mt.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix,m)); chlist.clear(); chlist.appendItem(mt); } else { @@ -1375,7 +1382,7 @@ var remapElement = this.remapElement = function(selected,changes,m) { var updateClipPath = function(attr, tx, ty) { var path = getRefElem(attr).firstChild; - var cp_xform = getTransformList(path); + var cp_xform = svgedit.transformlist.getTransformList(path); var newxlate = svgroot.createSVGTransform(); newxlate.setTranslate(tx, ty); @@ -1384,7 +1391,7 @@ var updateClipPath = function(attr, tx, ty) { // Update clipPath's dimensions recalculateDimensions(path); -} +}; // Function: recalculateDimensions // Decides the course of action based on the element's transform list @@ -1394,10 +1401,10 @@ var updateClipPath = function(attr, tx, ty) { // // Returns: // Undo command object with the resulting change -var recalculateDimensions = this.recalculateDimensions = function(selected) { +var recalculateDimensions = function(selected) { if (selected == null) return null; - var tlist = getTransformList(selected); + var tlist = svgedit.transformlist.getTransformList(selected); // remove any unnecessary transforms if (tlist && tlist.numberOfItems > 0) { @@ -1421,7 +1428,8 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { } } // End here if all it has is a rotation - if(tlist.numberOfItems === 1 && getRotationAngle(selected)) return null; + if(tlist.numberOfItems === 1 && + svgedit.utilities.getRotationAngle(selected)) return null; } // if this element had no transforms, we are done @@ -1443,7 +1451,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { } } if(mxs.length === 2) { - var m_new = svgroot.createSVGTransformFromMatrix(matrixMultiply(mxs[1][0], mxs[0][0])); + var m_new = svgroot.createSVGTransformFromMatrix(svgedit.math.matrixMultiply(mxs[1][0], mxs[0][0])); tlist.removeItem(mxs[0][1]); tlist.removeItem(mxs[1][1]); tlist.insertItemBefore(m_new, mxs[1][1]); @@ -1454,7 +1462,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if(k >= 2 && tlist.getItem(k-2).type === 1 && tlist.getItem(k-1).type === 2) { var mt = svgroot.createSVGTransform(); - var m = matrixMultiply( + var m = svgedit.math.matrixMultiply( tlist.getItem(k-2).matrix, tlist.getItem(k-1).matrix ); @@ -1486,7 +1494,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { var gsvg = $(selected).data('gsvg'); // we know we have some transforms, so set up return variable - var batchCmd = new BatchCommand("Transform"); + var batchCmd = new svgedit.history.BatchCommand("Transform"); // store initial values that will be affected by reducing the transform list var changes = {}, initial = null, attrs = []; @@ -1532,7 +1540,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if(attrs.length) { changes = $(selected).attr(attrs); $.each(changes, function(attr, val) { - changes[attr] = convertToNum(attr, val); + changes[attr] = svgedit.units.convertToNum(attr, val); }); } else if(gsvg) { // GSVG exception @@ -1547,7 +1555,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if (initial == null) { initial = $.extend(true, {}, changes); $.each(initial, function(attr, val) { - initial[attr] = convertToNum(attr, val); + initial[attr] = svgedit.units.convertToNum(attr, val); }); } // save the start transform value too @@ -1557,13 +1565,14 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if ((selected.tagName == "g" && !gsvg) || selected.tagName == "a") { var box = svgedit.utilities.getBBox(selected), oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2}, - newcenter = transformPoint(box.x+box.width/2, box.y+box.height/2, - transformListToTransform(tlist).matrix), + newcenter = svgedit.math.transformPoint(box.x+box.width/2, + box.y+box.height/2, + svgedit.math.transformListToTransform(tlist).matrix), m = svgroot.createSVGMatrix(); // temporarily strip off the rotate and save the old center - var gangle = getRotationAngle(selected); + var gangle = svgedit.utilities.getRotationAngle(selected); if (gangle) { var a = gangle * Math.PI / 180; if ( Math.abs(a) > (1.0e-10) ) { @@ -1611,15 +1620,15 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { tx = 0; ty = 0; if (child.nodeType == 1) { - var childTlist = getTransformList(child); + var childTlist = svgedit.transformlist.getTransformList(child); // some children might not have a transform (, , etc) if (!childTlist) continue; - var m = transformListToTransform(childTlist).matrix; + var m = svgedit.math.transformListToTransform(childTlist).matrix; // Convert a matrix to a scale if applicable -// if(hasMatrixTransform(childTlist) && childTlist.numberOfItems == 1) { +// if(svgedit.math.hasMatrixTransform(childTlist) && childTlist.numberOfItems == 1) { // if(m.b==0 && m.c==0 && m.e==0 && m.f==0) { // childTlist.removeItem(0); // var translateOrigin = svgroot.createSVGTransform(), @@ -1634,13 +1643,13 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // } // } - var angle = getRotationAngle(child); + var angle = svgedit.utilities.getRotationAngle(child); var old_start_transform = start_transform; var childxforms = []; start_transform = child.getAttribute("transform"); - if(angle || hasMatrixTransform(childTlist)) { + if(angle || svgedit.math.hasMatrixTransform(childTlist)) { var e2t = svgroot.createSVGTransform(); - e2t.setMatrix(matrixMultiply(tm, sm, tmn, m)); + e2t.setMatrix(svgedit.math.matrixMultiply(tm, sm, tmn, m)); childTlist.clear(); childTlist.appendItem(e2t); childxforms.push(e2t); @@ -1655,7 +1664,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // (only bringing [-T] to the right of [M]) // [T][S][-T][M] = [T][S][M][-T2] // [-T2] = [M_inv][-T][M] - var t2n = matrixMultiply(m.inverse(), tmn, m); + var t2n = svgedit.math.matrixMultiply(m.inverse(), tmn, m); // [T2] is always negative translation of [-T2] var t2 = svgroot.createSVGMatrix(); t2.e = -t2n.e; @@ -1663,7 +1672,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // [T][S][-T][M] = [M][T2][S2][-T2] // [S2] = [T2_inv][M_inv][T][S][-T][M][-T2_inv] - var s2 = matrixMultiply(t2.inverse(), m.inverse(), tm, sm, tmn, m, t2n.inverse()); + var s2 = svgedit.math.matrixMultiply(t2.inverse(), m.inverse(), tm, sm, tmn, m, t2n.inverse()); var translateOrigin = svgroot.createSVGTransform(), scale = svgroot.createSVGTransform(), @@ -1689,10 +1698,10 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // var u = uses.length; // while (u--) { // var useElem = uses.item(u); -// if(href == getHref(useElem)) { +// if(href == svgedit.utilities.getHref(useElem)) { // var usexlate = svgroot.createSVGTransform(); // usexlate.setTranslate(-tx,-ty); -// getTransformList(useElem).insertItemBefore(usexlate,0); +// svgedit.transformlist.getTransformList(useElem).insertItemBefore(usexlate,0); // batchCmd.addSubCommand( recalculateDimensions(useElem) ); // } // } @@ -1707,7 +1716,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { else if (N >= 3 && tlist.getItem(N-1).type == 1) { operation = 3; // scale - m = transformListToTransform(tlist).matrix; + m = svgedit.math.transformListToTransform(tlist).matrix; var e2t = svgroot.createSVGTransform(); e2t.setMatrix(m); tlist.clear(); @@ -1720,10 +1729,10 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { tlist.getItem(0).type == 2) { operation = 2; // translate - var T_M = transformListToTransform(tlist).matrix; + var T_M = svgedit.math.transformListToTransform(tlist).matrix; tlist.removeItem(0); - var M_inv = transformListToTransform(tlist).matrix.inverse(); - var M2 = matrixMultiply( M_inv, T_M ); + var M_inv = svgedit.math.transformListToTransform(tlist).matrix.inverse(); + var M2 = svgedit.math.matrixMultiply( M_inv, T_M ); tx = M2.e; ty = M2.f; @@ -1752,7 +1761,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); - var childTlist = getTransformList(child); + var childTlist = svgedit.transformlist.getTransformList(child); // some children might not have a transform (, , etc) if (childTlist) { var newxlate = svgroot.createSVGTransform(); @@ -1771,10 +1780,10 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { var u = uses.length; while (u--) { var useElem = uses.item(u); - if(href == getHref(useElem)) { + if(href == svgedit.utilities.getHref(useElem)) { var usexlate = svgroot.createSVGTransform(); usexlate.setTranslate(-tx,-ty); - getTransformList(useElem).insertItemBefore(usexlate,0); + svgedit.transformlist.getTransformList(useElem).insertItemBefore(usexlate,0); batchCmd.addSubCommand( recalculateDimensions(useElem) ); } } @@ -1800,11 +1809,11 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if (child.nodeType == 1) { var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); - var childTlist = getTransformList(child); + var childTlist = svgedit.transformlist.getTransformList(child); if (!childTlist) continue; - var em = matrixMultiply(m, transformListToTransform(childTlist).matrix); + var em = svgedit.math.matrixMultiply(m, svgedit.math.transformListToTransform(childTlist).matrix); var e2m = svgroot.createSVGTransform(); e2m.setMatrix(em); childTlist.clear(); @@ -1861,7 +1870,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { } // if it was a resize else if (operation == 3) { - var m = transformListToTransform(tlist).matrix; + var m = svgedit.math.transformListToTransform(tlist).matrix; var roldt = svgroot.createSVGTransform(); roldt.setRotate(gangle, oldcenter.x, oldcenter.y); var rold = roldt.matrix; @@ -1869,7 +1878,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { rnew.setRotate(gangle, newcenter.x, newcenter.y); var rnew_inv = rnew.matrix.inverse(), m_inv = m.inverse(), - extrat = matrixMultiply(m_inv, rnew_inv, rold, m); + extrat = svgedit.math.matrixMultiply(m_inv, rnew_inv, rold, m); tx = extrat.e; ty = extrat.f; @@ -1884,7 +1893,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if (child.nodeType == 1) { var old_start_transform = start_transform; start_transform = child.getAttribute("transform"); - var childTlist = getTransformList(child); + var childTlist = svgedit.transformlist.getTransformList(child); var newxlate = svgroot.createSVGTransform(); newxlate.setTranslate(tx,ty); if(childTlist.numberOfItems) { @@ -1924,11 +1933,11 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { var m = svgroot.createSVGMatrix(), // temporarily strip off the rotate and save the old center - angle = getRotationAngle(selected); + angle = svgedit.utilities.getRotationAngle(selected); if (angle) { var oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2}, - newcenter = transformPoint(box.x+box.width/2, box.y+box.height/2, - transformListToTransform(tlist).matrix); + newcenter = svgedit.math.transformPoint(box.x+box.width/2, box.y+box.height/2, + svgedit.math.transformListToTransform(tlist).matrix); var a = angle * Math.PI / 180; if ( Math.abs(a) > (1.0e-10) ) { @@ -1966,10 +1975,10 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { var attrVal = paint.getAttribute(type + 'Units'); if(attrVal === 'userSpaceOnUse') { //Update the userSpaceOnUse element - m = transformListToTransform(tlist).matrix; - var gtlist = getTransformList(paint); - var gmatrix = transformListToTransform(gtlist).matrix; - m = matrixMultiply(m, gmatrix); + m = svgedit.math.transformListToTransform(tlist).matrix; + var gtlist = svgedit.transformlist.getTransformList(paint); + var gmatrix = svgedit.math.transformListToTransform(gtlist).matrix; + m = svgedit.math.matrixMultiply(m, gmatrix); var m_str = "matrix(" + [m.a,m.b,m.c,m.d,m.e,m.f].join(",") + ")"; paint.setAttribute(type + 'Transform', m_str); } @@ -1988,7 +1997,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // && selected.nodeName != "use" { operation = 3; // scale - m = transformListToTransform(tlist,N-3,N-1).matrix; + m = svgedit.math.transformListToTransform(tlist,N-3,N-1).matrix; tlist.removeItem(N-1); tlist.removeItem(N-2); tlist.removeItem(N-3); @@ -1996,7 +2005,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // Thus, we simply combine it all into one matrix else if(N == 4 && tlist.getItem(N-1).type == 1) { operation = 3; // scale - m = transformListToTransform(tlist).matrix; + m = svgedit.math.transformListToTransform(tlist).matrix; var e2t = svgroot.createSVGTransform(); e2t.setMatrix(m); tlist.clear(); @@ -2012,16 +2021,16 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { { operation = 2; // translate var oldxlate = tlist.getItem(0).matrix, - meq = transformListToTransform(tlist,1).matrix, + meq = svgedit.math.transformListToTransform(tlist,1).matrix, meq_inv = meq.inverse(); - m = matrixMultiply( meq_inv, oldxlate, meq ); + m = svgedit.math.matrixMultiply( meq_inv, oldxlate, meq ); tlist.removeItem(0); } // else if this child now has a matrix imposition (from a parent group) // we might be able to simplify else if (N == 1 && tlist.getItem(0).type == 1 && !angle) { // Remap all point-based elements - m = transformListToTransform(tlist).matrix; + m = svgedit.math.transformListToTransform(tlist).matrix; switch (selected.tagName) { case 'line': changes = $(selected).attr(["x1","y1","x2","y2"]); @@ -2074,7 +2083,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // if it was a translate, put back the rotate at the new center if (operation == 2) { if (angle) { - if(!hasMatrixTransform(tlist)) { + if(!svgedit.math.hasMatrixTransform(tlist)) { newcenter = { x: oldcenter.x + m.e, y: oldcenter.y + m.f @@ -2094,7 +2103,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { // translation required to re-center it // Therefore, [Tr] = [M_inv][Rnew_inv][Rold][M] else if (operation == 3 && angle) { - var m = transformListToTransform(tlist).matrix; + var m = svgedit.math.transformListToTransform(tlist).matrix; var roldt = svgroot.createSVGTransform(); roldt.setRotate(angle, oldcenter.x, oldcenter.y); var rold = roldt.matrix; @@ -2102,7 +2111,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { rnew.setRotate(angle, newcenter.x, newcenter.y); var rnew_inv = rnew.matrix.inverse(); var m_inv = m.inverse(); - var extrat = matrixMultiply(m_inv, rnew_inv, rold, m); + var extrat = svgedit.math.matrixMultiply(m_inv, rnew_inv, rold, m); remapElement(selected,changes,extrat); if (angle) { @@ -2421,7 +2430,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { .scale(matrix_scale); } - var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), + var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom; @@ -2475,7 +2484,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { } start_transform = mouse_target.getAttribute("transform"); - var tlist = getTransformList(mouse_target); + var tlist = svgedit.transformlist.getTransformList(mouse_target); switch (current_mode) { case "select": started = true; @@ -2502,7 +2511,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { // a transform to use for its translate for (var i = 0; i < selectedElements.length; ++i) { if(selectedElements[i] == null) continue; - var slist = getTransformList(selectedElements[i]); + var slist = svgedit.transformlist.getTransformList(selectedElements[i]); if(slist.numberOfItems) { slist.insertItemBefore(svgroot.createSVGTransform(), 0); } else { @@ -2562,9 +2571,9 @@ var getMouseTarget = this.getMouseTarget = function(evt) { // append three dummy transforms to the tlist so that // we can translate,scale,translate in mousemove - var pos = getRotationAngle(mouse_target)?1:0; + var pos = svgedit.utilities.getRotationAngle(mouse_target)?1:0; - if(hasMatrixTransform(tlist)) { + if(svgedit.math.hasMatrixTransform(tlist)) { tlist.insertItemBefore(svgroot.createSVGTransform(), pos); tlist.insertItemBefore(svgroot.createSVGTransform(), pos); tlist.insertItemBefore(svgroot.createSVGTransform(), pos); @@ -2780,10 +2789,10 @@ var getMouseTarget = this.getMouseTarget = function(evt) { if(evt.button === 1 || canvas.spaceKey) return; var selected = selectedElements[0], - pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), + pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom, - shape = getElem(getId()); + shape = svgedit.utilities.getElem(getId()); var real_x = x = mouse_x / current_zoom; var real_y = y = mouse_y / current_zoom; @@ -2810,7 +2819,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { dy = snapToGrid(dy); } - if(evt.shiftKey) { var xya = snapToAngle(start_x,start_y,x,y); x=xya.x; y=xya.y; } + if(evt.shiftKey) { var xya = svgedit.math.snapToAngle(start_x,start_y,x,y); x=xya.x; y=xya.y; } if (dx != 0 || dy != 0) { var len = selectedElements.length; @@ -2826,7 +2835,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { // update the dummy transform in our transform list // to be a translate var xform = svgroot.createSVGTransform(); - var tlist = getTransformList(selected); + var tlist = svgedit.transformlist.getTransformList(selected); // Note that if Webkit and there's no ID for this // element, the dummy transform may have gotten lost. // This results in unexpected behaviour @@ -2888,8 +2897,8 @@ var getMouseTarget = this.getMouseTarget = function(evt) { // we track the resize bounding box and translate/scale the selected element // while the mouse is down, when mouse goes up, we use this to recalculate // the shape's coordinates - var tlist = getTransformList(selected), - hasMatrix = hasMatrixTransform(tlist), + var tlist = svgedit.transformlist.getTransformList(selected), + hasMatrix = svgedit.math.hasMatrixTransform(tlist), box = hasMatrix ? init_bbox : svgedit.utilities.getBBox(selected), left=box.x, top=box.y, width=box.width, height=box.height, dx=(x-start_x), dy=(y-start_y); @@ -2902,7 +2911,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { } // if rotated, adjust the dx,dy values - var angle = getRotationAngle(selected); + var angle = svgedit.utilities.getRotationAngle(selected); if (angle) { var r = Math.sqrt( dx*dx + dy*dy ), theta = Math.atan2(dy,dx) - angle * Math.PI / 180.0; @@ -3001,7 +3010,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var x2 = x; var y2 = y; - if(evt.shiftKey) { var xya = snapToAngle(start_x,start_y,x2,y2); x2=xya.x; y2=xya.y; } + if(evt.shiftKey) { var xya = svgedit.math.snapToAngle(start_x,start_y,x2,y2); x2=xya.x; y2=xya.y; } shape.setAttributeNS(null, "x2", x2); shape.setAttributeNS(null, "y2", y2); @@ -3120,7 +3129,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var x1 = start_x; var y1 = start_y; } - var xya = snapToAngle(x1,y1,x,y); + var xya = svgedit.math.snapToAngle(x1,y1,x,y); x=xya.x; y=xya.y; } @@ -3156,8 +3165,8 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var box = svgedit.utilities.getBBox(selected), cx = box.x + box.width/2, cy = box.y + box.height/2, - m = getMatrix(selected), - center = transformPoint(cx,cy,m); + m = svgedit.math.getMatrix(selected), + center = svgedit.math.transformPoint(cx,cy,m); cx = center.x; cy = center.y; var angle = ((Math.atan2(cy-y,cx-x) * (180/Math.PI))-90) % 360; @@ -3196,12 +3205,12 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var tempJustSelected = justSelected; justSelected = null; if (!started) return; - var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ), + var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = pt.x * current_zoom, mouse_y = pt.y * current_zoom, x = mouse_x / current_zoom, y = mouse_y / current_zoom, - element = getElem(getId()), + element = svgedit.utilities.getElem(getId()), keep = false; var real_x = x; @@ -3518,11 +3527,11 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var tagName = mouse_target.tagName; if(tagName === 'text' && current_mode !== 'textedit') { - var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ); + var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ); textActions.select(mouse_target, pt.x, pt.y); } - if((tagName === "g" || tagName === "a") && getRotationAngle(mouse_target)) { + if((tagName === "g" || tagName === "a") && svgedit.utilities.getRotationAngle(mouse_target)) { // TODO: Allow method of in-group editing without having to do // this (similar to editing rotated paths) @@ -3564,7 +3573,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) { var evt = e.originalEvent; root_sctm = svgcontent.getScreenCTM().inverse(); - var pt = transformPoint( evt.pageX, evt.pageY, root_sctm ); + var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ); var bbox = { 'x': pt.x, @@ -3624,7 +3633,7 @@ var textActions = canvas.textActions = function() { if(!empty) { textinput.setSelectionRange(index, index); } - cursor = getElem("text_cursor"); + cursor = svgedit.utilities.getElem("text_cursor"); if (!cursor) { cursor = document.createElementNS(svgns, "line"); assignAttributes(cursor, { @@ -3632,7 +3641,7 @@ var textActions = canvas.textActions = function() { 'stroke': "#333", 'stroke-width': 1 }); - cursor = getElem("selectorParentGroup").appendChild(cursor); + cursor = svgedit.utilities.getElem("selectorParentGroup").appendChild(cursor); } if(!blinker) { @@ -3669,7 +3678,7 @@ var textActions = canvas.textActions = function() { textinput.setSelectionRange(start, end); } - selblock = getElem("text_selectblock"); + selblock = svgedit.utilities.getElem("text_selectblock"); if (!selblock) { selblock = document.createElementNS(svgns, "path"); @@ -3679,7 +3688,7 @@ var textActions = canvas.textActions = function() { 'opacity': .5, 'style': "pointer-events:none" }); - getElem("selectorParentGroup").appendChild(selblock); + svgedit.utilities.getElem("selectorParentGroup").appendChild(selblock); } @@ -3756,7 +3765,7 @@ var textActions = canvas.textActions = function() { out.y /= current_zoom; if(matrix) { - var pt = transformPoint(out.x, out.y, matrix.inverse()); + var pt = svgedit.math.transformPoint(out.x, out.y, matrix.inverse()); out.x = pt.x; out.y = pt.y; } @@ -3771,7 +3780,7 @@ var textActions = canvas.textActions = function() { } if(matrix) { - var pt = transformPoint(out.x, out.y, matrix); + var pt = svgedit.math.transformPoint(out.x, out.y, matrix); out.x = pt.x; out.y = pt.y; } @@ -3796,7 +3805,7 @@ var textActions = canvas.textActions = function() { function selectWord(evt) { if(!allow_dbl || !curtext) return; - var ept = transformPoint( evt.pageX, evt.pageY, root_sctm ), + var ept = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ), mouse_x = ept.x * current_zoom, mouse_y = ept.y * current_zoom; var pt = screenToPt(mouse_x, mouse_y); @@ -3947,7 +3956,7 @@ var textActions = canvas.textActions = function() { textbb = svgedit.utilities.getBBox(curtext); - matrix = xform?getMatrix(curtext):null; + matrix = xform ? svgedit.math.getMatrix(curtext) : null; chardata = Array(len); textinput.focus(); @@ -4124,7 +4133,7 @@ var pathActions = canvas.pathActions = function() { var x = mouse_x/current_zoom, y = mouse_y/current_zoom, - stretchy = getElem("path_stretch_line"); + stretchy = svgedit.utilities.getElem("path_stretch_line"); newPoint = [x, y]; if(curConfig.gridSnapping){ @@ -4142,7 +4151,7 @@ var pathActions = canvas.pathActions = function() { 'stroke-width': "0.5", 'fill': 'none' }); - stretchy = getElem("selectorParentGroup").appendChild(stretchy); + stretchy = svgedit.utilities.getElem("selectorParentGroup").appendChild(stretchy); } stretchy.setAttribute("display", "inline"); @@ -4188,7 +4197,7 @@ var pathActions = canvas.pathActions = function() { // Remove previous path object if previously created svgedit.path.removePath_(id); - var newpath = getElem(id); + var newpath = svgedit.utilities.getElem(id); var len = seglist.numberOfItems; // if we clicked on an existing point, then we are done this path, commit it @@ -4263,7 +4272,7 @@ var pathActions = canvas.pathActions = function() { var last = drawn_path.pathSegList.getItem(num -1); var lastx = last.x, lasty = last.y; - if(evt.shiftKey) { var xya = snapToAngle(lastx,lasty,x,y); x=xya.x; y=xya.y; } + if(evt.shiftKey) { var xya = svgedit.math.snapToAngle(lastx,lasty,x,y); x=xya.x; y=xya.y; } // Use the segment defined by stretchy var s_seg = stretchy.pathSegList.getItem(1); @@ -4406,7 +4415,7 @@ var pathActions = canvas.pathActions = function() { svgedit.path.replacePathSeg(6, index, [pt_x, pt_y, last_x, last_y, alt_x, alt_y], drawn_path); } } else { - var stretchy = getElem("path_stretch_line"); + var stretchy = svgedit.utilities.getElem("path_stretch_line"); if (stretchy) { var prev = seglist.getItem(index); if(prev.pathSegType === 6) { @@ -4473,7 +4482,7 @@ var pathActions = canvas.pathActions = function() { if(current_mode === "path") { newPoint = null; if(!drawn_path) { - element = getElem(getId()); + element = svgedit.utilities.getElem(getId()); started = false; firstCtrl = null; } @@ -4564,7 +4573,7 @@ var pathActions = canvas.pathActions = function() { reorient: function() { var elem = selectedElements[0]; if(!elem) return; - var angle = getRotationAngle(elem); + var angle = svgedit.utilities.getRotationAngle(elem); if(angle == 0) return; var batchCmd = new BatchCommand("Reorient path"); @@ -4590,10 +4599,10 @@ var pathActions = canvas.pathActions = function() { clear: function(remove) { current_path = null; if (drawn_path) { - var elem = getElem(getId()); - $(getElem("path_stretch_line")).remove(); + var elem = svgedit.utilities.getElem(getId()); + $(svgedit.utilities.getElem("path_stretch_line")).remove(); $(elem).remove(); - $(getElem("pathpointgrip_container")).find('*').attr('display', 'none'); + $(svgedit.utilities.getElem("pathpointgrip_container")).find('*').attr('display', 'none'); drawn_path = firstCtrl = null; started = false; } else if (current_mode == "pathedit") { @@ -4603,8 +4612,8 @@ var pathActions = canvas.pathActions = function() { }, resetOrientation: function(path) { if(path == null || path.nodeName != 'path') return false; - var tlist = getTransformList(path); - var m = transformListToTransform(tlist).matrix; + var tlist = svgedit.transformlist.getTransformList(path); + var m = svgedit.math.transformListToTransform(tlist).matrix; tlist.clear(); path.removeAttribute("transform"); var segList = path.pathSegList; @@ -4632,7 +4641,7 @@ var pathActions = canvas.pathActions = function() { $.each(['',1,2], function(j, n) { var x = seg['x'+n], y = seg['y'+n]; if(x !== undefined && y !== undefined) { - var pt = transformPoint(x, y, m); + var pt = svgedit.math.transformPoint(x, y, m); pts.splice(pts.length, 0, pt.x, pt.y); } }); @@ -5104,7 +5113,7 @@ var removeUnusedDefElems = this.removeUnusedDefElems = function() { for(var i=0; i 0) { - var m = transformListToTransform(tlist).matrix; - var pt1 = transformPoint(g_coords.x1, g_coords.y1, m); - var pt2 = transformPoint(g_coords.x2, g_coords.y2, m); + var m = svgedit.math.transformListToTransform(tlist).matrix; + var pt1 = svgedit.math.transformPoint(g_coords.x1, g_coords.y1, m); + var pt2 = svgedit.math.transformPoint(g_coords.x2, g_coords.y2, m); g_coords.x1 = pt1.x; g_coords.y1 = pt1.y; @@ -5690,7 +5699,7 @@ var convertToGroup = this.convertToGroup = function(elem) { $(elem.firstChild.firstChild).unwrap(); $(elem).removeData('gsvg'); - var tlist = getTransformList(elem); + var tlist = svgedit.transformlist.getTransformList(elem); var xform = svgroot.createSVGTransform(); xform.setTranslate(pt.x, pt.y); tlist.appendItem(xform); @@ -5731,7 +5740,7 @@ var convertToGroup = this.convertToGroup = function(elem) { // Duplicate the gradients for Gecko, since they weren't included in the if(svgedit.browser.isGecko()) { - var dupeGrads = $(findDefs()).children('linearGradient,radialGradient,pattern').clone(); + var dupeGrads = $(svgedit.utilities.findDefs()).children('linearGradient,radialGradient,pattern').clone(); $(g).append(dupeGrads); } @@ -5766,7 +5775,7 @@ var convertToGroup = this.convertToGroup = function(elem) { setUseData(g); if(svgedit.browser.isGecko()) { - convertGradients(findDefs()); + convertGradients(svgedit.utilities.findDefs()); } else { convertGradients(g); } @@ -5877,7 +5886,7 @@ this.setSvgString = function(xmlString) { // For Firefox: Put all paint elems in defs if(svgedit.browser.isGecko()) { - content.find('linearGradient, radialGradient, pattern').appendTo(findDefs()); + content.find('linearGradient, radialGradient, pattern').appendTo(svgedit.utilities.findDefs()); } @@ -5917,7 +5926,7 @@ this.setSvgString = function(xmlString) { // Use user units if percentage given percs = true; } else { - attrs[dim] = convertToNum(dim, val); + attrs[dim] = svgedit.units.convertToNum(dim, val); } }); } @@ -6024,8 +6033,8 @@ this.importSvgString = function(xmlString) { uniquifyElems(svg); - var innerw = convertToNum('width', svg.getAttribute("width")), - innerh = convertToNum('height', svg.getAttribute("height")), + var innerw = svgedit.units.convertToNum('width', svg.getAttribute("width")), + innerh = svgedit.units.convertToNum('height', svg.getAttribute("height")), innervb = svg.getAttribute("viewBox"), // if no explicit viewbox, create one out of the width and height vb = innervb ? innervb.split(" ") : [0,0,innerw,innerh]; @@ -6048,7 +6057,7 @@ this.importSvgString = function(xmlString) { ts = "translate(0) " + ts + " translate(0)"; var symbol = svgdoc.createElementNS(svgns, "symbol"); - var defs = findDefs(); + var defs = svgedit.utilities.findDefs(); if(svgedit.browser.isGecko()) { // Move all gradients into root for Firefox, workaround for this bug: @@ -6074,7 +6083,7 @@ this.importSvgString = function(xmlString) { xform: ts } - findDefs().appendChild(symbol); + svgedit.utilities.findDefs().appendChild(symbol); batchCmd.addSubCommand(new InsertElementCommand(symbol)); } @@ -6447,7 +6456,7 @@ var leaveContext = this.leaveContext = function() { var setContext = this.setContext = function(elem) { leaveContext(); if(typeof elem === 'string') { - elem = getElem(elem); + elem = svgedit.utilities.getElem(elem); } // Edit inside this group @@ -6701,8 +6710,8 @@ this.setResolution = function(x, y) { batchCmd = new BatchCommand("Change Image Dimensions"); } - x = convertToNum('width', x); - y = convertToNum('height', y); + x = svgedit.units.convertToNum('width', x); + y = svgedit.units.convertToNum('height', y); svgcontent.setAttribute('width', x); svgcontent.setAttribute('height', y); @@ -6860,26 +6869,6 @@ this.setColor = function(type, val, preventUndo) { } } - -// Function: findDefs -// Return the document's element, create it first if necessary -var findDefs = function() { - var defs = svgcontent.getElementsByTagNameNS(svgns, "defs"); - if (defs.length > 0) { - defs = defs[0]; - } - else { - defs = svgdoc.createElementNS(svgns, "defs" ); - if(svgcontent.firstChild) { - // first child is a comment, so call nextSibling - svgcontent.insertBefore( defs, svgcontent.firstChild.nextSibling); - } else { - svgcontent.appendChild(defs); - } - } - return defs; -}; - // Function: setGradient // Apply the current gradient to selected element's fill or stroke // @@ -6890,7 +6879,7 @@ var setGradient = this.setGradient = function(type) { var grad = canvas[type + 'Grad']; // find out if there is a duplicate gradient already in the defs var duplicate_grad = findDuplicateGradient(grad); - var defs = findDefs(); + var defs = svgedit.utilities.findDefs(); // no duplicate found, so import gradient into defs if (!duplicate_grad) { var orig_grad = grad; @@ -6913,7 +6902,7 @@ var setGradient = this.setGradient = function(type) { // Returns: // The existing gradient if found, null if not var findDuplicateGradient = function(grad) { - var defs = findDefs(); + var defs = svgedit.utilities.findDefs(); var existing_grads = $(defs).find("linearGradient, radialGradient"); var i = existing_grads.length; var rad_attrs = ['r','cx','cy','fx','fy']; @@ -6974,7 +6963,7 @@ function reorientGrads(elem, m) { var type = i === 0 ? 'fill' : 'stroke'; var attrVal = elem.getAttribute(type); if(attrVal && attrVal.indexOf('url(') === 0) { - var grad = getRefElem(attrVal); + var grad = svgedit.utilities.getRefElem(attrVal); if(grad.tagName === 'linearGradient') { var x1 = grad.getAttribute('x1') || 0; var y1 = grad.getAttribute('y1') || 0; @@ -6988,8 +6977,8 @@ function reorientGrads(elem, m) { y2 = (bb.height * y2) + bb.y; // Transform those points - var pt1 = transformPoint(x1, y1, m); - var pt2 = transformPoint(x2, y2, m); + var pt1 = svgedit.math.transformPoint(x1, y1, m); + var pt2 = svgedit.math.transformPoint(x2, y2, m); // Convert back to BB points var g_coords = {}; @@ -7003,7 +6992,7 @@ function reorientGrads(elem, m) { $(newgrad).attr(g_coords); newgrad.id = getNextId(); - findDefs().appendChild(newgrad); + svgedit.utilities.findDefs().appendChild(newgrad); elem.setAttribute(type, 'url(#' + newgrad.id + ')'); } } @@ -7200,7 +7189,7 @@ this.getBlur = function(elem) { if(elem) { var filter_url = elem.getAttribute('filter'); if(filter_url) { - var blur = getElem(elem.id + '_blur'); + var blur = svgedit.utilities.getElem(elem.id + '_blur'); if(blur) { val = blur.firstChild.getAttribute('stdDeviation'); } @@ -7294,7 +7283,7 @@ this.getBlur = function(elem) { // Looks for associated blur, creates one if not found var elem = selectedElements[0]; var elem_id = elem.id; - filter = getElem(elem_id + '_blur'); + filter = svgedit.utilities.getElem(elem_id + '_blur'); val -= 0; @@ -7321,7 +7310,7 @@ this.getBlur = function(elem) { }); filter.appendChild(newblur); - findDefs().appendChild(filter); + svgedit.utilities.findDefs().appendChild(filter); batchCmd.addSubCommand(new InsertElementCommand(filter)); } @@ -7767,8 +7756,8 @@ this.convertToPath = function(elem, getBBox) { // Reorient if it has a matrix if(eltrans) { - var tlist = getTransformList(path); - if(hasMatrixTransform(tlist)) { + var tlist = svgedit.transformlist.getTransformList(path); + if(svgedit.math.hasMatrixTransform(tlist)) { pathActions.resetOrientation(path); } } @@ -7857,7 +7846,7 @@ var changeSelectedAttributeNoUndo = function(attr, newValue, elems) { // var box=getBBox(elem), left=box.x, top=box.y, width=box.width, // height=box.height, dx = width - old_w, dy=0; -// var angle = getRotationAngle(elem, true); +// var angle = svgedit.utilities.getRotationAngle(elem, true); // if (angle) { // var r = Math.sqrt( dx*dx + dy*dy ); // var theta = Math.atan2(dy,dx) - angle; @@ -7895,9 +7884,9 @@ var changeSelectedAttributeNoUndo = function(attr, newValue, elems) { } // if this element was rotated, and we changed the position of this element // we need to update the rotational transform attribute - var angle = getRotationAngle(elem); + var angle = svgedit.utilities.getRotationAngle(elem); if (angle != 0 && attr != "transform") { - var tlist = getTransformList(elem); + var tlist = svgedit.transformlist.getTransformList(elem); var n = tlist.numberOfItems; while (n--) { var xform = tlist.getItem(n); @@ -7906,7 +7895,7 @@ var changeSelectedAttributeNoUndo = function(attr, newValue, elems) { tlist.removeItem(n); var box = svgedit.utilities.getBBox(elem); - var center = transformPoint(box.x+box.width/2, box.y+box.height/2, transformListToTransform(tlist).matrix); + var center = svgedit.math.transformPoint(box.x+box.width/2, box.y+box.height/2, svgedit.math.transformListToTransform(tlist).matrix); var cx = center.x, cy = center.y; var newrot = svgroot.createSVGTransform(); @@ -8038,7 +8027,7 @@ this.pasteElements = function(type, x, y) { var copy = copyElem(elem); // See if elem with elem ID is in the DOM already - if(!getElem(elem.id)) copy.id = elem.id; + if(!svgedit.utilities.getElem(elem.id)) copy.id = elem.id; pasted.push(copy); (current_group || getCurrentDrawing().getCurrentLayer()).appendChild(copy); @@ -8148,8 +8137,8 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { var len = children.length; var xform = g.getAttribute("transform"); - var glist = getTransformList(g); - var m = transformListToTransform(glist).matrix; + var glist = svgedit.transformlist.getTransformList(g); + var m = svgedit.math.transformListToTransform(glist).matrix; var batchCmd = new BatchCommand("Push group properties"); @@ -8161,7 +8150,7 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { // then set the child's attribute var i = 0; - var gangle = getRotationAngle(g); + var gangle = svgedit.utilities.getRotationAngle(g); var gattrs = $(g).attr(['filter', 'opacity']); var gfilter, gblur; @@ -8192,14 +8181,14 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { if(!orig_cblur) { // Set group's filter to use first child's ID if(!gfilter) { - gfilter = getRefElem(gattrs.filter); + gfilter = svgedit.utilities.getRefElem(gattrs.filter); } else { // Clone the group's filter gfilter = copyElem(gfilter); - findDefs().appendChild(gfilter); + svgedit.utilities.findDefs().appendChild(gfilter); } } else { - gfilter = getRefElem(elem.getAttribute('filter')); + gfilter = svgedit.utilities.getRefElem(elem.getAttribute('filter')); } // Change this in future for different filters @@ -8214,7 +8203,7 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { } } - var chtlist = getTransformList(elem); + var chtlist = svgedit.transformlist.getTransformList(elem); // Don't process gradient transforms if(~elem.tagName.indexOf('Gradient')) chtlist = null; @@ -8244,15 +8233,15 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { // get child's rotation matrix (Rc) var rcm = svgroot.createSVGMatrix(); - var cangle = getRotationAngle(elem); + var cangle = svgedit.utilities.getRotationAngle(elem); if (cangle) { rcm = chtlist.getItem(0).matrix; } // get child's old center of rotation var cbox = svgedit.utilities.getBBox(elem); - var ceqm = transformListToTransform(chtlist).matrix; - var coldc = transformPoint(cbox.x+cbox.width/2, cbox.y+cbox.height/2,ceqm); + var ceqm = svgedit.math.transformListToTransform(chtlist).matrix; + var coldc = svgedit.math.transformPoint(cbox.x+cbox.width/2, cbox.y+cbox.height/2,ceqm); // sum group and child's angles var sangle = gangle + cangle; @@ -8262,7 +8251,7 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { r2.setRotate(sangle, coldc.x, coldc.y); // calculate equivalent translate - var trm = matrixMultiply(rgm, rcm, r2.matrix.inverse()); + var trm = svgedit.math.matrixMultiply(rgm, rcm, r2.matrix.inverse()); // set up tlist if (cangle) { @@ -8299,9 +8288,9 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { // [ gm ] [ chm ] = [ chm ] [ gm' ] // [ gm' ] = [ chm_inv ] [ gm ] [ chm ] - var chm = transformListToTransform(chtlist).matrix, + var chm = svgedit.math.transformListToTransform(chtlist).matrix, chm_inv = chm.inverse(); - var gm = matrixMultiply( chm_inv, m, chm ); + var gm = svgedit.math.matrixMultiply( chm_inv, m, chm ); newxform.setMatrix(gm); chtlist.appendItem(newxform); } @@ -8338,7 +8327,7 @@ this.ungroupSelectedElement = function() { return; } else if(g.tagName === 'use') { // Somehow doesn't have data set, so retrieve - var symbol = getElem(getHref(g).substr(1)); + var symbol = svgedit.utilities.getElem(getHref(g).substr(1)); $(g).data('symbol', symbol).data('ref', symbol); convertToGroup(g); return; @@ -8511,7 +8500,7 @@ this.moveSelectedElements = function(dx, dy, undoable) { // selectedBBoxes[i] = b; var xform = svgroot.createSVGTransform(); - var tlist = getTransformList(selected); + var tlist = svgedit.transformlist.getTransformList(selected); // dx and dy could be arrays if (dx.constructor == Array) { @@ -8715,7 +8704,7 @@ this.updateCanvas = function(w, h) { y: y }); - var bg_img = getElem('background_image'); + var bg_img = svgedit.utilities.getElem('background_image'); if (bg_img) { assignAttributes(bg_img, { 'width': '100%', @@ -8735,9 +8724,9 @@ this.updateCanvas = function(w, h) { // color - String with fill color to apply // url - URL or path to image to use this.setBackground = function(color, url) { - var bg = getElem('canvasBackground'); + var bg = svgedit.utilities.getElem('canvasBackground'); var border = $(bg).find('rect')[0]; - var bg_img = getElem('background_image'); + var bg_img = svgedit.utilities.getElem('background_image'); border.setAttribute('fill',color); if(url) { if(!bg_img) { diff --git a/editor/svgutils.js b/editor/svgutils.js index caeee266..d8a468c4 100644 --- a/editor/svgutils.js +++ b/editor/svgutils.js @@ -308,20 +308,23 @@ svgedit.utilities.setHref = function(elem, val) { } // Function: findDefs -// Parameters: -// svgElement - The element. // // Returns: // The document's element, create it first if necessary -svgedit.utilities.findDefs = function(svgElement) { +svgedit.utilities.findDefs = function() { var svgElement = editorContext_.getSVGContent().documentElement; var defs = svgElement.getElementsByTagNameNS(SVGNS, "defs"); if (defs.length > 0) { defs = defs[0]; } else { - // first child is a comment, so call nextSibling - defs = svgElement.insertBefore( svgElement.ownerDocument.createElementNS(SVGNS, "defs" ), svgElement.firstChild.nextSibling); + defs = svgElement.ownerDocument.createElementNS(SVGNS, "defs"); + if (svgElement.firstChild) { + // first child is a comment, so call nextSibling + svgElement.insertBefore(defs, svgElement.firstChild.nextSibling); + } else { + svgElement.appendChild(defs); + } } return defs; }; @@ -558,6 +561,15 @@ svgedit.utilities.getRotationAngle = function(elem, to_rad) { return 0.0; }; +// Function getRefElem +// Get the reference element associated with the given attribute value +// +// Parameters: +// attrVal - The attribute value as a string +svgedit.utilities.getRefElem = this.getRefElem = function(attrVal) { + return svgedit.utilities.getElem(svgedit.utilities.getUrlFromAttr(attrVal).substr(1)); +}; + // Function: getElem // Get a DOM element by ID within the SVG root element. // diff --git a/test/all_tests.html b/test/all_tests.html index f02834a8..124004e0 100644 --- a/test/all_tests.html +++ b/test/all_tests.html @@ -16,6 +16,7 @@ + + + + + + + + + + +

Unit Tests for svgedit.coords

+

+

+
    +
+ + +