From 5f82fc46bf77fdebf5c3c8ff5cd6ac79298487dd Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Wed, 22 Jun 2011 11:25:00 +0200 Subject: [PATCH] Fill more gaps for Format 6 dense array --- fonts.js | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/fonts.js b/fonts.js index ded1b70c2..a008dfce0 100644 --- a/fonts.js +++ b/fonts.js @@ -427,39 +427,37 @@ 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 = []; + var min = 0xffff, max = 0; for (var j = 0; j < entryCount; j++) { var charcode = FontsUtils.bytesToInteger(font.getBytes(2)); - var index = gaps.indexOf(charcode); - if (index != -1) - gaps.splice(index, 1); + glyphs.push(charcode); - glyphs.push({unicode: charcode + firstCode}); + if (charcode < min) + min = charcode; + if (charcode > max) + max = charcode; } - while (gaps.length) - glyphs.push({unicode: gaps.pop() + firstCode }); + // Since Format 6 is a dense array, check for gaps + for (var j = min; j < max; j++) { + if (glyphs.indexOf(j) == -1) + glyphs.push(j); + } - var ranges = getRanges(glyphs); + for (var j = 0; j < glyphs.length; j++) + glyphs[j] = { unicode: glyphs[j] + firstCode }; - 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++; - } - } + var ranges= getRanges(glyphs); + assert(ranges.length == 1, "Got " + ranges.length + " ranges in a dense array"); + + var encoding = properties.encoding; + var denseRange = ranges[0]; + var start = denseRange[0]; + var end = denseRange[1]; + var index = firstCode; + for (var j = start; j <= end; j++) + encoding[index++] = glyphs[j - firstCode - 1].unicode; cmap.data = createCMapTable(glyphs); } }