From f2a4756c77147b04e83e048fb2be0892ab88c654 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Fri, 8 Jul 2011 18:51:20 -0700 Subject: [PATCH] backout font measurement change, it is breaking tests --- fonts.js | 68 ++++++++++++++++++++++++++------------------------------ pdf.js | 13 ++++++----- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/fonts.js b/fonts.js index ec89b3a58..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; } }; })(); @@ -334,14 +364,6 @@ function getUnicodeRangeFor(value) { return -1; } -var MeasureText = { - currentCache: null, - currentFont: null, - currentSize: 0, - ctx: null, - sizes: Object.create(null) -}; - /** * 'Font' is the class the outside world should use, it encapsulate all the font * decoding logics whatever type it is (assuming the font type is supported). @@ -351,8 +373,6 @@ var MeasureText = { * type1Font.bind(); */ var Font = (function() { - var kScalePrecision = 40; - var constructor = function font_constructor(name, file, properties) { this.name = name; this.textMatrix = properties.textMatrix || IDENTITY_MATRIX; @@ -1090,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 @@ -1128,32 +1148,6 @@ var Font = (function() { // Enter the translated string into the cache return charsCache[chars] = str; - }, - - measureText: function fonts_measureText(text, size) { - if (MeasureText.currentFont != this || - MeasureText.currentSize != size) { - var ctx = MeasureText.ctx; - if (!ctx) { - ctx = MeasureText.ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1 / kScalePrecision, 1); - } - ctx.font = (size * kScalePrecision) + 'px "' + this.loadedName + '"'; - MeasureText.currentFont = this; - MeasureText.currentSize = size; - var cache = MeasureText.sizes[size]; - if (!cache) - cache = MeasureText.sizes[size] = Object.create(null); - MeasureText.currentCache = cache; - } - - var key = size + "$" + text; - var width = MeasureText.currentCache[key]; - if (width) - return width; - var ctx = MeasureText.ctx; - width = ctx.measureText(text).width / kScalePrecision; - return MeasureText.currentCache[key] = width; } }; diff --git a/pdf.js b/pdf.js index b38bc4eec..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) { @@ -4017,14 +4018,16 @@ var CanvasGraphics = (function() { ctx.$showText(current.y, text); } else { 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 += font.measureText(text, current.fontSize); + current.x += Fonts.measureText(text); } - ctx.restore(); + this.ctx.restore(); }, showSpacedText: function(arr) { for (var i = 0; i < arr.length; ++i) {