From 645c9acb62313cab8e45ccdf4dc68b035ffffdd8 Mon Sep 17 00:00:00 2001 From: sbarman Date: Thu, 21 Jul 2011 09:20:19 -0700 Subject: [PATCH 1/4] fix small fonts --- pdf.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pdf.js b/pdf.js index 1f02d7d6d..5c29edd0c 100644 --- a/pdf.js +++ b/pdf.js @@ -3879,6 +3879,9 @@ function ScratchCanvas(width, height) { } var CanvasGraphics = (function() { + var kScalePrecision = 50; + var kRasterizerMin = 14; + function constructor(canvasCtx, imageCanvas) { this.ctx = canvasCtx; this.current = new CanvasExtraState(); @@ -4094,8 +4097,10 @@ var CanvasGraphics = (function() { if (this.ctx.$setFont) { this.ctx.$setFont(fontName, size); } else { - this.ctx.font = size + 'px "' + fontName + '"'; FontMeasure.setActive(fontObj, size); + + size = (size <= kRasterizerMin) ? size * kScalePrecision : size; + this.ctx.font = size + 'px"' + fontName + '"'; } }, setTextRenderingMode: function(mode) { @@ -4143,6 +4148,8 @@ var CanvasGraphics = (function() { ctx.translate(current.x, -1 * current.y); var font = this.current.font; if (font) { + if (this.current.fontSize < kRasterizerMin) + ctx.transform(1 / kScalePrecision, 0, 0, 1 / kScalePrecision, 0, 0); ctx.transform.apply(ctx, font.textMatrix); text = font.charsToUnicode(text); } From c58aa5f2329b50b77b3616621a51492b5286ab71 Mon Sep 17 00:00:00 2001 From: sbarman Date: Fri, 22 Jul 2011 16:15:04 -0700 Subject: [PATCH 2/4] initial impl of char spacing and word spacing --- pdf.js | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/pdf.js b/pdf.js index 0af728baf..58bed05ca 100644 --- a/pdf.js +++ b/pdf.js @@ -4114,13 +4114,13 @@ var CanvasGraphics = (function() { endText: function() { }, setCharSpacing: function(spacing) { - this.ctx.charSpacing = spacing; + this.current.charSpacing = spacing; }, setWordSpacing: function(spacing) { - this.ctx.wordSpacing = spacing; + this.current.wordSpacing = spacing; }, setHScale: function(scale) { - this.ctx.textHScale = (scale % 100) * 0.01; + this.current.textHScale = (scale % 100) * 0.01; }, setLeading: function(leading) { this.current.leading = leading; @@ -4195,18 +4195,41 @@ var CanvasGraphics = (function() { ctx.save(); ctx.transform.apply(ctx, current.textMatrix); ctx.scale(1, -1); + + ctx.translate(current.x, -1 * current.y); - if (this.ctx.$showText) { - ctx.$showText(current.y, text); - } else { - ctx.translate(current.x, -1 * current.y); - var font = this.current.font; - if (font) { - if (this.current.fontSize < kRasterizerMin) - ctx.transform(1 / kScalePrecision, 0, 0, 1 / kScalePrecision, 0, 0); - ctx.transform.apply(ctx, font.textMatrix); - text = font.charsToUnicode(text); + var scaleFactor = 1; + var font = this.current.font; + if (font) { + if (this.current.fontSize < kRasterizerMin) { + scaleFactor = 1 / kScalePrecision; + ctx.scale(scaleFactor, scaleFactor); } + ctx.transform.apply(ctx, font.textMatrix); + text = font.charsToUnicode(text); + } + + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var textHScale = current.textHScale; + + if (charSpacing || wordSpacing || textHScale) { + charSpacing = charSpacing || 0; + wordSpacing = wordSpacing || 0; + var width = 0; + + for (var i = 0, ii = text.length; i < ii; ++i) { + var c = text.charAt(i); + ctx.fillText(c, 0, 0); + var charWidth = FontMeasure.measureText(c) + charSpacing; + if (c.charCodeAt(0) == 32) + charWidth += wordSpacing; + + ctx.translate(charWidth / scaleFactor, 0); + width += charWidth; + } + current.x += width; + } else { ctx.fillText(text, 0, 0); current.x += FontMeasure.measureText(text); } From 47dcd1f94bfe03566d15b8a45a111c8109bb7dcb Mon Sep 17 00:00:00 2001 From: sbarman Date: Fri, 22 Jul 2011 17:05:04 -0700 Subject: [PATCH 3/4] added texthscale support --- pdf.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pdf.js b/pdf.js index 58bed05ca..f13afe2e0 100644 --- a/pdf.js +++ b/pdf.js @@ -3448,7 +3448,7 @@ var EvalState = (function() { // Character and word spacing this.charSpace = 0; this.wordSpace = 0; - this.textHScale = 100; + this.textHScale = 1; // Color spaces this.fillColorSpace = null; this.strokeColorSpace = null; @@ -3866,7 +3866,7 @@ var CanvasExtraState = (function() { // Character and word spacing this.charSpace = 0; this.wordSpace = 0; - this.textHScale = 100; + this.textHScale = 1; // Color spaces this.fillColorSpaceObj = null; this.strokeColorSpaceObj = null; @@ -4120,7 +4120,7 @@ var CanvasGraphics = (function() { this.current.wordSpacing = spacing; }, setHScale: function(scale) { - this.current.textHScale = (scale % 100) * 0.01; + this.current.textHScale = scale / 100; }, setLeading: function(leading) { this.current.leading = leading; @@ -4198,12 +4198,12 @@ var CanvasGraphics = (function() { ctx.translate(current.x, -1 * current.y); - var scaleFactor = 1; + var scaleFactorX = 1, scaleFactorY = 1; var font = this.current.font; if (font) { if (this.current.fontSize < kRasterizerMin) { - scaleFactor = 1 / kScalePrecision; - ctx.scale(scaleFactor, scaleFactor); + scaleFactorX = scaleFactorY = kScalePrecision; + ctx.scale(1 / scaleFactorX, 1 / scaleFactorY); } ctx.transform.apply(ctx, font.textMatrix); text = font.charsToUnicode(text); @@ -4213,9 +4213,9 @@ var CanvasGraphics = (function() { var wordSpacing = current.wordSpacing; var textHScale = current.textHScale; - if (charSpacing || wordSpacing || textHScale) { - charSpacing = charSpacing || 0; - wordSpacing = wordSpacing || 0; + if (charSpacing != 0 || wordSpacing != 0 || textHScale != 1) { + scaleFactorX *= textHScale; + ctx.scale(1 / textHScale, 1); var width = 0; for (var i = 0, ii = text.length; i < ii; ++i) { @@ -4225,7 +4225,7 @@ var CanvasGraphics = (function() { if (c.charCodeAt(0) == 32) charWidth += wordSpacing; - ctx.translate(charWidth / scaleFactor, 0); + ctx.translate(charWidth * scaleFactorX, 0); width += charWidth; } current.x += width; @@ -4243,7 +4243,7 @@ var CanvasGraphics = (function() { if (this.ctx.$addCurrentX) { this.ctx.$addCurrentX(-e * 0.001 * this.current.fontSize); } else { - this.current.x -= e * 0.001 * this.current.fontSize; + this.current.x -= e * 0.001 * this.current.fontSize * this.current.textHScale; } } else if (IsString(e)) { this.showText(e); From 1e59dd625a7f040c7208b053de1269179f455e5b Mon Sep 17 00:00:00 2001 From: sbarman Date: Fri, 22 Jul 2011 18:03:14 -0700 Subject: [PATCH 4/4] cleanup --- pdf.js | 1 - 1 file changed, 1 deletion(-) diff --git a/pdf.js b/pdf.js index f13afe2e0..ba4ef61c1 100644 --- a/pdf.js +++ b/pdf.js @@ -4224,7 +4224,6 @@ var CanvasGraphics = (function() { var charWidth = FontMeasure.measureText(c) + charSpacing; if (c.charCodeAt(0) == 32) charWidth += wordSpacing; - ctx.translate(charWidth * scaleFactorX, 0); width += charWidth; }