Refactor 'cmap' generation

This commit is contained in:
vyv03354 2013-03-19 21:37:31 +09:00
parent b898935eb0
commit e39c34584a
3 changed files with 62 additions and 69 deletions

View File

@ -2622,7 +2622,7 @@ var Font = (function FontClosure() {
file.virtualOffset += data.length; file.virtualOffset += data.length;
} }
function getRanges(glyphs) { function getRanges(glyphs, deltas) {
// Array.sort() sorts by characters, not numerically, so convert to an // Array.sort() sorts by characters, not numerically, so convert to an
// array of characters. // array of characters.
var codes = []; var codes = [];
@ -2637,14 +2637,14 @@ var Font = (function FontClosure() {
var ranges = []; var ranges = [];
for (var n = 0; n < length; ) { for (var n = 0; n < length; ) {
var start = codes[n].unicode; var start = codes[n].unicode;
var codeIndices = [codes[n].code]; var codeIndices = [deltas ? deltas[codes[n].code] : codes[n].code + 1];
++n; ++n;
var end = start; var end = start;
while (n < length && end + 1 == codes[n].unicode) { while (n < length && end + 1 == codes[n].unicode) {
codeIndices.push(codes[n].code); codeIndices.push(deltas ? deltas[codes[n].code] : codes[n].code + 1);
++end; ++end;
++n; ++n;
if (end === 0x10000) { break; } if (end === 0xFFFF) { break; }
} }
ranges.push([start, end, codeIndices]); ranges.push([start, end, codeIndices]);
} }
@ -2653,7 +2653,7 @@ var Font = (function FontClosure() {
} }
function createCmapTable(glyphs, deltas) { function createCmapTable(glyphs, deltas) {
var ranges = getRanges(glyphs); var ranges = getRanges(glyphs, deltas);
var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
var cmap = '\x00\x00' + // version var cmap = '\x00\x00' + // version
@ -2667,8 +2667,11 @@ var Font = (function FontClosure() {
} }
var bmpLength = i + 1; var bmpLength = i + 1;
if (ranges[i][1] === 0xFFFF) { ranges[i][1] = 0xFFFE; } if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
var segCount = bmpLength + 1; ranges[i][1] = 0xFFFE;
}
var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
var segCount = bmpLength + trailingRangesCount;
var segCount2 = segCount * 2; var segCount2 = segCount * 2;
var searchRange = getMaxPower2(segCount) * 2; var searchRange = getMaxPower2(segCount) * 2;
var searchEntry = Math.log(segCount) / Math.log(2); var searchEntry = Math.log(segCount) / Math.log(2);
@ -2682,41 +2685,44 @@ var Font = (function FontClosure() {
var glyphsIds = ''; var glyphsIds = '';
var bias = 0; var bias = 0;
if (deltas) { for (var i = 0, ii = bmpLength; i < ii; i++) {
for (var i = 0, ii = bmpLength; i < ii; i++) { var range = ranges[i];
var range = ranges[i]; var start = range[0];
var start = range[0]; var end = range[1];
var end = range[1]; startCount += string16(start);
endCount += string16(end);
var codes = range[2];
var contiguous = true;
for (var j = 1, jj = codes.length; j < jj; ++j) {
if (codes[j] !== codes[j - 1] + 1) {
contiguous = false;
break;
}
}
if (!contiguous) {
var offset = (segCount - i) * 2 + bias * 2; var offset = (segCount - i) * 2 + bias * 2;
bias += (end - start + 1); bias += (end - start + 1);
startCount += string16(start);
endCount += string16(end);
idDeltas += string16(0); idDeltas += string16(0);
idRangeOffsets += string16(offset); idRangeOffsets += string16(offset);
var codes = range[2]; for (var j = 0, jj = codes.length; j < jj; ++j) {
for (var j = 0, jj = codes.length; j < jj; ++j) glyphsIds += string16(codes[j]);
glyphsIds += string16(deltas[codes[j]]); }
} } else {
} else { var startCode = codes[0];
for (var i = 0, ii = bmpLength; i < ii; i++) {
var range = ranges[i];
var start = range[0];
var end = range[1];
var startCode = range[2][0];
startCount += string16(start); idDeltas += string16((startCode - start) & 0xFFFF);
endCount += string16(end);
idDeltas += string16((startCode - start + 1) & 0xFFFF);
idRangeOffsets += string16(0); idRangeOffsets += string16(0);
} }
} }
endCount += '\xFF\xFF'; if (trailingRangesCount > 0) {
startCount += '\xFF\xFF'; endCount += '\xFF\xFF';
idDeltas += '\x00\x01'; startCount += '\xFF\xFF';
idRangeOffsets += '\x00\x00'; idDeltas += '\x00\x01';
idRangeOffsets += '\x00\x00';
}
var format314 = '\x00\x00' + // language var format314 = '\x00\x00' + // language
string16(segCount2) + string16(segCount2) +
@ -2734,46 +2740,24 @@ var Font = (function FontClosure() {
string32(4 + numTables * 8 + string32(4 + numTables * 8 +
4 + format314.length); // start of the table record 4 + format314.length); // start of the table record
format31012 = ''; format31012 = '';
if (deltas) { for (var i = 0, ii = ranges.length; i < ii; i++) {
for (var i = 0, ii = ranges.length; i < ii; i++) { var range = ranges[i];
var range = ranges[i]; var start = range[0];
var start = range[0]; var codes = range[2];
var codes = range[2]; var code = codes[0];
var code = deltas[codes[0]]; for (var j = 1, jj = codes.length; j < jj; ++j) {
for (var j = 1, jj = codes.length; j < jj; ++j) { if (codes[j] !== codes[j - 1] + 1) {
if (deltas[codes[j]] !== deltas[codes[j - 1]] + 1) { var end = range[0] + j - 1;
var end = range[0] + j - 1; format31012 += string32(start) + // startCharCode
format31012 += string32(start) + // startCharCode string32(end) + // endCharCode
string32(end) + // endCharCode string32(code); // startGlyphID
string32(code); // startGlyphID start = end + 1;
start = end + 1; code = codes[j];
code = deltas[codes[j]];
}
} }
format31012 += string32(start) + // startCharCode
string32(range[1]) + // endCharCode
string32(code); // startGlyphID
}
} else {
for (var i = 0, ii = ranges.length; i < ii; i++) {
var range = ranges[i];
var start = range[0];
var codes = range[2];
var code = codes[0];
for (var j = 1, jj = codes.length; j < jj; ++j) {
if (codes[j] !== codes[j - 1] + 1) {
var end = range[0] + j - 1;
format31012 += string32(start) + // startCharCode
string32(end) + // endCharCode
string32(code); // startGlyphID
start = end + 1;
code = codes[j];
}
}
format31012 += string32(start) + // startCharCode
string32(range[1]) + // endCharCode
string32(code); // startGlyphID
} }
format31012 += string32(start) + // startCharCode
string32(range[1]) + // endCharCode
string32(code); // startGlyphID
} }
header31012 = '\x00\x0C' + // format header31012 = '\x00\x0C' + // format
'\x00\x00' + // reserved '\x00\x00' + // reserved

View File

@ -0,0 +1 @@
http://www.gesetze-im-internet.de/bundesrecht/bgb/gesamt.pdf

View File

@ -933,6 +933,14 @@
"link": true, "link": true,
"type": "eq" "type": "eq"
}, },
{ "id": "gesamt",
"file": "pdfs/gesamt.pdf",
"md5": "f9148b71aad9a7856f70f303d7e78703",
"rounds": 1,
"link": true,
"lastPage": 1,
"type": "eq"
},
{ "id": "javauninstall-7", { "id": "javauninstall-7",
"file": "pdfs/javauninstall-7.pdf", "file": "pdfs/javauninstall-7.pdf",
"md5": "c9eb59503923c9125b9660e348618675", "md5": "c9eb59503923c9125b9660e348618675",