assemble cmap table from strings instead of arrays

This commit is contained in:
Andreas Gal 2011-06-20 04:27:21 -04:00
parent f63af3e614
commit 70887f617f

View File

@ -332,11 +332,7 @@ var Font = (function () {
function createCMAPTable(aGlyphs) { function createCMAPTable(aGlyphs) {
var ranges = getRanges(aGlyphs); var ranges = getRanges(aGlyphs);
// The size in bytes of the header is equal to the size of the
// different fields * length of a short + (size of the 4 parallels arrays
// describing segments * length of a short).
var headerSize = (12 * 2 + (ranges.length * 4 * 2)); var headerSize = (12 * 2 + (ranges.length * 4 * 2));
var segCount = ranges.length + 1; var segCount = ranges.length + 1;
var segCount2 = segCount * 2; var segCount2 = segCount * 2;
var searchRange = FontsUtils.getMaxPower2(segCount) * 2; var searchRange = FontsUtils.getMaxPower2(segCount) * 2;
@ -355,14 +351,13 @@ var Font = (function () {
s16(searchRange) + s16(searchRange) +
s16(searchEntry) + s16(searchEntry) +
s16(rangeShift); s16(rangeShift);
cmap = s2a(cmap);
// Fill up the 4 parallel arrays describing the segments. // Fill up the 4 parallel arrays describing the segments.
var startCount = []; var startCount = "";
var endCount = []; var endCount = "";
var idDeltas = []; var idDeltas = "";
var idRangeOffsets = []; var idRangeOffsets = "";
var glyphsIdsArray = []; var glyphsIds = "";
var bias = 0; var bias = 0;
for (var i = 0; i < segCount - 1; i++) { for (var i = 0; i < segCount - 1; i++) {
var range = ranges[i]; var range = ranges[i];
@ -371,25 +366,22 @@ var Font = (function () {
var delta = (((start - 1) - bias) ^ 0xffff) + 1; var delta = (((start - 1) - bias) ^ 0xffff) + 1;
bias += (end - start + 1); bias += (end - start + 1);
var start = FontsUtils.integerToBytes(start, 2); startCount += s16(start);
var end = FontsUtils.integerToBytes(end, 2); endCount += s16(end);
var delta = FontsUtils.integerToBytes(delta, 2); idDeltas += s16(delta);
idRangeOffsets += s16(0);
startCount.push(start[0], start[1]);
endCount.push(end[0], end[1]);
idDeltas.push(delta[0], delta[1]);
idRangeOffsets.push(0x00, 0x00);
for (var j = start; j <= end; j++) for (var j = start; j <= end; j++)
glyphsIdsArray.push(j); glyphsIds += String.fromCharCode(j);
} }
startCount.push(0xFF, 0xFF);
endCount.push(0xFF, 0xFF);
idDeltas.push(0x00, 0x01);
idRangeOffsets.push(0x00, 0x00);
return cmap.concat(endCount, [0x00, 0x00], startCount, startCount += "\xFF\xFF";
idDeltas, idRangeOffsets, glyphsIdsArray); endCount += "\xFF\xFF";
idDeltas += "\x00\x01";
idRangeOffsets += "\x00\x00";
return s2a(cmap + endCount + "\x00\x00" + startCount +
idDeltas + idRangeOffsets + glyphsIds);
} }
// Required Tables // Required Tables