From 9881dbf92712dbae18ec6f9874eba7789a2cfb80 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Mon, 10 Apr 2023 11:00:35 +0200 Subject: [PATCH] Attempt to also cache images at the "page"-level (issue 16263) Currently we have two separate image-caches on the worker-thread: - A local one, which is unique to each `PartialEvaluator.getOperatorList` invocation. This one caches both names *and* references, since image-resources may be accessed in either way. - A global one, which applies to the entire PDF documents and all its pages. This one only caches references, since nothing else would work. This patch introduces a third image-cache, which essentially sits "between" the two existing ones. The new `RegionalImageCache`[1] will be usable throughout a `PartialEvaluator` instance, and consequently it *only* caches references, which thus allows us to keep track of repeated image-resources found in e.g. different /Form and /SMask objects. --- [1] For lack of a better word, since naming things is hard... --- src/core/evaluator.js | 48 +++++++++++++++++++++++++++++++-------- src/core/image_utils.js | 17 ++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue16263.pdf | Bin 0 -> 58122 bytes test/test_manifest.json | 6 +++++ 5 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 test/pdfs/issue16263.pdf diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 4058885e2..3cafca5e3 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -59,6 +59,7 @@ import { LocalGStateCache, LocalImageCache, LocalTilingPatternCache, + RegionalImageCache, } from "./image_utils.js"; import { NullStream, Stream } from "./stream.js"; import { BaseStream } from "./base_stream.js"; @@ -229,6 +230,7 @@ class PartialEvaluator { this.options = options || DefaultPartialEvaluatorOptions; this.parsingType3Font = false; + this._regionalImageCache = new RegionalImageCache(); this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes); } @@ -635,11 +637,20 @@ class PartialEvaluator { ); if (cacheKey) { - localImageCache.set(cacheKey, imageRef, { + const cacheData = { fn: OPS.paintImageMaskXObject, args, optionalContent, - }); + }; + localImageCache.set(cacheKey, imageRef, cacheData); + + if (imageRef) { + this._regionalImageCache.set( + /* name = */ null, + imageRef, + cacheData + ); + } } return; } @@ -664,11 +675,20 @@ class PartialEvaluator { ); if (cacheKey) { - localImageCache.set(cacheKey, imageRef, { + const cacheData = { fn: OPS.paintSolidColorImageMask, args: [], optionalContent, - }); + }; + localImageCache.set(cacheKey, imageRef, cacheData); + + if (imageRef) { + this._regionalImageCache.set( + /* name = */ null, + imageRef, + cacheData + ); + } } return; } @@ -693,11 +713,16 @@ class PartialEvaluator { ); if (cacheKey) { - localImageCache.set(cacheKey, imageRef, { + const cacheData = { fn: OPS.paintImageMaskXObject, args, optionalContent, - }); + }; + localImageCache.set(cacheKey, imageRef, cacheData); + + if (imageRef) { + this._regionalImageCache.set(/* name = */ null, imageRef, cacheData); + } } return; } @@ -790,13 +815,16 @@ class PartialEvaluator { operatorList.addImageOps(OPS.paintImageXObject, args, optionalContent); if (cacheKey) { - localImageCache.set(cacheKey, imageRef, { + const cacheData = { fn: OPS.paintImageXObject, args, optionalContent, - }); + }; + localImageCache.set(cacheKey, imageRef, cacheData); if (imageRef) { + this._regionalImageCache.set(/* name = */ null, imageRef, cacheData); + assert(!isInline, "Cannot cache an inline image globally."); this.globalImageCache.addPageIndex(imageRef, this.pageIndex); @@ -1723,7 +1751,9 @@ class PartialEvaluator { let xobj = xobjs.getRaw(name); if (xobj instanceof Ref) { - const localImage = localImageCache.getByRef(xobj); + const localImage = + localImageCache.getByRef(xobj) || + self._regionalImageCache.getByRef(xobj); if (localImage) { operatorList.addImageOps( localImage.fn, diff --git a/src/core/image_utils.js b/src/core/image_utils.js index 1dfb5b740..f93729c29 100644 --- a/src/core/image_utils.js +++ b/src/core/image_utils.js @@ -156,6 +156,22 @@ class LocalTilingPatternCache extends BaseLocalCache { } } +class RegionalImageCache extends BaseLocalCache { + constructor(options) { + super({ onlyRefs: true }); + } + + set(name = null, ref, data) { + if (!ref) { + throw new Error('RegionalImageCache.set - expected "ref" argument.'); + } + if (this._imageCache.has(ref)) { + return; + } + this._imageCache.put(ref, data); + } +} + class GlobalImageCache { static get NUM_PAGES_THRESHOLD() { return shadow(this, "NUM_PAGES_THRESHOLD", 2); @@ -288,4 +304,5 @@ export { LocalGStateCache, LocalImageCache, LocalTilingPatternCache, + RegionalImageCache, }; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 7756d4512..1bfcaac8b 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -225,6 +225,7 @@ !issue840.pdf !160F-2019.pdf !issue4402_reduced.pdf +!issue16263.pdf !issue845r.pdf !issue3405r.pdf !issue14130.pdf diff --git a/test/pdfs/issue16263.pdf b/test/pdfs/issue16263.pdf new file mode 100644 index 0000000000000000000000000000000000000000..002b207f1d832645cbd567221929d0dcf0656ad4 GIT binary patch literal 58122 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