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
parent
12a393505d
commit
17c3e0fa28
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue