Performance improvement for select.js and canvas.addToSelection

canvas.addToSelection was calling getBBox, throwing it away, then
calling selectorManager.requestSelector() which called getBBox again.
Now passing-in an optional bbox to selector functions.
master
Flint O'Brien 2016-04-24 16:56:32 -04:00
parent 12a393505d
commit 17c3e0fa28
2 changed files with 20 additions and 11 deletions

View File

@ -33,7 +33,8 @@ var gripRadius = svgedit.browser.isTouch() ? 10 : 4;
// Parameters: // Parameters:
// id - integer to internally indentify the selector // id - integer to internally indentify the selector
// elem - DOM element associated with this selector // elem - DOM element associated with this selector
svgedit.select.Selector = function(id, elem) { // bbox - Optional bbox to use for initialization (prevents duplicate getBBox call).
svgedit.select.Selector = function(id, elem, bbox) {
// this is the selector's unique number // this is the selector's unique number
this.id = id; this.id = id;
@ -77,7 +78,7 @@ svgedit.select.Selector = function(id, elem) {
'w' : null 'w' : null
}; };
this.reset(this.selectedElement); this.reset(this.selectedElement, bbox);
}; };
@ -86,10 +87,11 @@ svgedit.select.Selector = function(id, elem) {
// //
// Parameters: // Parameters:
// e - DOM element associated with this selector // e - DOM element associated with this selector
svgedit.select.Selector.prototype.reset = function(e) { // bbox - Optional bbox to use for reset (prevents duplicate getBBox call).
svgedit.select.Selector.prototype.reset = function(e, bbox) {
this.locked = true; this.locked = true;
this.selectedElement = e; this.selectedElement = e;
this.resize(); this.resize(bbox);
this.selectorGroup.setAttribute('display', 'inline'); this.selectorGroup.setAttribute('display', 'inline');
}; };
@ -136,7 +138,8 @@ svgedit.select.Selector.prototype.showGrips = function(show) {
// Function: svgedit.select.Selector.resize // Function: svgedit.select.Selector.resize
// Updates the selector to match the element's size // Updates the selector to match the element's size
svgedit.select.Selector.prototype.resize = function() { // bbox - Optional bbox to use for resize (prevents duplicate getBBox call).
svgedit.select.Selector.prototype.resize = function(bbox) {
var selectedBox = this.selectorRect, var selectedBox = this.selectorRect,
mgr = selectorManager_, mgr = selectorManager_,
selectedGrips = mgr.selectorGrips, selectedGrips = mgr.selectorGrips,
@ -162,7 +165,10 @@ svgedit.select.Selector.prototype.resize = function() {
m.e *= current_zoom; m.e *= current_zoom;
m.f *= current_zoom; m.f *= current_zoom;
var bbox = svgedit.utilities.getBBox(selected); if (!bbox)
bbox = svgedit.utilities.getBBox(selected);
// TODO: svgedit.utilities.getBBox (previous line) already knows to call getStrokedBBox when tagName === 'g'. Remove this?
// TODO: svgedit.utilities.getBBox doesn't exclude 'gsvg' and calls getStrokedBBox for any 'g'. Should getBBox be updated?
if (tagName === 'g' && !$.data(selected, 'gsvg')) { if (tagName === 'g' && !$.data(selected, 'gsvg')) {
// The bbox for a group does not include stroke vals, so we // The bbox for a group does not include stroke vals, so we
// get the bbox based on its children. // get the bbox based on its children.
@ -413,7 +419,8 @@ svgedit.select.SelectorManager.prototype.initGroup = function() {
// //
// Parameters: // Parameters:
// elem - DOM element to get the selector for // elem - DOM element to get the selector for
svgedit.select.SelectorManager.prototype.requestSelector = function(elem) { // bbox - Optional bbox to use for reset (prevents duplicate getBBox call).
svgedit.select.SelectorManager.prototype.requestSelector = function(elem, bbox) {
if (elem == null) {return null;} if (elem == null) {return null;}
var i, var i,
N = this.selectors.length; N = this.selectors.length;
@ -425,13 +432,13 @@ svgedit.select.SelectorManager.prototype.requestSelector = function(elem) {
for (i = 0; i < N; ++i) { for (i = 0; i < N; ++i) {
if (this.selectors[i] && !this.selectors[i].locked) { if (this.selectors[i] && !this.selectors[i].locked) {
this.selectors[i].locked = true; this.selectors[i].locked = true;
this.selectors[i].reset(elem); this.selectors[i].reset(elem, bbox);
this.selectorMap[elem.id] = this.selectors[i]; this.selectorMap[elem.id] = this.selectors[i];
return this.selectors[i]; return this.selectors[i];
} }
} }
// if we reached here, no available selectors were found, we create one // if we reached here, no available selectors were found, we create one
this.selectors[N] = new svgedit.select.Selector(N, elem); this.selectors[N] = new svgedit.select.Selector(N, elem, bbox);
this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup); this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup);
this.selectorMap[elem.id] = this.selectors[N]; this.selectorMap[elem.id] = this.selectors[N];
return this.selectors[N]; return this.selectors[N];

View File

@ -940,7 +940,9 @@ var addToSelection = this.addToSelection = function(elemsToAdd, showGrips) {
var i = elemsToAdd.length; var i = elemsToAdd.length;
while (i--) { while (i--) {
var elem = elemsToAdd[i]; var elem = elemsToAdd[i];
if (!elem || !svgedit.utilities.getBBox(elem)) {continue;} if (!elem) {continue;}
var bbox = svgedit.utilities.getBBox(elem);
if (!bbox) {continue;}
if (elem.tagName === 'a' && elem.childNodes.length === 1) { if (elem.tagName === 'a' && elem.childNodes.length === 1) {
// Make "a" element's child be the selected element // Make "a" element's child be the selected element
@ -955,7 +957,7 @@ var addToSelection = this.addToSelection = function(elemsToAdd, showGrips) {
// only the first selectedBBoxes element is ever used in the codebase these days // only the first selectedBBoxes element is ever used in the codebase these days
// if (j == 0) selectedBBoxes[0] = svgedit.utilities.getBBox(elem); // if (j == 0) selectedBBoxes[0] = svgedit.utilities.getBBox(elem);
j++; j++;
var sel = selectorManager.requestSelector(elem); var sel = selectorManager.requestSelector(elem, bbox);
if (selectedElements.length > 1) { if (selectedElements.length > 1) {
sel.showGrips(false); sel.showGrips(false);