Zooming control
This commit is contained in:
parent
ae2297aa99
commit
a56f36e350
@ -230,6 +230,14 @@ canvas {
|
|||||||
-webkit-box-shadow: 0px 2px 10px #ff0;
|
-webkit-box-shadow: 0px 2px 10px #ff0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pageWidthOption {
|
||||||
|
border-top: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#customScaleOption:not([data-scale]) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* === Printed media overrides === */
|
/* === Printed media overrides === */
|
||||||
@media print {
|
@media print {
|
||||||
#sidebar {
|
#sidebar {
|
||||||
|
@ -33,13 +33,16 @@
|
|||||||
|
|
||||||
<div class="separator"></div>
|
<div class="separator"></div>
|
||||||
|
|
||||||
<select id="scaleSelect" onchange="PDFView.scale = parseInt(this.value);">
|
<select id="scaleSelect" onchange="PDFView.parseScale(this.value);">
|
||||||
<option value="50">50%</option>
|
<option id="customScaleOption" value="custom"></option>
|
||||||
<option value="75">75%</option>
|
<option value="0.5">50%</option>
|
||||||
<option value="100">100%</option>
|
<option value="0.75">75%</option>
|
||||||
<option value="125">125%</option>
|
<option value="1">100%</option>
|
||||||
<option value="150" selected="selected">150%</option>
|
<option value="1.25">125%</option>
|
||||||
<option value="200">200%</option>
|
<option value="1.5" selected="selected">150%</option>
|
||||||
|
<option value="2">200%</option>
|
||||||
|
<option id="pageWidthOption" value="page-width">Page Width</option>
|
||||||
|
<option id="pageFitOption" value="page-fit">Page Fit</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<div class="separator"></div>
|
<div class="separator"></div>
|
||||||
|
102
web/viewer.js
102
web/viewer.js
@ -4,8 +4,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf';
|
var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf';
|
||||||
var kDefaultScale = 150;
|
var kDefaultScale = 1.5;
|
||||||
|
var kDefaultScaleDelta = 1.1;
|
||||||
var kCacheSize = 20;
|
var kCacheSize = 20;
|
||||||
|
var kCssUnits = 96.0 / 72.0;
|
||||||
|
|
||||||
var Cache = function(size) {
|
var Cache = function(size) {
|
||||||
var data = [];
|
var data = [];
|
||||||
@ -21,12 +23,13 @@ var cache = new Cache(kCacheSize);
|
|||||||
var PDFView = {
|
var PDFView = {
|
||||||
pages: [],
|
pages: [],
|
||||||
thumbnails: [],
|
thumbnails: [],
|
||||||
|
currentScale: kDefaultScale,
|
||||||
|
|
||||||
set scale(val) {
|
setScale: function(val, resetAutoSettings) {
|
||||||
var pages = this.pages;
|
var pages = this.pages;
|
||||||
var cssUnits = 96.0 / 72.0;
|
|
||||||
for (var i = 0; i < pages.length; i++)
|
for (var i = 0; i < pages.length; i++)
|
||||||
pages[i].update(val / 100 * cssUnits);
|
pages[i].update(val * kCssUnits);
|
||||||
|
this.currentScale = val;
|
||||||
|
|
||||||
if (document.location.hash == '#' + this.page)
|
if (document.location.hash == '#' + this.page)
|
||||||
this.pages[this.page - 1].draw();
|
this.pages[this.page - 1].draw();
|
||||||
@ -35,10 +38,41 @@ var PDFView = {
|
|||||||
document.location.hash = this.page;
|
document.location.hash = this.page;
|
||||||
|
|
||||||
var event = document.createEvent('UIEvents');
|
var event = document.createEvent('UIEvents');
|
||||||
event.initUIEvent('scalechange', false, false, window, val);
|
event.initUIEvent('scalechange', false, false, window, 0);
|
||||||
|
event.scale = val;
|
||||||
|
event.resetAutoSettings = resetAutoSettings;
|
||||||
window.dispatchEvent(event);
|
window.dispatchEvent(event);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
parseScale: function(value) {
|
||||||
|
var scale = parseFloat(value);
|
||||||
|
if (scale) {
|
||||||
|
this.setScale(scale, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ('custom' == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var currentPage = this.pages[this.page - 1];
|
||||||
|
var scrollbarPadding = 40;
|
||||||
|
var pageWidthScale = (window.innerWidth - scrollbarPadding) /
|
||||||
|
currentPage.width / kCssUnits;
|
||||||
|
var pageHeightScale = (window.innerHeight - scrollbarPadding) /
|
||||||
|
currentPage.height / kCssUnits;
|
||||||
|
if ('page-width' == value)
|
||||||
|
this.setScale(pageWidthScale);
|
||||||
|
else if ('page-fit' == value)
|
||||||
|
this.setScale(Math.min(pageWidthScale, pageHeightScale));
|
||||||
|
},
|
||||||
|
|
||||||
|
zoomIn: function() {
|
||||||
|
this.setScale(this.currentScale * kDefaultScaleDelta, true);
|
||||||
|
},
|
||||||
|
|
||||||
|
zoomOut: function() {
|
||||||
|
this.setScale(this.currentScale / kDefaultScaleDelta, true);
|
||||||
|
},
|
||||||
|
|
||||||
set page(val) {
|
set page(val) {
|
||||||
var pages = this.pages;
|
var pages = this.pages;
|
||||||
var input = document.getElementById('pageNumber');
|
var input = document.getElementById('pageNumber');
|
||||||
@ -129,7 +163,7 @@ var PDFView = {
|
|||||||
pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
|
pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scale = (scale || kDefaultScale);
|
this.setScale(scale || kDefaultScale, true);
|
||||||
this.page = parseInt(document.location.hash.substring(1)) || 1;
|
this.page = parseInt(document.location.hash.substring(1)) || 1;
|
||||||
this.pagesRefMap = pagesRefMap;
|
this.pagesRefMap = pagesRefMap;
|
||||||
this.destinations = pdf.catalog.destinations;
|
this.destinations = pdf.catalog.destinations;
|
||||||
@ -355,7 +389,7 @@ window.addEventListener('load', function(evt) {
|
|||||||
params[unescape(param[0])] = unescape(param[1]);
|
params[unescape(param[0])] = unescape(param[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
PDFView.open(params.file || kDefaultURL, parseInt(params.scale));
|
PDFView.open(params.file || kDefaultURL, parseFloat(params.scale));
|
||||||
|
|
||||||
if (!window.File || !window.FileReader || !window.FileList || !window.Blob)
|
if (!window.File || !window.FileReader || !window.FileList || !window.Blob)
|
||||||
document.getElementById('fileInput').style.display = 'none';
|
document.getElementById('fileInput').style.display = 'none';
|
||||||
@ -367,7 +401,7 @@ window.addEventListener('pdfloaded', function(evt) {
|
|||||||
PDFView.load(evt.detail);
|
PDFView.load(evt.detail);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
window.addEventListener('scroll', function onscroll(evt) {
|
function updateViewarea() {
|
||||||
var visiblePages = PDFView.getVisiblePages();
|
var visiblePages = PDFView.getVisiblePages();
|
||||||
for (var i = 0; i < visiblePages.length; i++) {
|
for (var i = 0; i < visiblePages.length; i++) {
|
||||||
var page = visiblePages[i];
|
var page = visiblePages[i];
|
||||||
@ -385,8 +419,19 @@ window.addEventListener('scroll', function onscroll(evt) {
|
|||||||
PDFView.page = lastPage.id;
|
PDFView.page = lastPage.id;
|
||||||
else if (currentId < firstPage.id)
|
else if (currentId < firstPage.id)
|
||||||
PDFView.page = firstPage.id;
|
PDFView.page = firstPage.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('scroll', function onscroll(evt) {
|
||||||
|
updateViewarea();
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
|
window.addEventListener('resize', function onscroll(evt) {
|
||||||
|
if (document.getElementById('pageWidthOption').selected ||
|
||||||
|
document.getElementById('pageFitOption').selected)
|
||||||
|
PDFView.parseScale(document.getElementById('scaleSelect').value);
|
||||||
|
updateViewarea();
|
||||||
|
});
|
||||||
|
|
||||||
window.addEventListener('hashchange', function(evt) {
|
window.addEventListener('hashchange', function(evt) {
|
||||||
PDFView.page = PDFView.page;
|
PDFView.page = PDFView.page;
|
||||||
});
|
});
|
||||||
@ -432,13 +477,38 @@ window.addEventListener('transitionend', function(evt) {
|
|||||||
}, 500);
|
}, 500);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
|
|
||||||
window.addEventListener('scalechange', function scalechange(evt) {
|
window.addEventListener('scalechange', function scalechange(evt) {
|
||||||
|
var customScaleOption = document.getElementById('customScaleOption');
|
||||||
|
customScaleOption.selected = false;
|
||||||
|
customScaleOption.removeAttribute('data-scale');
|
||||||
|
|
||||||
|
if (!evt.resetAutoSettings &&
|
||||||
|
(document.getElementById('pageWidthOption').selected ||
|
||||||
|
document.getElementById('pageFitOption').selected)) {
|
||||||
|
updateViewarea();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var options = document.getElementById('scaleSelect').options;
|
var options = document.getElementById('scaleSelect').options;
|
||||||
|
var predefinedValueFound = false;
|
||||||
|
var value = '' + evt.scale;
|
||||||
for (var i = 0; i < options.length; i++) {
|
for (var i = 0; i < options.length; i++) {
|
||||||
var option = options[i];
|
var option = options[i];
|
||||||
option.selected = (option.value == evt.detail);
|
if (option.value != evt.scale) {
|
||||||
|
option.selected = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
option.selected = true;
|
||||||
|
predefinedValueFound = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!predefinedValueFound) {
|
||||||
|
customScaleOption.setAttribute('data-scale', evt.scale);
|
||||||
|
customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';
|
||||||
|
customScaleOption.selected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateViewarea();
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
window.addEventListener('pagechange', function pagechange(evt) {
|
window.addEventListener('pagechange', function pagechange(evt) {
|
||||||
@ -448,3 +518,15 @@ window.addEventListener('pagechange', function pagechange(evt) {
|
|||||||
document.getElementById('previous').disabled = (page == 1);
|
document.getElementById('previous').disabled = (page == 1);
|
||||||
document.getElementById('next').disabled = (page == PDFView.pages.length);
|
document.getElementById('next').disabled = (page == PDFView.pages.length);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
|
window.addEventListener('keydown', function (evt) {
|
||||||
|
switch(evt.keyCode) {
|
||||||
|
case 61:
|
||||||
|
case 107:
|
||||||
|
PDFView.zoomIn();
|
||||||
|
break;
|
||||||
|
case 109:
|
||||||
|
PDFView.zoomOut();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user