1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-22 16:18:08 +02:00

Improve caching for the Catalog.getPageIndex method (PR 13319 follow-up)

This method is now being used a lot more, compared to when it's added, since it's now used together with scripting as part of the `PDFDocument.fieldObjects` parsing (called during viewer initialization).
For /Page Dictionaries that we've already parsed, the `pageIndex` corresponding to a particular Reference is already known and we're thus able to skip *all* parsing in the `Catalog.getPageIndex` method for those cases.
This commit is contained in:
Jonas Jenwald 2021-12-29 15:57:34 +01:00
parent a20393e6e4
commit 1491459dea
2 changed files with 20 additions and 4 deletions

View file

@ -1099,7 +1099,8 @@ class Catalog {
visitedNodes.put(pagesRef);
}
const xref = this.xref,
pageKidsCountCache = this.pageKidsCountCache;
pageKidsCountCache = this.pageKidsCountCache,
pageIndexCache = this.pageIndexCache;
let currentPageIndex = 0;
while (nodesToVisit.length) {
@ -1128,9 +1129,13 @@ class Catalog {
// Cache the Page reference, since it can *greatly* improve
// performance by reducing redundant lookups in long documents
// where all nodes are found at *one* level of the tree.
if (currentNode && !pageKidsCountCache.has(currentNode)) {
if (!pageKidsCountCache.has(currentNode)) {
pageKidsCountCache.put(currentNode, 1);
}
// Help improve performance of the `getPageIndex` method.
if (!pageIndexCache.has(currentNode)) {
pageIndexCache.put(currentNode, currentPageIndex);
}
if (currentPageIndex === pageIndex) {
return [obj, currentNode];
@ -1215,10 +1220,16 @@ class Catalog {
if (pagesRef instanceof Ref) {
visitedNodes.put(pagesRef);
}
const map = new Map();
const map = new Map(),
pageIndexCache = this.pageIndexCache;
let pageIndex = 0;
function addPageDict(pageDict, pageRef) {
// Help improve performance of the `getPageIndex` method.
if (pageRef && !pageIndexCache.has(pageRef)) {
pageIndexCache.put(pageRef, pageIndex);
}
map.set(pageIndex++, [pageDict, pageRef]);
}
function addPageError(error) {

View file

@ -1285,9 +1285,14 @@ class PDFDocument {
type = await xref.fetchAsync(type);
}
if (isName(type, "Page") || (!obj.has("Type") && !obj.has("Kids"))) {
if (ref && !catalog.pageKidsCountCache.has(ref)) {
if (!catalog.pageKidsCountCache.has(ref)) {
catalog.pageKidsCountCache.put(ref, 1); // Cache the Page reference.
}
// Help improve performance of the `Catalog.getPageIndex` method.
if (!catalog.pageIndexCache.has(ref)) {
catalog.pageIndexCache.put(ref, 0);
}
return [obj, ref];
}
}