|
|
@ -6,6 +6,7 @@ |
|
|
|
var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf'; |
|
|
|
var kDefaultURL = 'compressed.tracemonkey-pldi-09.pdf'; |
|
|
|
var kDefaultScale = 'auto'; |
|
|
|
var kDefaultScale = 'auto'; |
|
|
|
var kDefaultScaleDelta = 1.1; |
|
|
|
var kDefaultScaleDelta = 1.1; |
|
|
|
|
|
|
|
var kUnknownScale = 0; |
|
|
|
var kCacheSize = 20; |
|
|
|
var kCacheSize = 20; |
|
|
|
var kCssUnits = 96.0 / 72.0; |
|
|
|
var kCssUnits = 96.0 / 72.0; |
|
|
|
var kScrollbarPadding = 40; |
|
|
|
var kScrollbarPadding = 40; |
|
|
@ -148,7 +149,7 @@ var currentPageNumber = 1; |
|
|
|
var PDFView = { |
|
|
|
var PDFView = { |
|
|
|
pages: [], |
|
|
|
pages: [], |
|
|
|
thumbnails: [], |
|
|
|
thumbnails: [], |
|
|
|
currentScale: 0, |
|
|
|
currentScale: kUnknownScale, |
|
|
|
currentScaleValue: null, |
|
|
|
currentScaleValue: null, |
|
|
|
initialBookmark: document.location.hash.substring(1), |
|
|
|
initialBookmark: document.location.hash.substring(1), |
|
|
|
|
|
|
|
|
|
|
@ -203,12 +204,12 @@ var PDFView = { |
|
|
|
|
|
|
|
|
|
|
|
zoomIn: function pdfViewZoomIn() { |
|
|
|
zoomIn: function pdfViewZoomIn() { |
|
|
|
var newScale = Math.min(kMaxScale, this.currentScale * kDefaultScaleDelta); |
|
|
|
var newScale = Math.min(kMaxScale, this.currentScale * kDefaultScaleDelta); |
|
|
|
this.setScale(newScale, true); |
|
|
|
this.parseScale(newScale, true); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
zoomOut: function pdfViewZoomOut() { |
|
|
|
zoomOut: function pdfViewZoomOut() { |
|
|
|
var newScale = Math.max(kMinScale, this.currentScale / kDefaultScaleDelta); |
|
|
|
var newScale = Math.max(kMinScale, this.currentScale / kDefaultScaleDelta); |
|
|
|
this.setScale(newScale, true); |
|
|
|
this.parseScale(newScale, true); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
set page(val) { |
|
|
|
set page(val) { |
|
|
@ -458,10 +459,16 @@ var PDFView = { |
|
|
|
} |
|
|
|
} |
|
|
|
else if (storedHash) |
|
|
|
else if (storedHash) |
|
|
|
this.setHash(storedHash); |
|
|
|
this.setHash(storedHash); |
|
|
|
else { |
|
|
|
else if (scale) { |
|
|
|
this.parseScale(scale || kDefaultScale, true); |
|
|
|
this.parseScale(scale, true); |
|
|
|
this.page = 1; |
|
|
|
this.page = 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (PDFView.currentScale === kUnknownScale) { |
|
|
|
|
|
|
|
// Scale was not initialized: invalid bookmark or scale was not specified.
|
|
|
|
|
|
|
|
// Setting the default one.
|
|
|
|
|
|
|
|
this.parseScale(kDefaultScale, true); |
|
|
|
|
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
setHash: function pdfViewSetHash(hash) { |
|
|
|
setHash: function pdfViewSetHash(hash) { |
|
|
@ -748,6 +755,8 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight, |
|
|
|
|
|
|
|
|
|
|
|
if (scale && scale !== PDFView.currentScale) |
|
|
|
if (scale && scale !== PDFView.currentScale) |
|
|
|
PDFView.parseScale(scale, true); |
|
|
|
PDFView.parseScale(scale, true); |
|
|
|
|
|
|
|
else if (PDFView.currentScale === kUnknownScale) |
|
|
|
|
|
|
|
PDFView.parseScale(kDefaultScale, true); |
|
|
|
|
|
|
|
|
|
|
|
setTimeout(function pageViewScrollIntoViewRelayout() { |
|
|
|
setTimeout(function pageViewScrollIntoViewRelayout() { |
|
|
|
// letting page to re-layout before scrolling
|
|
|
|
// letting page to re-layout before scrolling
|
|
|
@ -966,22 +975,55 @@ var TextLayerBuilder = function textLayerBuilder(textLayerDiv) { |
|
|
|
var self = this; |
|
|
|
var self = this; |
|
|
|
var textDivs = this.textDivs; |
|
|
|
var textDivs = this.textDivs; |
|
|
|
var textLayerDiv = this.textLayerDiv; |
|
|
|
var textLayerDiv = this.textLayerDiv; |
|
|
|
this.textLayerTimer = setInterval(function renderTextLayer() { |
|
|
|
var renderTimer = null; |
|
|
|
|
|
|
|
var renderingDone = false; |
|
|
|
|
|
|
|
var renderInterval = 0; |
|
|
|
|
|
|
|
var resumeInterval = 500; // in ms
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Render the text layer, one div at a time
|
|
|
|
|
|
|
|
function renderTextLayer() { |
|
|
|
if (textDivs.length === 0) { |
|
|
|
if (textDivs.length === 0) { |
|
|
|
clearInterval(self.textLayerTimer); |
|
|
|
clearInterval(renderTimer); |
|
|
|
|
|
|
|
renderingDone = true; |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
var textDiv = textDivs.shift(); |
|
|
|
var textDiv = textDivs.shift(); |
|
|
|
if (textDiv.dataset.textLength >= 1) { // avoid div by zero
|
|
|
|
if (textDiv.dataset.textLength > 0) { |
|
|
|
textLayerDiv.appendChild(textDiv); |
|
|
|
textLayerDiv.appendChild(textDiv); |
|
|
|
// Adjust div width (via letterSpacing) to match canvas text
|
|
|
|
|
|
|
|
// Due to the .offsetWidth calls, this is slow
|
|
|
|
if (textDiv.dataset.textLength > 1) { // avoid div by zero
|
|
|
|
textDiv.style.letterSpacing = |
|
|
|
// Adjust div width (via letterSpacing) to match canvas text
|
|
|
|
((textDiv.dataset.canvasWidth - textDiv.offsetWidth) / |
|
|
|
// Due to the .offsetWidth calls, this is slow
|
|
|
|
(textDiv.dataset.textLength - 1)) + 'px'; |
|
|
|
// This needs to come after appending to the DOM
|
|
|
|
|
|
|
|
textDiv.style.letterSpacing = |
|
|
|
|
|
|
|
((textDiv.dataset.canvasWidth - textDiv.offsetWidth) / |
|
|
|
|
|
|
|
(textDiv.dataset.textLength - 1)) + 'px'; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} // textLength > 0
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
renderTimer = setInterval(renderTextLayer, renderInterval); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Stop rendering when user scrolls. Resume after XXX milliseconds
|
|
|
|
|
|
|
|
// of no scroll events
|
|
|
|
|
|
|
|
var scrollTimer = null; |
|
|
|
|
|
|
|
function textLayerOnScroll() { |
|
|
|
|
|
|
|
if (renderingDone) { |
|
|
|
|
|
|
|
window.removeEventListener('scroll', textLayerOnScroll, false); |
|
|
|
|
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
}, 0); |
|
|
|
|
|
|
|
}; |
|
|
|
// Immediately pause rendering
|
|
|
|
|
|
|
|
clearInterval(renderTimer); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clearTimeout(scrollTimer); |
|
|
|
|
|
|
|
scrollTimer = setTimeout(function textLayerScrollTimer() { |
|
|
|
|
|
|
|
// Resume rendering
|
|
|
|
|
|
|
|
renderTimer = setInterval(renderTextLayer, renderInterval); |
|
|
|
|
|
|
|
}, resumeInterval); |
|
|
|
|
|
|
|
}; // textLayerOnScroll
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
window.addEventListener('scroll', textLayerOnScroll, false); |
|
|
|
|
|
|
|
}; // endLayout
|
|
|
|
|
|
|
|
|
|
|
|
this.appendText = function textLayerBuilderAppendText(text, |
|
|
|
this.appendText = function textLayerBuilderAppendText(text, |
|
|
|
fontName, fontSize) { |
|
|
|
fontName, fontSize) { |
|
|
@ -1240,7 +1282,7 @@ window.addEventListener('keydown', function keydown(evt) { |
|
|
|
handled = true; |
|
|
|
handled = true; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 48: // '0'
|
|
|
|
case 48: // '0'
|
|
|
|
PDFView.setScale(kDefaultScale, true); |
|
|
|
PDFView.parseScale(kDefaultScale, true); |
|
|
|
handled = true; |
|
|
|
handled = true; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 37: // left arrow
|
|
|
|
case 37: // left arrow
|
|
|
|