From c5eb058b09de57fa06777a66a60c8126eadb53ba Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Fri, 9 May 2014 07:00:47 -0500 Subject: [PATCH] Uses rAF to interrupt the operator list execution --- src/display/api.js | 16 ++++++++++++---- src/display/canvas.js | 8 +++----- web/compatibility.js | 12 ++++++++++++ web/viewer.js | 10 +--------- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 977fb8c7e..004411aca 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1271,6 +1271,10 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { this.graphicsReady = false; this.cancelled = false; this.capability = createPromiseCapability(); + // caching this-bound methods + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); } InternalRenderTask.prototype = { @@ -1309,7 +1313,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { operatorListChanged: function InternalRenderTask_operatorListChanged() { if (!this.graphicsReady) { if (!this.graphicsReadyCallback) { - this.graphicsReadyCallback = this._continue.bind(this); + this.graphicsReadyCallback = this._continueBound; } return; } @@ -1330,19 +1334,23 @@ var InternalRenderTask = (function InternalRenderTaskClosure() { return; } if (this.params.continueCallback) { - this.params.continueCallback(this._next.bind(this)); + this.params.continueCallback(this._scheduleNextBound); } else { - this._next(); + this._scheduleNext(); } }, + _scheduleNext: function InternalRenderTask__scheduleNext() { + window.requestAnimationFrame(this._nextBound); + }, + _next: function InternalRenderTask__next() { if (this.cancelled) { return; } this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, - this._continue.bind(this), + this._continueBound, this.stepper); if (this.operatorListIdx === this.operatorList.argsArray.length) { this.running = false; diff --git a/src/display/canvas.js b/src/display/canvas.js index 350dfb955..505e10527 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -746,7 +746,6 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var commonObjs = this.commonObjs; var objs = this.objs; var fnId; - var deferred = Promise.resolve(); while (true) { if (stepper && i === stepper.nextBreakPoint) { @@ -784,11 +783,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { return i; } - // If the execution took longer then a certain amount of time, schedule - // to continue exeution after a short delay. - // However, this is only possible if a 'continueCallback' is passed in. + // If the execution took longer then a certain amount of time and + // `continueCallback` is specified, interrupt the execution. if (continueCallback && Date.now() > endTime) { - deferred.then(continueCallback); + continueCallback(); return i; } diff --git a/web/compatibility.js b/web/compatibility.js index 31b6356fd..0e2dba1be 100644 --- a/web/compatibility.js +++ b/web/compatibility.js @@ -564,3 +564,15 @@ if (typeof PDFJS === 'undefined') { console.log('Unable to create polyfill for localStorage'); } })(); + +(function checkRequestAnimationFrame() { + if ('requestAnimationFrame' in window) { + return; + } + window.requestAnimationFrame = + window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || + window.oRequestAnimationFrame || window.msRequestAnimationFrame || + (function fakeRequestAnimationFrame(callback) { + window.setTimeout(callback, 20); + }); +})(); diff --git a/web/viewer.js b/web/viewer.js index b1c5162e5..755d54bb9 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -2410,16 +2410,8 @@ window.addEventListener('afterprint', function afterPrint(evt) { (function animationStartedClosure() { // The offsetParent is not set until the pdf.js iframe or object is visible. // Waiting for first animation. - var requestAnimationFrame = window.requestAnimationFrame || - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function startAtOnce(callback) { callback(); }; PDFView.animationStartedPromise = new Promise(function (resolve) { - requestAnimationFrame(function onAnimationFrame() { - resolve(); - }); + window.requestAnimationFrame(resolve); }); })();