Skip to content

Commit 1afc3d4

Browse files
committed
Modify 'extractCanvases' and 'isCanvasMonochrome' to support OffScreenCanvas
1 parent c8d2556 commit 1afc3d4

5 files changed

Lines changed: 71 additions & 10 deletions

File tree

src/core/evaluator.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,8 @@ class PartialEvaluator {
472472
}
473473

474474
hasCanvasFilters(resources) {
475+
// TODO(Aditi): Investigate font resources for potential
476+
// filters
475477
if (!(resources instanceof Dict)) {
476478
return false;
477479
}

src/display/api.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3691,8 +3691,6 @@ class InternalRenderTask {
36913691

36923692
const { viewport, transform, background, dependencyTracker } = this.params;
36933693

3694-
// TODO(Aditi): Should we disable worker rendering when pdfBug is enabled?
3695-
36963694
// Worker Rendering is disabled when canvas filters are present because
36973695
// OffscreenCanvas's OffscreenCanvasRenderingContext2D completely ignores
36983696
// the value of .filter defined with a data url.
@@ -3704,7 +3702,6 @@ class InternalRenderTask {
37043702
!hasCanvasFilters &&
37053703
!this.pageColors;
37063704

3707-
// TODO(Aditi): Should we disable worker rendering when pdfBug is enabled?
37083705
if (!useWorkerRendering) {
37093706
this._rendererHandler = null;
37103707
}
@@ -3738,8 +3735,6 @@ class InternalRenderTask {
37383735
},
37393736
configurable: true,
37403737
});
3741-
// TODO(Aditi): Add isCanvasMonochrome and other helpers for
3742-
// detailCanvas tests
37433738
const initParams = {
37443739
canvas: offscreen,
37453740
pageIndex: this._pageIndex,

src/display/renderer_worker.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,6 @@ class RendererMessageHandler {
200200
transparency,
201201
background,
202202
} = data;
203-
// TODO(Aditi): Verify if dependencyTracker can be used.
204203
const objs = this.#getPageObjs(pageIndex);
205204
const optionalContentConfig = new OptionalContentConfig(
206205
optionalContentConfigData,

test/integration/test_utils.mjs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,8 +896,28 @@ function isCanvasMonochrome(page, pageNumber, rectangle, color) {
896896
const canvas = document.querySelector(
897897
`.page[data-page-number = "${pageN}"] .canvasWrapper canvas`
898898
);
899+
if (!canvas) {
900+
return false;
901+
}
899902
const canvasRect = canvas.getBoundingClientRect();
900-
const ctx = canvas.getContext("2d");
903+
let ctx;
904+
try {
905+
ctx = canvas.getContext("2d", { willReadFrequently: true });
906+
} catch {
907+
// Happens when the canvas has been transferred to OffscreenCanvas.
908+
}
909+
if (!ctx) {
910+
let tempCanvas;
911+
if (typeof OffscreenCanvas === "function") {
912+
tempCanvas = new OffscreenCanvas(canvas.width, canvas.height);
913+
} else {
914+
tempCanvas = document.createElement("canvas");
915+
tempCanvas.width = canvas.width;
916+
tempCanvas.height = canvas.height;
917+
}
918+
ctx = tempCanvas.getContext("2d", { willReadFrequently: true });
919+
ctx.drawImage(canvas, 0, 0);
920+
}
901921
rect ||= canvasRect;
902922
const { data } = ctx.getImageData(
903923
rect.x - canvasRect.x,

test/integration/viewer_spec.mjs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,11 +486,56 @@ describe("PDF viewer", () => {
486486
const pageOne = document.querySelector(
487487
`.page[data-page-number='${pageNumber}']`
488488
);
489+
function getContextFromCanvas(canvas) {
490+
try {
491+
return canvas.getContext("2d", { willReadFrequently: true });
492+
} catch {
493+
// Can happen when the canvas has been transferred to OffscreenCanvas.
494+
}
495+
496+
let tempCanvas;
497+
if (typeof OffscreenCanvas === "function") {
498+
tempCanvas = new OffscreenCanvas(canvas.width, canvas.height);
499+
} else {
500+
tempCanvas = document.createElement("canvas");
501+
tempCanvas.width = canvas.width;
502+
tempCanvas.height = canvas.height;
503+
}
504+
const tempCtx = tempCanvas.getContext("2d", {
505+
willReadFrequently: true,
506+
});
507+
tempCtx.drawImage(canvas, 0, 0);
508+
return tempCtx;
509+
}
510+
511+
if (!pageOne) {
512+
return [];
513+
}
514+
489515
return Array.from(pageOne.querySelectorAll("canvas"), canvas => {
490516
const { width, height } = canvas;
491-
const ctx = canvas.getContext("2d");
492-
const topLeft = ctx.getImageData(2, 2, 1, 1).data;
493-
const bottomRight = ctx.getImageData(width - 3, height - 3, 1, 1).data;
517+
if (width === 0 || height === 0) {
518+
return {
519+
size: 0,
520+
width,
521+
height,
522+
topLeft: null,
523+
bottomRight: null,
524+
};
525+
}
526+
const ctx = getContextFromCanvas(canvas);
527+
const topLeft = ctx.getImageData(
528+
Math.min(2, width - 1),
529+
Math.min(2, height - 1),
530+
1,
531+
1
532+
).data;
533+
const bottomRight = ctx.getImageData(
534+
Math.max(0, width - 3),
535+
Math.max(0, height - 3),
536+
1,
537+
1
538+
).data;
494539
return {
495540
size: width * height,
496541
width,

0 commit comments

Comments
 (0)