Initial alpha transparency support.

This commit is contained in:
Brendan Dahl 2011-10-28 14:10:10 -07:00
parent b8dd054c7d
commit 5cb64fbab7
3 changed files with 27 additions and 31 deletions

View File

@ -28,6 +28,9 @@ var CanvasExtraState = (function canvasExtraState() {
// Default fore and background colors // Default fore and background colors
this.fillColor = '#000000'; this.fillColor = '#000000';
this.strokeColor = '#000000'; this.strokeColor = '#000000';
// Note: fill alpha applies to all non-stroking operations
this.fillAlpha = 1;
this.strokeAlpha = 1;
this.old = old; this.old = old;
} }
@ -206,6 +209,13 @@ var CanvasGraphics = (function canvasGraphics() {
case 'Font': case 'Font':
this.setFont(state[1], state[2]); this.setFont(state[1], state[2]);
break; 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) { rectangle: function canvasGraphicsRectangle(x, y, width, height) {
this.ctx.rect(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 ctx = this.ctx;
var strokeColor = this.current.strokeColor; 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') && if (strokeColor && strokeColor.hasOwnProperty('type') &&
strokeColor.type === 'Pattern') { strokeColor.type === 'Pattern') {
// for patterns, we transform to pattern space, calculate // for patterns, we transform to pattern space, calculate
@ -268,14 +282,17 @@ var CanvasGraphics = (function canvasGraphics() {
} else { } else {
ctx.stroke(); ctx.stroke();
} }
if (consumePath)
this.consumePath(); this.consumePath();
// Restore the global alpha to the fill alpha
ctx.globalAlpha = this.current.fillAlpha;
}, },
closeStroke: function canvasGraphicsCloseStroke() { closeStroke: function canvasGraphicsCloseStroke() {
this.closePath(); this.closePath();
this.stroke(); this.stroke();
}, },
fill: function canvasGraphicsFill() { fill: function canvasGraphicsFill(consumePath) {
consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
var ctx = this.ctx; var ctx = this.ctx;
var fillColor = this.current.fillColor; var fillColor = this.current.fillColor;
@ -288,7 +305,7 @@ var CanvasGraphics = (function canvasGraphics() {
} else { } else {
ctx.fill(); ctx.fill();
} }
if (consumePath)
this.consumePath(); this.consumePath();
}, },
eoFill: function canvasGraphicsEoFill() { eoFill: function canvasGraphicsEoFill() {
@ -297,29 +314,8 @@ var CanvasGraphics = (function canvasGraphics() {
this.restoreFillRule(savedFillRule); this.restoreFillRule(savedFillRule);
}, },
fillStroke: function canvasGraphicsFillStroke() { fillStroke: function canvasGraphicsFillStroke() {
var ctx = this.ctx; this.fill(false);
this.stroke(false);
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.consumePath(); this.consumePath();
}, },

View File

@ -405,6 +405,8 @@ var PartialEvaluator = (function partialEvaluator() {
case 'D': case 'D':
case 'RI': case 'RI':
case 'FL': case 'FL':
case 'CA':
case 'ca':
gsStateObj.push([key, value]); gsStateObj.push([key, value]);
break; break;
case 'Font': case 'Font':
@ -428,8 +430,6 @@ var PartialEvaluator = (function partialEvaluator() {
case 'SA': case 'SA':
case 'BM': case 'BM':
case 'SMask': case 'SMask':
case 'CA':
case 'ca':
case 'AIS': case 'AIS':
case 'TK': case 'TK':
TODO('graphic state operator ' + key); TODO('graphic state operator ' + key);

BIN
test/pdfs/alphatrans.pdf Normal file

Binary file not shown.