Skip to content

Commit 5bae370

Browse files
committed
Merge pull request mozilla#834 from notmasteryet/thumbs4
Re-using the pages as thumbnails
2 parents 59d9dfc + 8685915 commit 5bae370

File tree

1 file changed

+50
-8
lines changed

1 file changed

+50
-8
lines changed

web/viewer.js

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,13 @@ var PDFView = {
193193
},
194194

195195
load: function pdfViewLoad(data, scale) {
196+
function bindOnAfterDraw(pageView, thumbnailView) {
197+
// when page is painted, using the image as thumbnail base
198+
pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {
199+
thumbnailView.setImage(pageView.canvas);
200+
};
201+
}
202+
196203
var loadingIndicator = document.getElementById('loading');
197204
loadingIndicator.setAttribute('hidden', 'true');
198205

@@ -219,10 +226,14 @@ var PDFView = {
219226
var thumbnails = this.thumbnails = [];
220227
for (var i = 1; i <= pagesCount; i++) {
221228
var page = pdf.getPage(i);
222-
pages.push(new PageView(container, page, i, page.width, page.height,
223-
page.stats, this.navigateTo.bind(this)));
224-
thumbnails.push(new ThumbnailView(sidebar, page, i,
225-
page.width / page.height));
229+
var pageView = new PageView(container, page, i, page.width, page.height,
230+
page.stats, this.navigateTo.bind(this));
231+
var thumbnailView = new ThumbnailView(sidebar, page, i,
232+
page.width / page.height);
233+
bindOnAfterDraw(pageView, thumbnailView);
234+
235+
pages.push(pageView);
236+
thumbnails.push(thumbnailView);
226237
var pageRef = page.ref;
227238
pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
228239
}
@@ -360,6 +371,8 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight,
360371
while (div.hasChildNodes())
361372
div.removeChild(div.lastChild);
362373
div.removeAttribute('data-loaded');
374+
375+
delete this.canvas;
363376
};
364377

365378
function setupLinks(content, scale) {
@@ -474,6 +487,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight,
474487
canvas.id = 'page' + this.id;
475488
canvas.mozOpaque = true;
476489
div.appendChild(canvas);
490+
this.canvas = canvas;
477491

478492
var scale = this.scale;
479493
canvas.width = pageWidth * scale;
@@ -487,7 +501,11 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight,
487501
ctx.translate(-this.x * scale, -this.y * scale);
488502

489503
stats.begin = Date.now();
490-
this.content.startRendering(ctx, this.updateStats);
504+
this.content.startRendering(ctx, (function pageViewDrawCallback() {
505+
this.updateStats();
506+
if (this.onAfterDraw)
507+
this.onAfterDraw();
508+
}).bind(this));
491509

492510
setupLinks(this.content, this.scale);
493511
div.setAttribute('data-loaded', true);
@@ -518,10 +536,9 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) {
518536
anchor.appendChild(div);
519537
container.appendChild(anchor);
520538

521-
this.draw = function thumbnailViewDraw() {
522-
if (div.hasChildNodes())
523-
return;
539+
this.hasImage = false;
524540

541+
function getPageDrawContext() {
525542
var canvas = document.createElement('canvas');
526543
canvas.id = 'thumbnail' + id;
527544
canvas.mozOpaque = true;
@@ -549,7 +566,28 @@ var ThumbnailView = function thumbnailView(container, page, id, pageRatio) {
549566
div.style.height = (view.height * scaleY) + 'px';
550567
div.style.lineHeight = (view.height * scaleY) + 'px';
551568

569+
return ctx;
570+
}
571+
572+
this.draw = function thumbnailViewDraw() {
573+
if (this.hasImage)
574+
return;
575+
576+
var ctx = getPageDrawContext();
552577
page.startRendering(ctx, function thumbnailViewDrawStartRendering() {});
578+
579+
this.hasImage = true;
580+
};
581+
582+
this.setImage = function thumbnailViewSetImage(img) {
583+
if (this.hasImage)
584+
return;
585+
586+
var ctx = getPageDrawContext();
587+
ctx.drawImage(img, 0, 0, img.width, img.height,
588+
0, 0, ctx.canvas.width, ctx.canvas.height);
589+
590+
this.hasImage = true;
553591
};
554592
};
555593

@@ -687,6 +725,10 @@ window.addEventListener('transitionend', function webViewerTransitionend(evt) {
687725

688726
var container = document.getElementById('sidebarView');
689727
container._interval = window.setInterval(function interval() {
728+
// skipping the thumbnails with set images
729+
while (pageIndex < pagesCount && PDFView.thumbnails[pageIndex].hasImage)
730+
pageIndex++;
731+
690732
if (pageIndex >= pagesCount) {
691733
window.clearInterval(container._interval);
692734
return;

0 commit comments

Comments
 (0)