From 5cb64fbab7f20a53b48582be5a582f6df8e5f747 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Fri, 28 Oct 2011 14:10:10 -0700 Subject: [PATCH] Initial alpha transparency support. --- src/canvas.js | 54 ++++++++++++++++++--------------------- src/evaluator.js | 4 +-- test/pdfs/alphatrans.pdf | Bin 0 -> 16910 bytes 3 files changed, 27 insertions(+), 31 deletions(-) create mode 100644 test/pdfs/alphatrans.pdf diff --git a/src/canvas.js b/src/canvas.js index 70dd65e3d..3c7551404 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -28,6 +28,9 @@ var CanvasExtraState = (function canvasExtraState() { // Default fore and background colors this.fillColor = '#000000'; this.strokeColor = '#000000'; + // Note: fill alpha applies to all non-stroking operations + this.fillAlpha = 1; + this.strokeAlpha = 1; this.old = old; } @@ -206,6 +209,13 @@ var CanvasGraphics = (function canvasGraphics() { case 'Font': this.setFont(state[1], state[2]); break; + case 'CA': + this.current.strokeAlpha = state[1]; + break; + case 'ca': + this.current.fillAlpha = state[1]; + this.ctx.globalAlpha = state[1]; + break; } } }, @@ -254,9 +264,13 @@ var CanvasGraphics = (function canvasGraphics() { rectangle: function canvasGraphicsRectangle(x, y, width, height) { this.ctx.rect(x, y, width, height); }, - stroke: function canvasGraphicsStroke() { + stroke: function canvasGraphicsStroke(consumePath) { + consumePath = typeof consumePath !== 'undefined' ? consumePath : true; var ctx = this.ctx; var strokeColor = this.current.strokeColor; + // For stroke we want to temporarily change the global alpha to the + // stroking alpha. + ctx.globalAlpha = this.current.strokeAlpha; if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') { // for patterns, we transform to pattern space, calculate @@ -268,14 +282,17 @@ var CanvasGraphics = (function canvasGraphics() { } else { ctx.stroke(); } - - this.consumePath(); + if (consumePath) + this.consumePath(); + // Restore the global alpha to the fill alpha + ctx.globalAlpha = this.current.fillAlpha; }, closeStroke: function canvasGraphicsCloseStroke() { this.closePath(); this.stroke(); }, - fill: function canvasGraphicsFill() { + fill: function canvasGraphicsFill(consumePath) { + consumePath = typeof consumePath !== 'undefined' ? consumePath : true; var ctx = this.ctx; var fillColor = this.current.fillColor; @@ -288,8 +305,8 @@ var CanvasGraphics = (function canvasGraphics() { } else { ctx.fill(); } - - this.consumePath(); + if (consumePath) + this.consumePath(); }, eoFill: function canvasGraphicsEoFill() { var savedFillRule = this.setEOFillRule(); @@ -297,29 +314,8 @@ var CanvasGraphics = (function canvasGraphics() { this.restoreFillRule(savedFillRule); }, fillStroke: function canvasGraphicsFillStroke() { - var ctx = this.ctx; - - var fillColor = this.current.fillColor; - if (fillColor && fillColor.hasOwnProperty('type') && - fillColor.type === 'Pattern') { - ctx.save(); - ctx.fillStyle = fillColor.getPattern(ctx); - ctx.fill(); - ctx.restore(); - } else { - ctx.fill(); - } - - var strokeColor = this.current.strokeColor; - if (strokeColor && strokeColor.hasOwnProperty('type') && - strokeColor.type === 'Pattern') { - ctx.save(); - ctx.strokeStyle = strokeColor.getPattern(ctx); - ctx.stroke(); - ctx.restore(); - } else { - ctx.stroke(); - } + this.fill(false); + this.stroke(false); this.consumePath(); }, diff --git a/src/evaluator.js b/src/evaluator.js index 5007394b4..ea152717a 100644 --- a/src/evaluator.js +++ b/src/evaluator.js @@ -405,6 +405,8 @@ var PartialEvaluator = (function partialEvaluator() { case 'D': case 'RI': case 'FL': + case 'CA': + case 'ca': gsStateObj.push([key, value]); break; case 'Font': @@ -428,8 +430,6 @@ var PartialEvaluator = (function partialEvaluator() { case 'SA': case 'BM': case 'SMask': - case 'CA': - case 'ca': case 'AIS': case 'TK': TODO('graphic state operator ' + key); diff --git a/test/pdfs/alphatrans.pdf b/test/pdfs/alphatrans.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6274ce3ac67ad08df9f2097455db2679230086f9 GIT binary patch literal 16910 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 bkWh2)z;Z?;Q)eBfB(DNv6&2ODG+_Nd7c+O^ literal 0 HcmV?d00001