diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 3599d3b8..33bc7627 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -1225,9 +1225,12 @@ var remapElement = this.remapElement = function(selected,changes,m) { findDefs().appendChild(newgrad); selected.setAttribute(type, 'url(#' + newgrad.id + ')'); } - + + // Not really working :( +// if(selected.tagName === 'path') { +// reorientGrads(selected, m); +// } } - } @@ -2044,7 +2047,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { } } } - + // first, if it was a scale of a non-skewed element, then the second-last // transform will be the [S] // if we had [M][T][S][T] we want to extract the matrix equivalent of @@ -2122,6 +2125,7 @@ var recalculateDimensions = this.recalculateDimensions = function(selected) { if (angle) { var newRot = svgroot.createSVGTransform(); newRot.setRotate(angle,newcenter.x,newcenter.y); + if(tlist.numberOfItems) { tlist.insertItemBefore(newRot, 0); } else { @@ -5505,6 +5509,7 @@ var pathActions = canvas.pathActions = function() { // } var last_x, last_y; + for (var i = 0; i < len; ++i) { var seg = segList.getItem(i); var type = seg.pathSegType; @@ -5519,6 +5524,9 @@ var pathActions = canvas.pathActions = function() { }); replacePathSeg(type, i, pts, path); } + + reorientGrads(path, m); + }, zoomChange: function() { @@ -6607,7 +6615,11 @@ var convertToGroup = this.convertToGroup = function(elem) { batchCmd.addSubCommand(new InsertElementCommand(g)); } - convertGradients(g); + if(svgedit.browsersupport.isGecko()) { + convertGradients(findDefs()); + } else { + convertGradients(g); + } // recalculate dimensions on the top-level children so that unnecessary transforms // are removed @@ -7980,6 +7992,48 @@ var findDuplicateGradient = function(grad) { return null; }; +function reorientGrads(elem, m) { + var bb = getBBox(elem); + for(var i = 0; i < 2; i++) { + var type = i === 0 ? 'fill' : 'stroke'; + var attrVal = elem.getAttribute(type); + if(attrVal && attrVal.indexOf('url(') === 0) { + var grad = getRefElem(attrVal); + if(grad.tagName === 'linearGradient') { + var x1 = grad.getAttribute('x1') || 0; + var y1 = grad.getAttribute('y1') || 0; + var x2 = grad.getAttribute('x2') || 1; + var y2 = grad.getAttribute('y2') || 0; + + // Convert to USOU points + x1 = (bb.width * x1) + bb.x; + y1 = (bb.height * y1) + bb.y; + x2 = (bb.width * x2) + bb.x; + y2 = (bb.height * y2) + bb.y; + + // Transform those points + var pt1 = transformPoint(x1, y1, m); + var pt2 = transformPoint(x2, y2, m); + + // Convert back to BB points + var g_coords = {}; + + g_coords.x1 = (pt1.x - bb.x) / bb.width; + g_coords.y1 = (pt1.y - bb.y) / bb.height; + g_coords.x2 = (pt2.x - bb.x) / bb.width; + g_coords.y2 = (pt2.y - bb.y) / bb.height; + + var newgrad = grad.cloneNode(true); + $(newgrad).attr(g_coords); + + newgrad.id = getNextId(); + findDefs().appendChild(newgrad); + elem.setAttribute(type, 'url(#' + newgrad.id + ')'); + } + } + } +} + // Function: setPaint // Set a color/gradient to a fill/stroke // @@ -9148,6 +9202,9 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { // Hopefully not a problem to add this. Necessary for elements like if(!chtlist) continue; + // Apparently can get get a transformlist, but we don't want it to have one! + if(elem.tagName === 'defs') continue; + if (glist.numberOfItems) { // TODO: if the group's transform is just a rotate, we can always transfer the // rotate() down to the children (collapsing consecutive rotates and factoring @@ -9211,6 +9268,7 @@ var pushGroupProperties = this.pushGroupProperties = function(g, undoable) { } } else { // more complicated than just a rotate + // transfer the group's transform down to each child and then // call recalculateDimensions() var oldxform = elem.getAttribute("transform");