store ranges as [start, end], instead of storing all codes

This commit is contained in:
Andreas Gal 2011-06-20 03:49:40 -04:00
parent 52e1631030
commit 5f75130fbf

View File

@ -315,14 +315,16 @@ var Font = (function () {
codes.push(String.fromCharCode(glyphs[n].unicode)) codes.push(String.fromCharCode(glyphs[n].unicode))
codes.sort(); codes.sort();
// Split the sorted codes into ranges.
var ranges = []; var ranges = [];
for (var n = 0; n < length; ) { for (var n = 0; n < length; ) {
var range = []; var start = codes[n++].charCodeAt(0);
do { var end = start;
var current = codes[n++].charCodeAt(0); while (n < length && end + 1 == codes[n].charCodeAt(0)) {
range.push(current); ++end;
} while (n < length && current + 1 == codes[n].charCodeAt(0)); ++n;
ranges.push(range); }
ranges.push([start, end]);
} }
return ranges; return ranges;
} }
@ -367,10 +369,10 @@ var Font = (function () {
for (var i = 0; i < segCount - 1; i++) { for (var i = 0; i < segCount - 1; i++) {
var range = ranges[i]; var range = ranges[i];
var start = FontsUtils.integerToBytes(range[0], 2); var start = FontsUtils.integerToBytes(range[0], 2);
var end = FontsUtils.integerToBytes(range[range.length - 1], 2); var end = FontsUtils.integerToBytes(range[1], 2);
var delta = FontsUtils.integerToBytes(((range[0] - 1) - bias) % 65536, 2); var delta = FontsUtils.integerToBytes(((range[0] - 1) - bias) % 65536, 2);
bias += range.length; bias += (range[1] - range[0] + 1);
// deltas are signed shorts // deltas are signed shorts
delta[0] ^= 0xFF; delta[0] ^= 0xFF;
@ -382,8 +384,8 @@ var Font = (function () {
idDeltas.push(delta[0], delta[1]); idDeltas.push(delta[0], delta[1]);
idRangeOffsets.push(0x00, 0x00); idRangeOffsets.push(0x00, 0x00);
for (var j = 0; j < range.length; j++) for (var j = range[0]; j <= range[1]; j++)
glyphsIdsArray.push(range[j]); glyphsIdsArray.push(j);
} }
startCount.push(0xFF, 0xFF); startCount.push(0xFF, 0xFF);
endCount.push(0xFF, 0xFF); endCount.push(0xFF, 0xFF);