From ca671f90d2e50db64c0c8dd5de9360b880779a22 Mon Sep 17 00:00:00 2001 From: Alexis Deveria Date: Wed, 9 Feb 2011 21:32:53 +0000 Subject: [PATCH] Fixed issue 717: Bounding box not surrounding entire image library image git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1988 eee81c28-f429-11dd-99c0-75d572ba1ddd --- editor/browser.js | 19 ++++++++++++ editor/svgutils.js | 72 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 19 deletions(-) diff --git a/editor/browser.js b/editor/browser.js index 57f5598f..2906572f 100644 --- a/editor/browser.js +++ b/editor/browser.js @@ -96,6 +96,24 @@ var supportsPathBBox_ = (function() { return (bbox.height > 4 && bbox.height < 5); })(); +// Support for correct bbox sizing on groups with horizontal/vertical lines +var supportsHVLineContainerBBox_ = (function() { + var svgcontent = document.createElementNS(svgns, 'svg'); + document.documentElement.appendChild(svgcontent); + var path = document.createElementNS(svgns, 'path'); + path.setAttribute('d','M0,0 10,0'); + var path2 = document.createElementNS(svgns, 'path'); + path2.setAttribute('d','M5,0 15,0'); + var g = document.createElementNS(svgns, 'g'); + g.appendChild(path); + g.appendChild(path2); + svgcontent.appendChild(g); + var bbox = g.getBBox(); + document.documentElement.removeChild(svgcontent); + // Webkit gives 0, FF gives 10, Opera (correctly) gives 15 + return (bbox.width == 15); +})(); + var supportsEditableText_ = (function() { // TODO: Find better way to check support for this return isOpera_; @@ -141,6 +159,7 @@ svgedit.browser.supportsXpath = function() { return supportsXpath_; } svgedit.browser.supportsPathReplaceItem = function() { return supportsPathReplaceItem_; } svgedit.browser.supportsPathInsertItemBefore = function() { return supportsPathInsertItemBefore_; } svgedit.browser.supportsPathBBox = function() { return supportsPathBBox_; } +svgedit.browser.supportsHVLineContainerBBox = function() { return supportsHVLineContainerBBox_; } svgedit.browser.supportsTextCharPos = function() { return supportsTextCharPos_; } svgedit.browser.supportsEditableText = function() { return supportsEditableText_; } svgedit.browser.supportsGoodDecimals = function() { return supportsGoodDecimals_; } diff --git a/editor/svgutils.js b/editor/svgutils.js index 7897adc5..3892fda8 100644 --- a/editor/svgutils.js +++ b/editor/svgutils.js @@ -409,6 +409,52 @@ svgedit.utilities.getPathBBox = function(path) { }; }; +// Function: groupBBFix +// Get the given/selected element's bounding box object, checking for +// horizontal/vertical lines (see issue 717) +// Note that performance is currently terrible, so some way to improve would +// be great. +// +// Parameters: +// selected - Container or DOM element +function groupBBFix(selected) { + if(svgedit.browser.supportsHVLineContainerBBox()) { + try { return selected.getBBox();} catch(e){} + } + var ref = $.data(selected, 'ref'); + var matched = null; + + if(ref) { + var copy = $(ref).children().clone().attr('visibility', 'hidden'); + $(svgroot_).append(copy); + matched = copy.filter('line, path'); + } else { + matched = $(selected).find('line, path'); + } + + var issue = false; + if(matched.length) { + matched.each(function() { + var bb = this.getBBox(); + if(!bb.width || !bb.height) { + issue = true; + } + }); + if(issue) { + var elems = ref ? copy : $(selected).children(); + ret = getStrokedBBox(elems); + } else { + ret = selected.getBBox(); + } + } else { + ret = selected.getBBox(); + } + if(ref) { + copy.remove(); + } + return ret; +} + // Function: svgedit.utilities.getBBox // Get the given/selected element's bounding box object, convert it to be more // usable when necessary @@ -440,28 +486,16 @@ svgedit.utilities.getBBox = function(elem) { break; case 'g': case 'a': - var matched = $(selected).find('line, path'); - var issue = false; - if(matched.length) { - matched.each(function() { - var bb = this.getBBox(); - if(!bb.width || !bb.height) { - issue = true; - } - }); - if(issue) { - ret = getStrokedBBox($(selected).children()); - } else { - ret = selected.getBBox(); - } - } else { - ret = selected.getBBox(); - } + ret = groupBBFix(selected); break; default: + + if(elname === 'use') { + ret = groupBBFix(selected, true); + } - if(elname === 'use' && !svgedit.browser.isWebkit() || elname === 'foreignObject') { - ret = selected.getBBox(); + if((elname === 'use' && !svgedit.browser.isWebkit()) || elname === 'foreignObject') { + if(!ret) ret = selected.getBBox(); var bb = {}; bb.width = ret.width; bb.height = ret.height;