diff --git a/src/canvas.js b/src/canvas.js index 29f80feea..6007d0031 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -6,6 +6,17 @@ // contexts store most of the state we need natively. // However, PDF needs a bit more state, which we store here. +var TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7 +}; + var CanvasExtraState = (function canvasExtraState() { function constructor(old) { // Are soft masks and alpha values shapes or opacities? @@ -23,6 +34,7 @@ var CanvasExtraState = (function canvasExtraState() { this.charSpacing = 0; this.wordSpacing = 0; this.textHScale = 1; + this.textRenderingMode = TextRenderingMode.FILL; // Color spaces this.fillColorSpace = new DeviceGrayCS(); this.fillColorSpaceObj = null; @@ -577,7 +589,9 @@ var CanvasGraphics = (function canvasGraphics() { this.ctx.font = rule; }, setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) { - TODO('text rendering mode: ' + mode); + if (mode >= TextRenderingMode.FILL_ADD_TO_PATH) + TODO('unsupported text rendering mode: ' + mode); + this.current.textRenderingMode = mode; }, setTextRise: function canvasGraphicsSetTextRise(rise) { TODO('text rise: ' + rise); @@ -671,6 +685,7 @@ var CanvasGraphics = (function canvasGraphics() { var textLayer = this.textLayer; var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; var textSelection = textLayer && !skipTextSelection ? true : false; + var textRenderingMode = current.textRenderingMode; if (textSelection) { ctx.save(); @@ -727,7 +742,26 @@ var CanvasGraphics = (function canvasGraphics() { var char = glyph.fontChar; var charWidth = glyph.width * fontSize * 0.001 + charSpacing; - ctx.fillText(char, width, 0); + + switch (textRenderingMode) { + default: // other unsupported rendering modes + case TextRenderingMode.FILL: + case TextRenderingMode.FILL_ADD_TO_PATH: + ctx.fillText(char, width, 0); + break; + case TextRenderingMode.STROKE: + case TextRenderingMode.STROKE_ADD_TO_PATH: + ctx.strokeText(char, width, 0); + break; + case TextRenderingMode.FILL_STROKE: + case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: + ctx.fillText(char, width, 0); + ctx.strokeText(char, width, 0); + break; + case TextRenderingMode.INVISIBLE: + break; + } + width += charWidth; text.str += glyph.unicode === ' ' ? ' ' : glyph.unicode;