From ec311f303b40ed6457278ec157d49fb761144f36 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Fri, 29 Mar 2013 13:26:25 -0700 Subject: [PATCH] Use white backdrop when possible. --- src/api.js | 6 +++--- src/canvas.js | 18 +++++++++++++++++- src/evaluator.js | 14 +++++++++++--- test/driver.js | 5 +---- web/viewer.js | 1 - 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/api.js b/src/api.js index a5ea5b4cd..cc4852319 100644 --- a/src/api.js +++ b/src/api.js @@ -384,11 +384,11 @@ var PDFPageProxy = (function PDFPageProxyClosure() { var stats = this.stats; stats.time('Rendering'); - gfx.beginDrawing(viewport); + var operatorList = this.operatorList; + gfx.beginDrawing(viewport, operatorList.transparency); var startIdx = 0; - var length = this.operatorList.fnArray.length; - var operatorList = this.operatorList; + var length = operatorList.fnArray.length; var stepper = null; if (PDFJS.pdfBug && 'StepperManager' in globalScope && globalScope['StepperManager'].enabled) { diff --git a/src/canvas.js b/src/canvas.js index 5db39ebbb..88d58d64f 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -415,7 +415,23 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { 'shadingFill': true }, - beginDrawing: function CanvasGraphics_beginDrawing(viewport) { + beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) { + // For pdfs that use blend modes we have to clear the canvas else certain + // blend modes can look wrong since we'd be blending with a white + // backdrop. The problem with a transparent backdrop though is we then + // don't get sub pixel anti aliasing on text, so we fill with white if + // we can. + var width = this.ctx.canvas.width; + var height = this.ctx.canvas.height; + if (transparency) { + this.ctx.clearRect(0, 0, width, height); + } else { + this.ctx.save(); + this.ctx.fillStyle = 'rgb(255, 255, 255)'; + this.ctx.fillRect(0, 0, width, height); + this.ctx.restore(); + } + var transform = viewport.transform; this.ctx.save(); this.ctx.transform.apply(this.ctx, transform); diff --git a/src/evaluator.js b/src/evaluator.js index 648762b81..77edf34b1 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -361,8 +361,11 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }, handler, xref, resources, image, inline); } - if (!queue) - queue = {}; + if (!queue) { + queue = { + transparency: false + }; + } if (!queue.argsArray) { queue.argsArray = []; @@ -532,7 +535,6 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { case 'FL': case 'CA': case 'ca': - case 'BM': gsStateObj.push([key, value]); break; case 'Font': @@ -542,6 +544,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { value[1] ]); break; + case 'BM': + if (!isName(value) || value.name !== 'Normal') { + queue.transparency = true; + } + gsStateObj.push([key, value]); + break; case 'SMask': // We support the default so don't trigger the TODO. if (!isName(value) || value.name != 'None') diff --git a/test/driver.js b/test/driver.js index bb56877ca..e20cc3919 100644 --- a/test/driver.js +++ b/test/driver.js @@ -394,10 +394,7 @@ function info(message) { } function clear(ctx) { - ctx.save(); - ctx.fillStyle = 'rgb(255, 255, 255)'; - ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.restore(); + ctx.clearRect(0, 0, canvas.width, canvas.height); } /* Auto-scroll if the scrollbar is near the bottom, otherwise do nothing. */ diff --git a/web/viewer.js b/web/viewer.js index 232f8fbe5..a68b69cd9 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -2142,7 +2142,6 @@ var PageView = function pageView(container, pdfPage, id, scale, } var ctx = canvas.getContext('2d'); - ctx.clearRect(0, 0, canvas.width, canvas.height); // TODO(mack): use data attributes to store these ctx._scaleX = outputScale.sx; ctx._scaleY = outputScale.sy;