Browse Source

simplify adding of textdivs to DOM as queue is no longer needed

Adil Allawi 14 years ago
parent
commit
b921486bce
  1. 50
      src/canvas.js

50
src/canvas.js

@ -257,9 +257,6 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height); this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height);
this.textDivs = []; this.textDivs = [];
this.textLayerQueue = []; this.textLayerQueue = [];
// Prevent textLayerQueue from being rendered while rendering a new page
if (this.textLayerTimer)
clearInterval(this.textLayerTimer);
}, },
executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR, executeIRQueue: function canvasGraphicsExecuteIRQueue(codeIR,
@ -328,41 +325,22 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
return; return;
var self = this; var self = this;
var textDivIndex = 0; var textDivs = this.textDivs;
var renderTextLayer = function canvasRenderTextLayer() { this.textLayerTimer = setInterval(function renderTextLayer() {
var finished = false; if (textDivs.length === 0) {
var textDivs = self.textDivs; clearInterval(self.textLayerTimer);
if (textDivIndex < textDivs.length) { return;
var textDiv = textDivs[textDivIndex++];
if (textDiv.dataset.textLength > 1) { // avoid div by zero
textLayer.appendChild(textDiv);
// Adjust div width (via letterSpacing) to match canvas text
// Due to the .offsetWidth calls, this is slow
textDiv.style.letterSpacing =
((textDiv.dataset.canvasWidth - textDiv.offsetWidth) /
(textDiv.dataset.textLength - 1)) + 'px';
}
} }
else var textDiv = textDivs.shift();
finished = true; if (textDiv.dataset.textLength > 1) { // avoid div by zero
return finished; textLayer.appendChild(textDiv);
} // Adjust div width (via letterSpacing) to match canvas text
var textLayerQueue = this.textLayerQueue; // Due to the .offsetWidth calls, this is slow
textLayerQueue.push(renderTextLayer); textDiv.style.letterSpacing =
((textDiv.dataset.canvasWidth - textDiv.offsetWidth) /
// Lazy textLayer rendering (to prevent UI hangs) (textDiv.dataset.textLength - 1)) + 'px';
// Only render queue if activity has stopped, where "no activity" ==
// "no beginDrawing() calls in the last N ms"
this.textLayerTimer = setInterval(function renderTextLayerQueue() {
// Render most recent (==most relevant) layers first
for (var i = textLayerQueue.length - 1; i >= 0; i--) {
var finished = textLayerQueue[i].call();
if (finished)
textLayerQueue.splice(i, 1);
} }
if (textLayerQueue.length == 0) }, 0);
clearInterval(self.textLayerTimer);
}, 1);
}, },
// Graphics state // Graphics state

Loading…
Cancel
Save