From 671dd3b0e8e57ec1ac57454197c19b25e73d0832 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Sat, 9 Jul 2011 21:43:28 -0700 Subject: [PATCH] back out bad font measurement changes --- fonts.js | 32 +++++++++++++++++++++++++++++++- pdf.js | 26 +++++++++++++------------- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/fonts.js b/fonts.js index d2e7a3fa5..5b020e899 100755 --- a/fonts.js +++ b/fonts.js @@ -22,7 +22,14 @@ var kMaxWaitForFontFace = 1000; */ var Fonts = (function Fonts() { + var kScalePrecision = 40; var fonts = []; + + if (!isWorker) { + var ctx = document.createElement('canvas').getContext('2d'); + ctx.scale(1 / kScalePrecision, 1); + } + var fontCount = 0; function FontInfo(name, data, properties) { @@ -35,6 +42,7 @@ var Fonts = (function Fonts() { } var current; + var measureCache; return { registerFont: function fonts_registerFont(fontName, data, properties) { @@ -49,6 +57,28 @@ var Fonts = (function Fonts() { }, lookupById: function fonts_lookupById(id) { return fonts[id]; + }, + setActive: function fonts_setActive(fontName, fontObj, size) { + // |current| can be null is fontName is a built-in font + // (e.g. "sans-serif") + if (fontObj && (current = fonts[fontObj.id])) { + var sizes = current.sizes; + if (!(measureCache = sizes[size])) + measureCache = sizes[size] = Object.create(null); + } else { + measureCache = null + } + + ctx.font = (size * kScalePrecision) + 'px "' + fontName + '"'; + }, + measureText: function fonts_measureText(text) { + var width; + if (measureCache && (width = measureCache[text])) + return width; + width = ctx.measureText(text).width / kScalePrecision; + if (measureCache) + measureCache[text] = width; + return width; } }; })(); @@ -1080,7 +1110,7 @@ var Font = (function() { return rule; }, - charsToUnicode: function fonts_charsToUnicode(chars) { + charsToUnicode: function fonts_chars2Unicode(chars) { var charsCache = this.charsCache; // if we translated this string before, just grab it from the cache diff --git a/pdf.js b/pdf.js index 4110015fb..a40adbec7 100644 --- a/pdf.js +++ b/pdf.js @@ -3972,6 +3972,7 @@ var CanvasGraphics = (function() { this.ctx.$setFont(fontName, size); } else { this.ctx.font = size + 'px "' + fontName + '"'; + Fonts.setActive(fontName, fontObj, size); } }, setTextRenderingMode: function(mode) { @@ -4009,25 +4010,24 @@ var CanvasGraphics = (function() { var ctx = this.ctx; var current = this.current; + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.scale(1, -1); + if (this.ctx.$showText) { ctx.$showText(current.y, text); } else { - ctx.save(); - - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); ctx.translate(current.x, -1 * current.y); - - var font = current.font; - ctx.transform.apply(ctx, font.textMatrix); - - text = font.charsToUnicode(text); - + var font = this.current.font; + if (font) { + ctx.transform.apply(ctx, font.textMatrix); + text = font.charsToUnicode(text); + } ctx.fillText(text, 0, 0); - current.x += ctx.measureText(text).width; - - ctx.restore(); + current.x += Fonts.measureText(text); } + + this.ctx.restore(); }, showSpacedText: function(arr) { for (var i = 0; i < arr.length; ++i) {