|
|
@ -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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|