From 148e762cabfb720ed27afb24587a57a8619fd5e4 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Tue, 2 May 2023 16:37:49 +0200 Subject: [PATCH] Apply HCM filters on annotations which have their own canvas (bug 1830850) --- src/display/api.js | 5 +++-- src/display/canvas.js | 19 ++++++++++++++----- test/test_manifest.json | 12 ++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 6a835c20047330..26a5f9e0cb2d31 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -3326,7 +3326,8 @@ class InternalRenderTask { this.canvasFactory, this.filterFactory, { optionalContentConfig }, - this.annotationCanvasMap + this.annotationCanvasMap, + this.pageColors ); this.gfx.beginDrawing({ transform, @@ -3342,7 +3343,7 @@ class InternalRenderTask { cancel(error = null, extraDelay = 0) { this.running = false; this.cancelled = true; - this.gfx?.endDrawing(this.pageColors); + this.gfx?.endDrawing(); if (this._canvas) { InternalRenderTask.#canvasInUse.delete(this._canvas); diff --git a/src/display/canvas.js b/src/display/canvas.js index ef9729b3bdbaca..50ce776b06831b 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -947,7 +947,8 @@ class CanvasGraphics { canvasFactory, filterFactory, { optionalContentConfig, markedContentStack = null }, - annotationCanvasMap + annotationCanvasMap, + pageColors ) { this.ctx = canvasCtx; this.current = new CanvasExtraState( @@ -983,6 +984,7 @@ class CanvasGraphics { this.viewportScale = 1; this.outputScaleX = 1; this.outputScaleY = 1; + this.pageColors = pageColors; this._cachedScaleForStroking = null; this._cachedGetSinglePixelWidth = null; @@ -1135,7 +1137,7 @@ class CanvasGraphics { } } - endDrawing(pageColors = null) { + endDrawing() { this.#restoreInitialState(); this.cachedCanvases.clear(); @@ -1153,11 +1155,14 @@ class CanvasGraphics { cache.clear(); } this._cachedBitmapsMap.clear(); + this.#drawFilter(); + } - if (pageColors) { + #drawFilter() { + if (this.pageColors) { const hcmFilterId = this.filterFactory.addHCMFilter( - pageColors.foreground, - pageColors.background + this.pageColors.foreground, + this.pageColors.background ); if (hcmFilterId !== "none") { const savedFilter = this.ctx.filter; @@ -2712,6 +2717,7 @@ class CanvasGraphics { this.annotationCanvasMap.set(id, canvas); this.annotationCanvas.savedCtx = this.ctx; this.ctx = context; + this.ctx.save(); this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); resetCtxToDefault(this.ctx); @@ -2735,6 +2741,9 @@ class CanvasGraphics { endAnnotation() { if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; delete this.annotationCanvas.savedCtx; delete this.annotationCanvas; diff --git a/test/test_manifest.json b/test/test_manifest.json index e2caef285203ff..f144bd33e0d0cb 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -7530,5 +7530,17 @@ "md5": "1aa34fbb2154f9a647c7fa9e90db0eff", "rounds": 1, "type": "text" + }, + { + "id": "annotation-fileattachment-forced-colors-eq", + "file": "pdfs/annotation-fileattachment.pdf", + "md5": "9a192d8b1a7dc652a19835f6f08098bd", + "rounds": 1, + "pageColors": { + "background": "black", + "foreground": "#00FF00" + }, + "annotations": true, + "type": "eq" } ]