OTF fonts works with the sanitizer (woot)
This commit is contained in:
parent
1f7aaf7b50
commit
6e7e8ee64c
85
PDFFont.js
85
PDFFont.js
@ -721,7 +721,7 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var type1hack = false;
|
var fontCount = 0;
|
||||||
var Type1Font = function(aFontName, aFontFile) {
|
var Type1Font = function(aFontName, aFontFile) {
|
||||||
if (_Fonts[aFontName])
|
if (_Fonts[aFontName])
|
||||||
return;
|
return;
|
||||||
@ -731,8 +731,8 @@ var Type1Font = function(aFontName, aFontFile) {
|
|||||||
if (aFontFile.getByte() != 0x25 || aFontFile.getByte() != 0x21)
|
if (aFontFile.getByte() != 0x25 || aFontFile.getByte() != 0x21)
|
||||||
error("Invalid file header");
|
error("Invalid file header");
|
||||||
|
|
||||||
if (!type1hack || true) {
|
if (!fontCount || true) {
|
||||||
type1hack = true;
|
fontCount++;
|
||||||
var start = Date.now();
|
var start = Date.now();
|
||||||
|
|
||||||
var ASCIIStream = aFontFile.makeSubStream(0, aFontFile.dict.get("Length1"), aFontFile.dict);
|
var ASCIIStream = aFontFile.makeSubStream(0, aFontFile.dict.get("Length1"), aFontFile.dict);
|
||||||
@ -851,17 +851,27 @@ Type1Font.prototype = {
|
|||||||
var dict = aFont.get("CharStrings")
|
var dict = aFont.get("CharStrings")
|
||||||
var charstrings = [];
|
var charstrings = [];
|
||||||
for (var glyph in dict.map) {
|
for (var glyph in dict.map) {
|
||||||
|
var unicode = GlyphsUnicode[glyph];
|
||||||
|
if (!unicode) {
|
||||||
|
if (glyph != ".notdef")
|
||||||
|
warn(glyph + " does not have an entry in the glyphs unicode dictionary");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var b1 = parseInt("0x" + unicode[0] + unicode[1]);
|
||||||
|
var b2 = parseInt("0x" + unicode[2] + unicode[3]);
|
||||||
|
unicode = this.bytesToInteger([b1, b2]);
|
||||||
|
|
||||||
charstrings.push({
|
charstrings.push({
|
||||||
glyph: glyph,
|
glyph: glyph,
|
||||||
|
unicode: unicode,
|
||||||
charstring: dict.map[glyph].slice()
|
charstring: dict.map[glyph].slice()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
charstrings.sort(function(a, b) {
|
charstrings.sort(function(a, b) {
|
||||||
return CFFStrings.indexOf(a.glyph) > CFFStrings.indexOf(b.glyph);
|
return a.unicode > b.unicode;
|
||||||
});
|
});
|
||||||
charstrings.shift();
|
|
||||||
|
|
||||||
return charstrings;
|
return charstrings;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1071,14 +1081,14 @@ Type1Font.prototype = {
|
|||||||
//var parser = new Type2Parser();
|
//var parser = new Type2Parser();
|
||||||
//parser.parse(new Stream(file));
|
//parser.parse(new Stream(file));
|
||||||
|
|
||||||
var data = [];
|
var fontData = [];
|
||||||
for (var i = 0; i < currentOffset; i++)
|
for (var i = 0; i < currentOffset; i++)
|
||||||
data.push(cff[i]);
|
fontData.push(cff[i]);
|
||||||
|
|
||||||
//log("== write to file");
|
//log("== write to file");
|
||||||
//writeToFile(data, "/tmp/pdf.js.cff");
|
//writeToFile(fontData, "/tmp/pdf.js." + fontCount + ".cff");
|
||||||
|
|
||||||
return data;
|
return fontData;
|
||||||
},
|
},
|
||||||
|
|
||||||
getMaxPower2: function(aNumber) {
|
getMaxPower2: function(aNumber) {
|
||||||
@ -1228,36 +1238,14 @@ Type1Font.prototype = {
|
|||||||
data.push(0x00);
|
data.push(0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < charstrings.length; i++) {
|
for (var i = 0; i < charstrings.length; i++)
|
||||||
var glyph = charstrings[i].glyph;
|
data[charstrings[i].unicode] = i + 1;
|
||||||
if (glyph == ".notdef")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var pos = GlyphsUnicode[glyph];
|
|
||||||
if (!pos)
|
|
||||||
error(charstrings[i].glyph + " does not have an entry in the glyphs table");
|
|
||||||
var b1 = parseInt("0x" + pos[0] + pos[1]);
|
|
||||||
var b2 = parseInt("0x" + pos[2] + pos[3]);
|
|
||||||
var num = this.bytesToInteger([b1, b2]);
|
|
||||||
data[num] = i + 1;
|
|
||||||
}
|
|
||||||
cmap = cmap.concat(data);
|
cmap = cmap.concat(data);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var data = new Array(1000);
|
var data = new Array(1000);
|
||||||
for (var i = 0; i < charstrings.length; i++) {
|
for (var i = 0; i < charstrings.length; i++)
|
||||||
var glyph = charstrings[i].glyph;
|
data[charstrings[i].unicode] = i + 1;
|
||||||
if (glyph == ".notdef")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var pos = GlyphsUnicode[glyph];
|
|
||||||
if (!pos)
|
|
||||||
error(charstrings[i].glyph + " does not have an entry in the glyphs table");
|
|
||||||
var b1 = parseInt("0x" + pos[0] + pos[1]);
|
|
||||||
var b2 = parseInt("0x" + pos[2] + pos[3]);
|
|
||||||
var num = this.bytesToInteger([b1, b2]);
|
|
||||||
data[num] = i + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ranges = [];
|
var ranges = [];
|
||||||
var range = [];
|
var range = [];
|
||||||
@ -1266,7 +1254,10 @@ Type1Font.prototype = {
|
|||||||
if (char) {
|
if (char) {
|
||||||
range.push(i);
|
range.push(i);
|
||||||
} else if (range.length) {
|
} else if (range.length) {
|
||||||
//log("create a new range of " + range.length + " chars width min: " + range[0] + " to max: " + range[range.length - 1]);
|
if (0) {
|
||||||
|
log("create a new range of " + range.length + " chars width min: " + range[0] + " to max: " + range[range.length - 1]);
|
||||||
|
log("range content is: " + range);
|
||||||
|
}
|
||||||
ranges.push(range.slice());
|
ranges.push(range.slice());
|
||||||
range = [];
|
range = [];
|
||||||
}
|
}
|
||||||
@ -1286,7 +1277,6 @@ Type1Font.prototype = {
|
|||||||
cmap = cmap.concat(this.integerToBytes(rangeShift, 2));
|
cmap = cmap.concat(this.integerToBytes(rangeShift, 2));
|
||||||
|
|
||||||
// End characters code with an additional 0xFFFF to finish the array
|
// End characters code with an additional 0xFFFF to finish the array
|
||||||
var endCodes = [];
|
|
||||||
for (var i = 0; i < ranges.length; i++) {
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
var range = ranges[i];
|
var range = ranges[i];
|
||||||
cmap = cmap.concat(this.integerToBytes(range[range.length - 1], 2));
|
cmap = cmap.concat(this.integerToBytes(range[range.length - 1], 2));
|
||||||
@ -1303,25 +1293,20 @@ Type1Font.prototype = {
|
|||||||
};
|
};
|
||||||
cmap = cmap.concat([0xFF, 0xFF]);
|
cmap = cmap.concat([0xFF, 0xFF]);
|
||||||
|
|
||||||
|
|
||||||
// Fill idDelta
|
// Fill idDelta
|
||||||
var idDelta = [];
|
|
||||||
var delta = 0;
|
var delta = 0;
|
||||||
var p = 1;
|
var p = 0;
|
||||||
for (var i = 0; i < ranges.length; i++) {
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
var range = ranges[i];
|
var range = ranges[i];
|
||||||
var start = range[0];
|
var start = range[0];
|
||||||
var end = range[range.length - 1];
|
var delta = ((start - 1) - p) % 65536;
|
||||||
var diff = end - start;
|
|
||||||
var delta = -(start - p);
|
|
||||||
|
|
||||||
var value = this.integerToBytes(-delta, 2);
|
var value = this.integerToBytes(delta, 2);
|
||||||
value[0] ^= 0xFF;
|
value[0] ^= 0xFF;
|
||||||
value[1] ^= 0xFF;
|
value[1] ^= 0xFF;
|
||||||
value[1] += 1;
|
value[1] += 1;
|
||||||
|
|
||||||
cmap = cmap.concat([value[0], value[1]]);
|
cmap = cmap.concat([value[0], value[1]]);
|
||||||
delta -= range.length;
|
|
||||||
p += range.length;
|
p += range.length;
|
||||||
};
|
};
|
||||||
cmap = cmap.concat([0x00, 0x01]);
|
cmap = cmap.concat([0x00, 0x01]);
|
||||||
@ -1334,7 +1319,6 @@ Type1Font.prototype = {
|
|||||||
};
|
};
|
||||||
cmap = cmap.concat([0x00, 0x00]);
|
cmap = cmap.concat([0x00, 0x00]);
|
||||||
|
|
||||||
|
|
||||||
var cmapHeader = [
|
var cmapHeader = [
|
||||||
0x00, 0x00, // version
|
0x00, 0x00, // version
|
||||||
0x00, 0x01, // numTables
|
0x00, 0x01, // numTables
|
||||||
@ -1349,9 +1333,8 @@ Type1Font.prototype = {
|
|||||||
// Fill up data!
|
// Fill up data!
|
||||||
for (var i = 0; i < ranges.length; i++) {
|
for (var i = 0; i < ranges.length; i++) {
|
||||||
var range = ranges[i];
|
var range = ranges[i];
|
||||||
for (var j = 0; j < range.length; j++) {
|
for (var j = 0; j < range.length; j++)
|
||||||
cmap = cmap.concat(range[j]);
|
cmap = cmap.concat(range[j]);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
cmap = cmapHeader.concat(cmap);
|
cmap = cmapHeader.concat(cmap);
|
||||||
}
|
}
|
||||||
@ -1491,7 +1474,7 @@ Type1Font.prototype = {
|
|||||||
for (var i = 0; i < currentOffset; i++)
|
for (var i = 0; i < currentOffset; i++)
|
||||||
fontData.push(otf[i]);
|
fontData.push(otf[i]);
|
||||||
|
|
||||||
writeToFile(fontData, "/tmp/pdf.js.otf");
|
//writeToFile(fontData, "/tmp/pdf.js." + fontCount + ".otf");
|
||||||
return fontData;
|
return fontData;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user