Browse Source

Fill more gaps for Format 6 dense array

Vivien Nicolas 14 years ago
parent
commit
5f82fc46bf
  1. 46
      fonts.js

46
fonts.js

@ -427,39 +427,37 @@ var Font = (function () {
var firstCode = FontsUtils.bytesToInteger(font.getBytes(2)); var firstCode = FontsUtils.bytesToInteger(font.getBytes(2));
var entryCount = 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 glyphs = [];
var min = 0xffff, max = 0;
for (var j = 0; j < entryCount; j++) { for (var j = 0; j < entryCount; j++) {
var charcode = FontsUtils.bytesToInteger(font.getBytes(2)); var charcode = FontsUtils.bytesToInteger(font.getBytes(2));
var index = gaps.indexOf(charcode); glyphs.push(charcode);
if (index != -1)
gaps.splice(index, 1);
glyphs.push({unicode: charcode + firstCode}); if (charcode < min)
min = charcode;
if (charcode > max)
max = charcode;
} }
while (gaps.length) // Since Format 6 is a dense array, check for gaps
glyphs.push({unicode: gaps.pop() + firstCode }); for (var j = min; j < max; j++) {
if (glyphs.indexOf(j) == -1)
glyphs.push(j);
}
for (var j = 0; j < glyphs.length; j++)
glyphs[j] = { unicode: glyphs[j] + firstCode };
var ranges= getRanges(glyphs); var ranges= getRanges(glyphs);
assert(ranges.length == 1, "Got " + ranges.length + " ranges in a dense array");
var pos = firstCode; var encoding = properties.encoding;
var bias = 1; var denseRange = ranges[0];
for (var j = 0; j < ranges.length; j++) { var start = denseRange[0];
var range = ranges[j]; var end = denseRange[1];
var start = range[0]; var index = firstCode;
var end = range[1]; for (var j = start; j <= end; j++)
for (var k = start; k < end; k++) { encoding[index++] = glyphs[j - firstCode - 1].unicode;
encoding[pos] = glyphs[pos - firstCode].unicode;
pos++;
}
}
cmap.data = createCMapTable(glyphs); cmap.data = createCMapTable(glyphs);
} }
} }

Loading…
Cancel
Save