Add the Type1 subrs into the CFF local subrs index

This commit is contained in:
Vivien Nicolas 2011-06-25 05:12:35 +02:00
parent 69c1a54971
commit 159c986e6e

View File

@ -1288,6 +1288,8 @@ CFF.prototype = {
"hlineto": 6, "hlineto": 6,
"vlineto": 7, "vlineto": 7,
"rrcurveto": 8, "rrcurveto": 8,
"callsubr": 10,
"return": 11,
"endchar": 14, "endchar": 14,
"rmoveto": 21, "rmoveto": 21,
"hmoveto": 22, "hmoveto": 22,
@ -1295,7 +1297,7 @@ CFF.prototype = {
"hvcurveto": 31, "hvcurveto": 31,
}, },
flattenCharstring: function flattenCharstring(charstring, subrs) { flattenCharstring: function flattenCharstring(charstring) {
var i = 0; var i = 0;
while (true) { while (true) {
var obj = charstring[i]; var obj = charstring[i];
@ -1304,35 +1306,30 @@ CFF.prototype = {
if (obj.charAt) { if (obj.charAt) {
switch (obj) { switch (obj) {
case "callsubr":
var subr = subrs[charstring[i - 1]];
if (subr.length > 1) {
subr = this.flattenCharstring(subr, subrs);
subr.pop();
charstring.splice(i - 1, 2, subr);
} else {
charstring.splice(i - 1, 2);
}
i -= 1;
break;
case "callothersubr": case "callothersubr":
var index = charstring[i - 1]; var index = charstring[i - 1];
var count = charstring[i - 2]; var count = charstring[i - 2];
var data = charstring[i - 3]; var data = charstring[i - 3];
// XXX The callothersubr needs to support at least the 3 defaults // If the flex mechanishm is not used in a font program, Adobe
// otherSubrs of the spec // state that that entries 0, 1 and 2 can simply be replace by
if (index != 3) // {}, which means that we can simply ignore them.
error("callothersubr for index: " + index + " (" + charstring + ")"); if (index < 3) {
i -= 3;
continue;
}
if (!data) { // This is the same things about hint replacment, if it is not used
charstring.splice(i - 2, 4, "pop", 3); // entry 3 can be replaced by {}
i -= 3; if (index == 3) {
} else { if (!data) {
// 5 to remove the arguments, the callothersubr call and the pop command charstring.splice(i - 2, 4, "pop", 3);
charstring.splice(i - 3, 5, 3); i -= 3;
i -= 3; } else {
// 5 to remove the arguments, the callothersubr call and the pop command
charstring.splice(i - 3, 5, 3);
i -= 3;
}
} }
break; break;
@ -1343,15 +1340,6 @@ CFF.prototype = {
i -= 2; i -= 2;
break; break;
case "pop":
if (i)
charstring.splice(i - 2, 2);
else
charstring.splice(i - 1, 1);
i -= 1;
break;
case "hsbw": case "hsbw":
var charWidthVector = charstring[i - 1]; var charWidthVector = charstring[i - 1];
var leftSidebearing = charstring[i - 2]; var leftSidebearing = charstring[i - 2];
@ -1406,7 +1394,7 @@ CFF.prototype = {
var glyphsCount = charstrings.length; var glyphsCount = charstrings.length;
for (var i = 0; i < glyphsCount; i++) { for (var i = 0; i < glyphsCount; i++) {
var charstring = charstrings[i].charstring; var charstring = charstrings[i].charstring;
glyphs.push(this.flattenCharstring(charstring.slice(), subrs)); glyphs.push(this.flattenCharstring(charstring.slice()));
} }
// Create a CFF font data // Create a CFF font data
@ -1511,22 +1499,35 @@ CFF.prototype = {
247, 32, 11, 247, 32, 11,
247, 10, 161, 147, 154, 150, 143, 12, 13, 247, 10, 161, 147, 154, 150, 143, 12, 13,
139, 12, 14, 139, 12, 14,
28, 0, 55, 19 28, 0, 55, 19 // Subrs offset
]); ]);
cff.set(privateData, currentOffset); cff.set(privateData, currentOffset);
currentOffset += privateData.length; currentOffset += privateData.length;
// Dump shit at the end of the file // Local Subrs
var shit = [ var flattenedSubrs = [];
0x00, 0x01, 0x01, 0x01,
0x13, 0x5D, 0x65, 0x64, var bias = 0;
0x5E, 0x5B, 0xAF, 0x66, var subrsCount = subrs.length;
0xBA, 0xBB, 0xB1, 0xB0, if (subrsCount < 1240)
0xB9, 0xBA, 0x65, 0xB2, bias = 107;
0x5C, 0x1F, 0x0B else if (subrsCount < 33900)
]; bias = 1131;
cff.set(shit, currentOffset); else
currentOffset += shit.length; bias = 32768;
// Add a bunch of empty subrs to deal with the Type2 bias
for (var i = 0; i < bias; i++)
flattenedSubrs.push([0x0B]);
for (var i = 0; i < subrsCount; i++) {
var subr = subrs[i];
flattenedSubrs.push(this.flattenCharstring(subr));
}
var subrsData = this.createCFFIndexHeader(flattenedSubrs, true);
cff.set(subrsData, currentOffset);
currentOffset += subrsData.length;
var fontData = []; var fontData = [];
for (var i = 0; i < currentOffset; i++) for (var i = 0; i < currentOffset; i++)