Refactor 'cmap' generation
This commit is contained in:
parent
b898935eb0
commit
e39c34584a
122
src/fonts.js
122
src/fonts.js
@ -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
|
||||||
|
1
test/pdfs/gesamt.pdf.link
Normal file
1
test/pdfs/gesamt.pdf.link
Normal file
@ -0,0 +1 @@
|
|||||||
|
http://www.gesetze-im-internet.de/bundesrecht/bgb/gesamt.pdf
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user