From 34e2aa5d21f3186ed8cb739d6c07da9e72d3e746 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Sat, 4 Feb 2012 12:45:18 -0600 Subject: [PATCH 1/6] Browser minimal font adjustment --- src/canvas.js | 25 ++++++++++++++++++++----- test/pdfs/issue1169.pdf.link | 1 + test/test_manifest.json | 7 +++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 test/pdfs/issue1169.pdf.link diff --git a/src/canvas.js b/src/canvas.js index f4815a655..131db979d 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -17,11 +17,14 @@ var TextRenderingMode = { ADD_TO_PATH: 7 }; +var MIN_FONT_SIZE = 8; + var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { // Are soft masks and alpha values shapes or opacities? this.alphaIsShape = false; this.fontSize = 0; + this.fontSizeScale = 1; this.textMatrix = IDENTITY_MATRIX; this.fontMatrix = IDENTITY_MATRIX; this.leading = 0; @@ -577,6 +580,9 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { this.current.font = fontObj; this.current.fontSize = size; + if (fontObj.coded) + return; // we don't need ctx.font for Type3 fonts + var name = fontObj.loadedName || 'sans-serif'; var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : (fontObj.bold ? 'bold' : 'normal'); @@ -584,7 +590,12 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var italic = fontObj.italic ? 'italic' : 'normal'; var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif'; var typeface = '"' + name + '", ' + serif; - var rule = italic + ' ' + bold + ' ' + size + 'px ' + typeface; + + var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE; + this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 : + size / MIN_FONT_SIZE; + + var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; this.ctx.font = rule; }, setTextRenderingMode: function canvasGraphicsSetTextRenderingMode(mode) { @@ -647,6 +658,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var font = current.font; var glyphs = font.charsToGlyphs(str); var fontSize = current.fontSize; + var fontSizeScale = current.fontSizeScale; var charSpacing = current.charSpacing; var wordSpacing = current.wordSpacing; var textHScale = current.textHScale; @@ -715,6 +727,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (textSelection) text.geom = this.getTextGeometry(); + ctx.scale(fontSizeScale, fontSizeScale); + var x = 0; for (var i = 0; i < glyphsLength; ++i) { var glyph = glyphs[i]; @@ -728,20 +742,21 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var charWidth = glyph.width * fontSize * 0.001 + Util.sign(current.fontMatrix[0]) * charSpacing; + var scaledX = x / fontSizeScale; switch (textRenderingMode) { default: // other unsupported rendering modes case TextRenderingMode.FILL: case TextRenderingMode.FILL_ADD_TO_PATH: - ctx.fillText(char, x, 0); + ctx.fillText(char, scaledX, 0); break; case TextRenderingMode.STROKE: case TextRenderingMode.STROKE_ADD_TO_PATH: - ctx.strokeText(char, x, 0); + ctx.strokeText(char, scaledX, 0); break; case TextRenderingMode.FILL_STROKE: case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: - ctx.fillText(char, x, 0); - ctx.strokeText(char, x, 0); + ctx.fillText(char, scaledX, 0); + ctx.strokeText(char, scaledX, 0); break; case TextRenderingMode.INVISIBLE: break; diff --git a/test/pdfs/issue1169.pdf.link b/test/pdfs/issue1169.pdf.link new file mode 100644 index 000000000..46559a078 --- /dev/null +++ b/test/pdfs/issue1169.pdf.link @@ -0,0 +1 @@ +http://www.cs.txstate.edu/~mb92/papers/gpgpu11.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index 2b0541edb..f4d671a04 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -438,6 +438,13 @@ "link": true, "type": "eq" }, + { "id": "issue1169", + "file": "pdfs/issue1169.pdf", + "md5": "3df3ed21fd43ac7fdb21e2015c8a7809", + "rounds": 1, + "link": true, + "type": "eq" + }, { "id": "zerowidthline", "file": "pdfs/zerowidthline.pdf", "md5": "295d26e61a85635433f8e4b768953f60", From bd95a191b78149f92d63e979e5832bc7e1327227 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Sat, 4 Feb 2012 14:42:07 -0600 Subject: [PATCH 2/6] Reducing MIN_FONT_SIZE size to 5px --- src/canvas.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 131db979d..09300a672 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -17,7 +17,8 @@ var TextRenderingMode = { ADD_TO_PATH: 7 }; -var MIN_FONT_SIZE = 8; +// Minimal font size that would be used during canvas fillText operations. +var MIN_FONT_SIZE = 5; var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { From cc9035438a93e6674f0b7882e34dd58a4e867fb1 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Tue, 7 Feb 2012 17:14:58 -0800 Subject: [PATCH 3/6] Optimization: don't scale when parameter is 1.0 --- src/canvas.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 09300a672..0ec92d9cf 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -728,7 +728,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (textSelection) text.geom = this.getTextGeometry(); - ctx.scale(fontSizeScale, fontSizeScale); + if (fontSizeScale != 1.0) + ctx.scale(fontSizeScale, fontSizeScale); var x = 0; for (var i = 0; i < glyphsLength; ++i) { From 99d71cc713bdd56566ea8640cd2bcbc8ca7cde96 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 13 Feb 2012 20:45:51 -0600 Subject: [PATCH 4/6] scale line width; set min font size to 8 --- src/canvas.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 0ec92d9cf..1a2ff3951 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -18,7 +18,7 @@ var TextRenderingMode = { }; // Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 5; +var MIN_FONT_SIZE = 8; var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { @@ -721,7 +721,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (scale == 0 || lineWidth == 0) lineWidth = this.getSinglePixelWidth(); else - lineWidth /= scale; + lineWidth /= scale * fontSizeScale; ctx.lineWidth = lineWidth; From b32a7b1c8ba4fc9feeb60cbbe325a5f210d45b03 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 13 Feb 2012 21:12:55 -0600 Subject: [PATCH 5/6] Reducing min font size to 2; rearranging fontSizeScale logic --- src/canvas.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/canvas.js b/src/canvas.js index 1a2ff3951..9952d7b1f 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -18,7 +18,7 @@ var TextRenderingMode = { }; // Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 8; +var MIN_FONT_SIZE = 2; var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { @@ -721,15 +721,17 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { if (scale == 0 || lineWidth == 0) lineWidth = this.getSinglePixelWidth(); else - lineWidth /= scale * fontSizeScale; - - ctx.lineWidth = lineWidth; + lineWidth /= scale; if (textSelection) text.geom = this.getTextGeometry(); - if (fontSizeScale != 1.0) + if (fontSizeScale != 1.0) { ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + + ctx.lineWidth = lineWidth; var x = 0; for (var i = 0; i < glyphsLength; ++i) { From 1cfb099640b839aad2228bc74128a5c96c0b28d3 Mon Sep 17 00:00:00 2001 From: notmasteryet Date: Mon, 13 Feb 2012 22:35:42 -0600 Subject: [PATCH 6/6] Add bugzill reference, reducing to 1px size --- src/canvas.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/canvas.js b/src/canvas.js index 9952d7b1f..ec832d213 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -18,7 +18,7 @@ var TextRenderingMode = { }; // Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 2; +var MIN_FONT_SIZE = 1; var CanvasExtraState = (function CanvasExtraStateClosure() { function CanvasExtraState(old) { @@ -592,6 +592,10 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif'; var typeface = '"' + name + '", ' + serif; + // Some font backends cannot handle fonts below certain size. + // Keeping the font at minimal size and using the fontSizeScale to change + // the current transformation matrix before the fillText/strokeText. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227 var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE; this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 : size / MIN_FONT_SIZE;