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

Extend the globally cached image main-thread copying to "complex" images as well (PR 17428 follow-up)

In PR 17428 this functionality was limited to "larger" images, to not affect performance negatively. However it turns out that it's also beneficial to consider more "complex" images, regardless of their size, that contain /SMask or /Mask data; see issue 11518.
This commit is contained in:
Jonas Jenwald 2024-04-20 09:55:18 +02:00
parent 5ad42c13ad
commit 91898e5923
4 changed files with 71 additions and 6 deletions

View file

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/4076920/set-2_lyst7242.pdf

View file

@ -4336,6 +4336,13 @@
"link": true,
"type": "other"
},
{
"id": "issue11518",
"file": "pdfs/issue11518.pdf",
"md5": "4cced24e75c35654d47141cef348301e",
"link": true,
"type": "other"
},
{
"id": "issue4722",
"file": "pdfs/issue4722.pdf",

View file

@ -4001,6 +4001,60 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
firstStatsOverall = null;
});
it("caches image resources at the document/page level, with main-thread copying of complex images (issue 11518)", async function () {
if (isNodeJS) {
pending("Linked test-cases are not supported in Node.js.");
}
const { NUM_PAGES_THRESHOLD } = GlobalImageCache;
const loadingTask = getDocument(
buildGetDocumentParams("issue11518.pdf", {
pdfBug: true,
})
);
const pdfDoc = await loadingTask.promise;
let checkedCopyLocalImage = false,
firstStatsOverall = null;
for (let i = 1; i <= pdfDoc.numPages; i++) {
const pdfPage = await pdfDoc.getPage(i);
const viewport = pdfPage.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(
viewport.width,
viewport.height
);
const renderTask = pdfPage.render({
canvasContext: canvasAndCtx.context,
viewport,
});
await renderTask.promise;
// The canvas is no longer necessary, since we only care about
// the stats below.
CanvasFactory.destroy(canvasAndCtx);
const [statsOverall] = pdfPage.stats.times
.filter(time => time.name === "Overall")
.map(time => time.end - time.start);
if (i === 1) {
firstStatsOverall = statsOverall;
} else if (i === NUM_PAGES_THRESHOLD) {
checkedCopyLocalImage = true;
// Ensure that the images were copied in the main-thread, rather
// than being re-parsed in the worker-thread (which is slower).
expect(statsOverall).toBeLessThan(firstStatsOverall / 2);
} else if (i > NUM_PAGES_THRESHOLD) {
break;
}
}
expect(checkedCopyLocalImage).toBeTruthy();
await loadingTask.destroy();
firstStatsOverall = null;
});
it("render for printing, with `printAnnotationStorage` set", async function () {
async function getPrintData(printAnnotationStorage = null) {
const canvasAndCtx = CanvasFactory.create(