Feature #4358 » 0002-Performance-improvements-to-WImage-updateAreas.patch
src/js/WImage.js | ||
---|---|---|
var self = this;
|
||
var WT = APP.WT;
|
||
var WAIT_TIMEOUT = 100;
|
||
var ROW_QUANTUM = 50;
|
||
var areaCoordsJSON = null;
|
||
var waitStarted = 0;
|
||
var currentTransform = "";
|
||
var timeoutId = null;
|
||
var updateRow = 0;
|
||
this.setAreaCoordsJSON = function(newAreaCoordsJSON) {
|
||
areaCoordsJSON = newAreaCoordsJSON;
|
||
currentTransform = "";
|
||
this.updateAreas();
|
||
}
|
||
this.updateAreas = function() {
|
||
this.updateAreaCoords();
|
||
}
|
||
this.updateAreaCoords = function() {
|
||
var combinedTransformJS = target.combinedTransform;
|
||
if (combinedTransformJS === undefined || areaCoordsJSON === null)
|
||
return;
|
||
var combinedTransform = combinedTransformJS();
|
||
var newTransform = combinedTransformJS();
|
||
var transformChanged = (newTransform.toString() !== currentTransform.toString());
|
||
// console.log('updateAreas: currentTransform: ' + currentTransform + ', newTransform: ' + newTransform + ', changed: ' + transformChanged);
|
||
/* if idle state */
|
||
if (waitStarted === 0 && updateRow === 0) {
|
||
/* ...and transform unchanged, we are done... */
|
||
if (!transformChanged)
|
||
return;
|
||
/* Otherwise, wait to see if more transform changes occur... */
|
||
else {
|
||
currentTransform = newTransform;
|
||
waitStarted = new Date().getTime();
|
||
timeoutId = setTimeout(this.updateAreas, WAIT_TIMEOUT);
|
||
return;
|
||
}
|
||
}
|
||
var timeNow = new Date().getTime();
|
||
/* if the transform changed, enter wait state */
|
||
if (transformChanged) {
|
||
currentTransform = newTransform;
|
||
waitStarted = timeNow;
|
||
updateRow = 0;
|
||
if (timeoutId)
|
||
clearTimeout(timeoutId);
|
||
timeoutId = setTimeout(this.updateAreas, WAIT_TIMEOUT);
|
||
return;
|
||
}
|
||
/* if already updating or wait timer expired, continue updating */
|
||
if (updateRow > 0 || (waitStarted && (timeNow - waitStarted > WAIT_TIMEOUT))) {
|
||
/* update some rows, and enter idle state if done */
|
||
if (self.updateAreaCoords(ROW_QUANTUM)) {
|
||
// console.log('updateAreaCoords: complete');
|
||
waitStarted = 0;
|
||
updateRow = 0;
|
||
if (timeoutId)
|
||
clearTimeout(timeoutId);
|
||
timeoutId = null;
|
||
return;
|
||
}
|
||
/* some rows updated - update more after processing event loop */
|
||
if (timeoutId)
|
||
clearTimeout(timeoutId);
|
||
timeoutId = setTimeout(self.updateAreas, 0);
|
||
return;
|
||
}
|
||
/* new call or timeout with quantum not expired ... */
|
||
else {
|
||
var timeRemaining = timeNow - waitStarted;
|
||
if (timeRemaining > WAIT_TIMEOUT) {
|
||
timeRemaining = WAIT_TIMEOUT;
|
||
}
|
||
if (timeoutId)
|
||
clearTimeout(timeoutId);
|
||
timeoutId = setTimeout(self.updateAreas, timeRemaining);
|
||
}
|
||
}
|
||
this.updateAreaCoords = function(quantum) {
|
||
// console.log('updateAreaCoords: updateRow: ' + updateRow + ", transform: " + currentTransform);
|
||
var mult = APP.WT.gfxUtils.transform_mult;
|
||
for (var c = 0; c < areaCoordsJSON.length; c++)
|
||
{
|
||
var coordEntry = areaCoordsJSON[c];
|
||
var endIndex = updateRow + quantum;
|
||
if (endIndex > areaCoordsJSON.length)
|
||
endIndex = areaCoordsJSON.length;
|
||
while (updateRow < endIndex) {
|
||
var coordEntry = areaCoordsJSON[updateRow];
|
||
var areaEl = coordEntry[0];
|
||
var points = coordEntry[1];
|
||
... | ... | |
for (var i = 0; i + 1 < len; i += 2) {
|
||
if (i > 0)
|
||
new_coords += ",";
|
||
var p = mult(combinedTransform, points.slice(i, i + 2));
|
||
var p = mult(currentTransform, points.slice(i, i + 2));
|
||
new_coords += Math.round(p[0]).toString() + "," + Math.round(p[1]).toString();
|
||
}
|
||
if (i < len) // a circle -- copy radius unchanged
|
||
new_coords += ("," + points[i].toString());
|
||
if (areaEl)
|
||
areaEl.coords = new_coords;
|
||
if (i < len) // a circle -- copy radius unchanged
|
||
new_coords += ("," + points[i].toString());
|
||
if (areaEl)
|
||
areaEl.coords = new_coords;
|
||
updateRow++;
|
||
}
|
||
return (endIndex === areaCoordsJSON.length);
|
||
}
|
||
});
|