From b930228788c64414d6040bca6941cc734158df31 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Mon, 29 Sep 2014 11:32:45 -0500 Subject: [PATCH] Refactors Cache into PDFPageViewBuffer --- web/pdf_page_view.js | 12 ++++++------ web/pdf_viewer.js | 38 ++++++++++++++++++++++++++++++++------ web/ui_utils.js | 21 --------------------- 3 files changed, 38 insertions(+), 33 deletions(-) diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 3ebe41427..6c8ea8c29 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -25,7 +25,6 @@ * @property {number} scale - The page scale display. * @property {PageViewport} defaultViewport - The page viewport. * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. - * @property {Cache} cache - The page cache. * @property {IPDFTextLayerFactory} textLayerFactory * @property {IPDFAnnotationsLayerFactory} annotationsLayerFactory */ @@ -45,7 +44,6 @@ var PDFPageView = (function PDFPageViewClosure() { var scale = options.scale; var defaultViewport = options.defaultViewport; var renderingQueue = options.renderingQueue; - var cache = options.cache; var textLayerFactory = options.textLayerFactory; var annotationsLayerFactory = options.annotationsLayerFactory; @@ -59,13 +57,15 @@ var PDFPageView = (function PDFPageViewClosure() { this.hasRestrictedScaling = false; this.renderingQueue = renderingQueue; - this.cache = cache; this.textLayerFactory = textLayerFactory; this.annotationsLayerFactory = annotationsLayerFactory; this.renderingState = RenderingStates.INITIAL; this.resume = null; + this.onBeforeDraw = null; + this.onAfterDraw = null; + this.textLayer = null; this.zoomLayer = null; @@ -447,9 +447,9 @@ var PDFPageView = (function PDFPageViewClosure() { } div.setAttribute('data-loaded', true); - // Add the page to the cache at the start of drawing. That way it can be - // evicted from the cache and destroyed even if we pause its rendering. - this.cache.push(this); + if (self.onBeforeDraw) { + self.onBeforeDraw(); + } }, beforePrint: function PDFPageView_beforePrint() { diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 42e9efaf2..1ad1c0c7e 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - /*globals watchScroll, Cache, DEFAULT_CACHE_SIZE, PDFPageView, UNKNOWN_SCALE, + /*globals watchScroll, PDFPageView, UNKNOWN_SCALE, SCROLLBAR_PADDING, VERTICAL_PADDING, MAX_AUTO_SCALE, CSS_UNITS, DEFAULT_SCALE, scrollIntoView, getVisibleElements, RenderingStates, PDFJS, Promise, TextLayerBuilder, PDFRenderingQueue, @@ -30,6 +30,7 @@ var PresentationModeState = { }; var IGNORE_CURRENT_POSITION_ON_ZOOM = false; +var DEFAULT_CACHE_SIZE = 10; //#include pdf_rendering_queue.js //#include pdf_page_view.js @@ -52,6 +53,26 @@ var IGNORE_CURRENT_POSITION_ON_ZOOM = false; * @implements {IRenderableView} */ var PDFViewer = (function pdfViewer() { + function PDFPageViewBuffer(size) { + var data = []; + this.push = function cachePush(view) { + var i = data.indexOf(view); + if (i >= 0) { + data.splice(i, 1); + } + data.push(view); + if (data.length > size) { + data.shift().destroy(); + } + }; + this.resize = function (newSize) { + size = newSize; + while (data.length > size) { + data.shift().destroy(); + } + }; + } + /** * @constructs PDFViewer * @param {PDFViewerOptions} options @@ -212,7 +233,13 @@ var PDFViewer = (function pdfViewer() { }); this.onePageRendered = onePageRendered; - var bindOnAfterDraw = function (pageView) { + var bindOnAfterAndBeforeDraw = function (pageView) { + pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { + // Add the page to the buffer at the start of drawing. That way it can + // be evicted from the buffer and destroyed even if we pause its + // rendering. + self._buffer.push(this); + }; // when page is painted, using the image as thumbnail base pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { if (!isOnePageRenderedResolved) { @@ -246,11 +273,10 @@ var PDFViewer = (function pdfViewer() { scale: scale, defaultViewport: viewport.clone(), renderingQueue: this.renderingQueue, - cache: this.cache, textLayerFactory: textLayerFactory, annotationsLayerFactory: this }); - bindOnAfterDraw(pageView); + bindOnAfterAndBeforeDraw(pageView); this.pages.push(pageView); } @@ -291,11 +317,11 @@ var PDFViewer = (function pdfViewer() { }, _resetView: function () { - this.cache = new Cache(DEFAULT_CACHE_SIZE); this.pages = []; this._currentPageNumber = 1; this._currentScale = UNKNOWN_SCALE; this._currentScaleValue = null; + this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); this.location = null; this._pagesRotation = 0; this._pagesRequests = []; @@ -538,7 +564,7 @@ var PDFViewer = (function pdfViewer() { var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1); - this.cache.resize(suggestedCacheSize); + this._buffer.resize(suggestedCacheSize); this.renderingQueue.renderHighestPriority(visible); diff --git a/web/ui_utils.js b/web/ui_utils.js index b4f2d7365..3c32c5939 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -22,7 +22,6 @@ var UNKNOWN_SCALE = 0; var MAX_AUTO_SCALE = 1.25; var SCROLLBAR_PADDING = 40; var VERTICAL_PADDING = 5; -var DEFAULT_CACHE_SIZE = 10; // optimised CSS custom property getter/setter var CustomStyle = (function CustomStyleClosure() { @@ -349,23 +348,3 @@ var ProgressBar = (function ProgressBarClosure() { return ProgressBar; })(); - -var Cache = function cacheCache(size) { - var data = []; - this.push = function cachePush(view) { - var i = data.indexOf(view); - if (i >= 0) { - data.splice(i, 1); - } - data.push(view); - if (data.length > size) { - data.shift().destroy(); - } - }; - this.resize = function (newSize) { - size = newSize; - while (data.length > size) { - data.shift().destroy(); - } - }; -};