Lazy textLayer rendering - pauses after scroll ev

This commit is contained in:
Artur Adib 2012-01-11 16:57:57 -05:00
parent be2f973be8
commit fcdf266d8e

View File

@ -960,9 +960,14 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) {
var self = this; var self = this;
var textDivs = this.textDivs; var textDivs = this.textDivs;
var textLayerDiv = this.textLayerDiv; var textLayerDiv = this.textLayerDiv;
this.textLayerTimer = setInterval(function renderTextLayer() { var renderTimer = null;
var renderingDone = false;
// Render the text layer, one div at a time
var renderTextLayer = function textLayerRender() {
if (textDivs.length === 0) { if (textDivs.length === 0) {
clearInterval(self.textLayerTimer); clearInterval(renderTimer);
renderingDone = true;
return; return;
} }
var textDiv = textDivs.shift(); var textDiv = textDivs.shift();
@ -974,7 +979,32 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) {
((textDiv.dataset.canvasWidth - textDiv.offsetWidth) / ((textDiv.dataset.canvasWidth - textDiv.offsetWidth) /
(textDiv.dataset.textLength - 1)) + 'px'; (textDiv.dataset.textLength - 1)) + 'px';
} }
}, 0); }
renderTimer = setInterval(renderTextLayer, 0);
var scrollTimer = null;
if (window.onscroll)
var oldScrollHandler = window.onscroll;
// Stop rendering when user scrolls. Resume after XXX milliseconds
// of no scroll events
window.onscroll = function textLayerOnScroll() {
if (oldScrollHandler)
oldScrollHandler.apply(window, arguments);
// This avoids handler wrapper bloat
if (renderingDone)
window.onscroll = oldScrollHandler;
// Immediately pause rendering
clearInterval(renderTimer);
clearTimeout(scrollTimer);
scrollTimer = setTimeout(function() {
// Resume rendering
renderTimer = setInterval(renderTextLayer, 0);
}, 500);
}
}; };
this.appendText = function textLayerBuilderAppendText(text, this.appendText = function textLayerBuilderAppendText(text,