diff --git a/bower.json b/bower.json index db84836d3..53475e3c6 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.1187", + "version": "1.0.1189", "main": [ "build/pdf.js", "build/pdf.worker.js" diff --git a/build/pdf.combined.js b/build/pdf.combined.js index f859e7654..c8c2a3e0f 100644 --- a/build/pdf.combined.js +++ b/build/pdf.combined.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1187'; -PDFJS.build = 'e82c84e'; +PDFJS.version = '1.0.1189'; +PDFJS.build = 'f4dbd69'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/build/pdf.js b/build/pdf.js index bb68dd03b..97454a37d 100644 --- a/build/pdf.js +++ b/build/pdf.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1187'; -PDFJS.build = 'e82c84e'; +PDFJS.version = '1.0.1189'; +PDFJS.build = 'f4dbd69'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/build/pdf.worker.js b/build/pdf.worker.js index e1038dbad..ccfaa60f2 100644 --- a/build/pdf.worker.js +++ b/build/pdf.worker.js @@ -22,8 +22,8 @@ if (typeof PDFJS === 'undefined') { (typeof window !== 'undefined' ? window : this).PDFJS = {}; } -PDFJS.version = '1.0.1187'; -PDFJS.build = 'e82c84e'; +PDFJS.version = '1.0.1189'; +PDFJS.build = 'f4dbd69'; (function pdfjsWrapper() { // Use strict in our context only - users might not want it diff --git a/package.json b/package.json index 6a04d4b15..259ad2ea7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pdfjs-dist", - "version": "1.0.1187", + "version": "1.0.1189", "description": "Generic build of Mozilla's PDF.js library.", "keywords": [ "Mozilla", diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index dcf6c9bba..1b9d7983c 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -172,13 +172,10 @@ function watchScroll(viewAreaElement, callback) { var currentY = viewAreaElement.scrollTop; var lastY = state.lastY; - if (currentY > lastY) { - state.down = true; - } else if (currentY < lastY) { - state.down = false; + if (currentY !== lastY) { + state.down = currentY > lastY; } state.lastY = currentY; - // else do nothing and use previous value callback(state); }); }; @@ -194,6 +191,38 @@ function watchScroll(viewAreaElement, callback) { return state; } +/** + * Use binary search to find the index of the first item in a given array which + * passes a given condition. The items are expected to be sorted in the sense + * that if the condition is true for one item in the array, then it is also true + * for all following items. + * + * @returns {Number} Index of the first array element to pass the test, + * or |items.length| if no such element exists. + */ +function binarySearchFirstItem(items, condition) { + var minIndex = 0; + var maxIndex = items.length - 1; + + if (items.length === 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + + while (minIndex < maxIndex) { + var currentIndex = (minIndex + maxIndex) >> 1; + var currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; /* === maxIndex */ +} + /** * Generic helper to find out what elements are visible within a scroll pane. */ @@ -201,30 +230,45 @@ function getVisibleElements(scrollEl, views, sortByVisibility) { var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; - var visible = [], view; + function isElementBottomBelowViewTop(view) { + var element = view.div; + var elementBottom = + element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + + var visible = [], view, element; var currentHeight, viewHeight, hiddenHeight, percentHeight; var currentWidth, viewWidth; - for (var i = 0, ii = views.length; i < ii; ++i) { + var firstVisibleElementInd = (views.length === 0) ? 0 : + binarySearchFirstItem(views, isElementBottomBelowViewTop); + + for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { view = views[i]; - currentHeight = view.div.offsetTop + view.div.clientTop; - viewHeight = view.div.clientHeight; - if ((currentHeight + viewHeight) < top) { - continue; - } + element = view.div; + currentHeight = element.offsetTop + element.clientTop; + viewHeight = element.clientHeight; + if (currentHeight > bottom) { break; } - currentWidth = view.div.offsetLeft + view.div.clientLeft; - viewWidth = view.div.clientWidth; - if ((currentWidth + viewWidth) < left || currentWidth > right) { + + currentWidth = element.offsetLeft + element.clientLeft; + viewWidth = element.clientWidth; + if (currentWidth + viewWidth < left || currentWidth > right) { continue; } hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom); percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; - visible.push({ id: view.id, x: currentWidth, y: currentHeight, - view: view, percent: percentHeight }); + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + view: view, + percent: percentHeight + }); } var first = visible[0];