Skip to content

Commit

Permalink
Merge pull request #18627 from richard-smith-preservica/rcs/send-page…
Browse files Browse the repository at this point in the history
…-dict-requests-in-parallel

Send fetch requests for all page dict lookups in parallel
  • Loading branch information
Snuffleupagus authored Aug 21, 2024
2 parents e0fc1a3 + a67b9ae commit 908f453
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions src/core/catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ class Catalog {
this.globalImageCache = new GlobalImageCache();
this.pageKidsCountCache = new RefSetCache();
this.pageIndexCache = new RefSetCache();
this.pageDictCache = new RefSetCache();
this.nonBlendModesSet = new RefSet();
this.systemFontCache = new Map();
}
Expand Down Expand Up @@ -1161,6 +1162,7 @@ class Catalog {
this.globalImageCache.clear(/* onlyData = */ manuallyTriggered);
this.pageKidsCountCache.clear();
this.pageIndexCache.clear();
this.pageDictCache.clear();
this.nonBlendModesSet.clear();

const translatedFonts = await Promise.all(this.fontCache);
Expand All @@ -1184,7 +1186,8 @@ class Catalog {
}
const xref = this.xref,
pageKidsCountCache = this.pageKidsCountCache,
pageIndexCache = this.pageIndexCache;
pageIndexCache = this.pageIndexCache,
pageDictCache = this.pageDictCache;
let currentPageIndex = 0;

while (nodesToVisit.length) {
Expand All @@ -1203,7 +1206,8 @@ class Catalog {
}
visitedNodes.put(currentNode);

const obj = await xref.fetchAsync(currentNode);
const obj = await (pageDictCache.get(currentNode) ||
xref.fetchAsync(currentNode));
if (obj instanceof Dict) {
let type = obj.getRaw("Type");
if (type instanceof Ref) {
Expand Down Expand Up @@ -1285,7 +1289,18 @@ class Catalog {
// node further down in the tree (see issue5644.pdf, issue8088.pdf),
// and to ensure that we actually find the correct `Page` dict.
for (let last = kids.length - 1; last >= 0; last--) {
nodesToVisit.push(kids[last]);
const lastKid = kids[last];
nodesToVisit.push(lastKid);

// Launch all requests in parallel so we don't wait for each one in turn
// when looking for a page near the end, if all the pages are top level.
if (
currentNode === this.toplevelPagesDict &&
lastKid instanceof Ref &&
!pageDictCache.has(lastKid)
) {
pageDictCache.put(lastKid, xref.fetchAsync(lastKid));
}
}
}

Expand Down

0 comments on commit 908f453

Please sign in to comment.