From 4f7fb7539bf91518d5854d723ea7839a8d2a3b9d Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Wed, 22 Jun 2011 10:56:31 +0200 Subject: [PATCH] Enhance the converter code by filling Format 6 dense array gaps --- fonts.js | 31 ++++++++++++++++++++++++++----- pdf.js | 2 +- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/fonts.js b/fonts.js index c7230a55a..ded1b70c2 100644 --- a/fonts.js +++ b/fonts.js @@ -427,18 +427,39 @@ var Font = (function () { var firstCode = FontsUtils.bytesToInteger(font.getBytes(2)); var entryCount = FontsUtils.bytesToInteger(font.getBytes(2)); + // Since Format 6 is a dense array, check for gaps in the indexes + // to fill them later if needed + var gaps = []; + for (var j = 1; j <= entryCount; j++) + gaps.push(j); + var encoding = properties.encoding; var glyphs = []; for (var j = 0; j < entryCount; j++) { var charcode = FontsUtils.bytesToInteger(font.getBytes(2)); - glyphs.push({unicode: charcode + firstCode }); + var index = gaps.indexOf(charcode); + if (index != -1) + gaps.splice(index, 1); + + glyphs.push({unicode: charcode + firstCode}); } + while (gaps.length) + glyphs.push({unicode: gaps.pop() + firstCode }); + var ranges = getRanges(glyphs); - var denseRange = ranges[0]; - var pos = 0; - for (var j = denseRange[0]; j <= denseRange[1]; j++) - encoding[j - 1] = glyphs[pos++].unicode; + + var pos = firstCode; + var bias = 1; + for (var j = 0; j < ranges.length; j++) { + var range = ranges[j]; + var start = range[0]; + var end = range[1]; + for (var k = start; k < end; k++) { + encoding[pos] = glyphs[pos - firstCode].unicode; + pos++; + } + } cmap.data = createCMapTable(glyphs); } } diff --git a/pdf.js b/pdf.js index 9d06241f7..23dd5bee9 100644 --- a/pdf.js +++ b/pdf.js @@ -2234,7 +2234,7 @@ var CanvasGraphics = (function() { // The encoding mapping table will be filled // later during the building phase //encodingMap[k] = GlyphsUnicode[encoding[code]]; - charset.push(encoding[code++]); + charset.push(encoding[code++] || ".notdef"); } } break;