Filled notdef in the cmap table
This commit is contained in:
parent
a56e5ade22
commit
bfe0356533
49
fonts.js
49
fonts.js
@ -182,11 +182,7 @@ var Font = (function () {
|
|||||||
return array;
|
return array;
|
||||||
};
|
};
|
||||||
|
|
||||||
function string16(value, signed) {
|
function string16(value) {
|
||||||
if (signed) {
|
|
||||||
value ^= 0xffff;
|
|
||||||
value += 1;
|
|
||||||
}
|
|
||||||
return String.fromCharCode((value >> 8) & 0xff) +
|
return String.fromCharCode((value >> 8) & 0xff) +
|
||||||
String.fromCharCode(value & 0xff);
|
String.fromCharCode(value & 0xff);
|
||||||
};
|
};
|
||||||
@ -275,6 +271,7 @@ var Font = (function () {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function createCMapTable(glyphs) {
|
function createCMapTable(glyphs) {
|
||||||
|
glyphs.push({unicode: 0x000});
|
||||||
var ranges = getRanges(glyphs);
|
var ranges = getRanges(glyphs);
|
||||||
|
|
||||||
var headerSize = (12 * 2 + (ranges.length * 4 * 2));
|
var headerSize = (12 * 2 + (ranges.length * 4 * 2));
|
||||||
@ -308,7 +305,7 @@ var Font = (function () {
|
|||||||
var range = ranges[i];
|
var range = ranges[i];
|
||||||
var start = range[0];
|
var start = range[0];
|
||||||
var end = range[1];
|
var end = range[1];
|
||||||
var delta = (((start - 1) - bias) ^ 0xffff) + 1;
|
var delta = (((start - 1) - bias) ^ 0xffff);
|
||||||
bias += (end - start + 1);
|
bias += (end - start + 1);
|
||||||
|
|
||||||
startCount += string16(start);
|
startCount += string16(start);
|
||||||
@ -734,21 +731,18 @@ var Font = (function () {
|
|||||||
* while Windows use this data. So be careful if you hack on Linux and
|
* while Windows use this data. So be careful if you hack on Linux and
|
||||||
* have to touch the 'hmtx' table
|
* have to touch the 'hmtx' table
|
||||||
*/
|
*/
|
||||||
hmtx = "\x01\xF4\x00\x00"; // Fake .notdef
|
hmtx = "\x00\x00\x00\x00"; // Fake .notdef
|
||||||
var width = 0, lsb = 0;
|
var width = 0, lsb = 0;
|
||||||
for (var i = 0; i < charstrings.length; i++) {
|
for (var i = 0; i < charstrings.length; i++) {
|
||||||
var charstring = charstrings[i];
|
var charstring = charstrings[i];
|
||||||
if (fontCount == 9) {
|
hmtx += string16(charstring.width) + string16(0);
|
||||||
log(charstring.glyph + "::" + charstring.width + "::" + charstring.lsb);
|
|
||||||
}
|
|
||||||
hmtx += string16(charstring.width) + string16(charstring.lsb, true);
|
|
||||||
}
|
}
|
||||||
hmtx = stringToArray(hmtx);
|
hmtx = stringToArray(hmtx);
|
||||||
createTableEntry(otf, offsets, "hmtx", hmtx);
|
createTableEntry(otf, offsets, "hmtx", hmtx);
|
||||||
|
|
||||||
/** MAXP */
|
/** MAXP */
|
||||||
maxp = "\x00\x00\x50\x00" + // Version number
|
maxp = "\x00\x00\x50\x00" + // Version number
|
||||||
string16(charstrings.length + 1); // Num of glyphs (+1 to pass the sanitizer...)
|
string16(charstrings.length + 1); // Num of glyphs
|
||||||
maxp = stringToArray(maxp);
|
maxp = stringToArray(maxp);
|
||||||
createTableEntry(otf, offsets, "maxp", maxp);
|
createTableEntry(otf, offsets, "maxp", maxp);
|
||||||
|
|
||||||
@ -1050,35 +1044,14 @@ var Type1Parser = function() {
|
|||||||
|
|
||||||
command = charStringDictionary["12"][escape];
|
command = charStringDictionary["12"][escape];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// TODO Clean this code
|
// TODO Clean this code
|
||||||
Gindex = Gindex || 1;
|
|
||||||
if (value == 13) {
|
if (value == 13) {
|
||||||
width = charstring[1];
|
width = charstring[1];
|
||||||
lsb = charstring[0];
|
lsb = charstring[0];
|
||||||
//charstring.push(lsb, "hmoveto");
|
charstring.push(lsb, "hmoveto");
|
||||||
charstring.splice(0, 1);
|
charstring.splice(0, 1);
|
||||||
used = true;
|
|
||||||
continue;
|
continue;
|
||||||
} else if (!used && lsb && value == 1) { // hstem
|
|
||||||
charstring[Gindex] += lsb;
|
|
||||||
used = true;
|
|
||||||
} else if (!used && lsb && value == 22) { // hmoveto
|
|
||||||
error("hmoveto: " + charstring[Gindex]);
|
|
||||||
charstring[Gindex] += lsb;
|
|
||||||
used = true;
|
|
||||||
} else if (!used && lsb && value == 14) { // enchar
|
|
||||||
log(glyph);
|
|
||||||
var p = charstring[Gindex];
|
|
||||||
if (IsNum(p)) {
|
|
||||||
charstring[Gindex] += lsb;
|
|
||||||
} else {
|
|
||||||
charstring.splice(Gindex + 1, 0, lsb);
|
|
||||||
}
|
}
|
||||||
used = true;
|
|
||||||
}
|
|
||||||
var Gindex = charstring.length;
|
|
||||||
|
|
||||||
command = charStringDictionary[value];
|
command = charStringDictionary[value];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1107,9 +1080,6 @@ var Type1Parser = function() {
|
|||||||
charstring.push(value);
|
charstring.push(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!used && lsb)
|
|
||||||
error("lsb has not been reported in " + fontName + " for charstring: " + charstring);
|
|
||||||
|
|
||||||
return { charstring: charstring, width: width, lsb: lsb };
|
return { charstring: charstring, width: width, lsb: lsb };
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1366,6 +1336,9 @@ CFF.prototype = {
|
|||||||
var i = 0;
|
var i = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
var obj = charstring[i];
|
var obj = charstring[i];
|
||||||
|
if (obj == undefined) {
|
||||||
|
error("unknow charstring command for " + i + " in " + charstring);
|
||||||
|
}
|
||||||
if (obj.charAt) {
|
if (obj.charAt) {
|
||||||
switch (obj) {
|
switch (obj) {
|
||||||
case "endchar":
|
case "endchar":
|
||||||
@ -1379,7 +1352,7 @@ CFF.prototype = {
|
|||||||
} else if (command.charAt) {
|
} else if (command.charAt) {
|
||||||
var cmd = this.commandsMap[command];
|
var cmd = this.commandsMap[command];
|
||||||
if (!cmd)
|
if (!cmd)
|
||||||
error(command);
|
error("Unknow command: " + command);
|
||||||
|
|
||||||
if (IsArray(cmd)) {
|
if (IsArray(cmd)) {
|
||||||
charstring.splice(j, 1, cmd[0], cmd[1]);
|
charstring.splice(j, 1, cmd[0], cmd[1]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user