Merge pull request #438 from notmasteryet/zoom-bookmark
Scrolling (and zoom) to the bookmark
This commit is contained in:
commit
76d58ca4ca
@ -8,6 +8,8 @@ var kDefaultScale = 1.5;
|
||||
var kDefaultScaleDelta = 1.1;
|
||||
var kCacheSize = 20;
|
||||
var kCssUnits = 96.0 / 72.0;
|
||||
var kScrollbarPadding = 40;
|
||||
|
||||
|
||||
var Cache = function(size) {
|
||||
var data = [];
|
||||
@ -44,7 +46,7 @@ var PDFView = {
|
||||
window.dispatchEvent(event);
|
||||
},
|
||||
|
||||
parseScale: function(value) {
|
||||
parseScale: function(value, resetAutoSettings) {
|
||||
if ('custom' == value)
|
||||
return;
|
||||
|
||||
@ -55,15 +57,18 @@ var PDFView = {
|
||||
}
|
||||
|
||||
var currentPage = this.pages[this.page - 1];
|
||||
var scrollbarPadding = 40;
|
||||
var pageWidthScale = (window.innerWidth - scrollbarPadding) /
|
||||
var pageWidthScale = (window.innerWidth - kScrollbarPadding) /
|
||||
currentPage.width / kCssUnits;
|
||||
var pageHeightScale = (window.innerHeight - scrollbarPadding) /
|
||||
var pageHeightScale = (window.innerHeight - kScrollbarPadding) /
|
||||
currentPage.height / kCssUnits;
|
||||
if ('page-width' == value)
|
||||
this.setScale(pageWidthScale);
|
||||
else if ('page-fit' == value)
|
||||
this.setScale(Math.min(pageWidthScale, pageHeightScale));
|
||||
this.setScale(pageWidthScale, resetAutoSettings);
|
||||
if ('page-height' == value)
|
||||
this.setScale(pageHeightScale, resetAutoSettings);
|
||||
if ('page-fit' == value) {
|
||||
this.setScale(
|
||||
Math.min(pageWidthScale, pageHeightScale), resetAutoSettings);
|
||||
}
|
||||
},
|
||||
|
||||
zoomIn: function() {
|
||||
@ -130,8 +135,8 @@ var PDFView = {
|
||||
this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1);
|
||||
if (pageNumber) {
|
||||
this.page = pageNumber;
|
||||
// TODO scroll to specific region on the page, the precise scaling
|
||||
// required.
|
||||
var currentPage = this.pages[pageNumber - 1];
|
||||
currentPage.scrollIntoView(dest);
|
||||
}
|
||||
},
|
||||
|
||||
@ -267,11 +272,80 @@ var PageView = function(container, content, id, width, height,
|
||||
link.style.width = Math.ceil(links[i].width * scale) + 'px';
|
||||
link.style.height = Math.ceil(links[i].height * scale) + 'px';
|
||||
link.href = links[i].url || '';
|
||||
bindLink(link, ('dest' in links[i]) ? links[i].dest : null);
|
||||
if (!links[i].url)
|
||||
bindLink(link, ('dest' in links[i]) ? links[i].dest : null);
|
||||
div.appendChild(link);
|
||||
}
|
||||
}
|
||||
|
||||
this.scrollIntoView = function(dest) {
|
||||
var x = 0, y = 0;
|
||||
var width = 0, height = 0, widthScale, heightScale;
|
||||
var scale = 0;
|
||||
switch (dest[1].name) {
|
||||
default:
|
||||
return;
|
||||
case 'XYZ':
|
||||
x = dest[2];
|
||||
y = dest[3];
|
||||
scale = dest[4];
|
||||
break;
|
||||
case 'Fit':
|
||||
case 'FitB':
|
||||
scale = 'page-fit';
|
||||
break;
|
||||
case 'FitH':
|
||||
case 'FitBH':
|
||||
y = dest[2];
|
||||
scale = 'page-width';
|
||||
break;
|
||||
case 'FitV':
|
||||
case 'FitBV':
|
||||
x = dest[2];
|
||||
scale = 'page-height';
|
||||
break;
|
||||
case 'FitR':
|
||||
x = dest[2];
|
||||
y = dest[3];
|
||||
width = dest[4] - x;
|
||||
height = dest[5] - y;
|
||||
widthScale = (window.innerWidth - kScrollbarPadding) /
|
||||
width / kCssUnits;
|
||||
heightScale = (window.innerHeight - kScrollbarPadding) /
|
||||
height / kCssUnits;
|
||||
scale = Math.min(widthScale, heightScale);
|
||||
break;
|
||||
}
|
||||
|
||||
var boundingRect = [
|
||||
this.content.rotatePoint(x, y),
|
||||
this.content.rotatePoint(x + width, y + height)
|
||||
];
|
||||
|
||||
if (scale)
|
||||
PDFView.setScale(scale, true);
|
||||
|
||||
setTimeout(function() {
|
||||
// letting page to re-layout before scrolling
|
||||
var scale = PDFView.currentScale;
|
||||
var x = Math.min(boundingRect[0].x, boundingRect[1].x);
|
||||
var y = Math.min(boundingRect[0].y, boundingRect[1].y);
|
||||
var width = Math.abs(boundingRect[0].x - boundingRect[1].x);
|
||||
var height = Math.abs(boundingRect[0].y - boundingRect[1].y);
|
||||
|
||||
// using temporary div to scroll it into view
|
||||
var tempDiv = document.createElement('div');
|
||||
tempDiv.style.position = 'absolute';
|
||||
tempDiv.style.left = Math.floor(x * scale) + 'px';
|
||||
tempDiv.style.top = Math.floor(y * scale) + 'px';
|
||||
tempDiv.style.width = Math.ceil(width * scale) + 'px';
|
||||
tempDiv.style.height = Math.ceil(height * scale) + 'px';
|
||||
div.appendChild(tempDiv);
|
||||
tempDiv.scrollIntoView(true);
|
||||
div.removeChild(tempDiv);
|
||||
}, 0);
|
||||
};
|
||||
|
||||
this.draw = function() {
|
||||
if (div.hasChildNodes()) {
|
||||
this.updateStats();
|
||||
|
Loading…
Reference in New Issue
Block a user