Remove some hardcoded glue
This commit is contained in:
parent
1de5436561
commit
4d155983c5
53
fonts.js
53
fonts.js
@ -297,7 +297,7 @@ var Font = (function () {
|
|||||||
idDeltas + idRangeOffsets + glyphsIds);
|
idDeltas + idRangeOffsets + glyphsIds);
|
||||||
};
|
};
|
||||||
|
|
||||||
function createOS2Table() {
|
function createOS2Table(properties) {
|
||||||
return "\x00\x03" + // version
|
return "\x00\x03" + // version
|
||||||
"\x02\x24" + // xAvgCharWidth
|
"\x02\x24" + // xAvgCharWidth
|
||||||
"\x01\xF4" + // usWeightClass
|
"\x01\xF4" + // usWeightClass
|
||||||
@ -326,22 +326,22 @@ var Font = (function () {
|
|||||||
"\x00\x03" + // sTypoAscender
|
"\x00\x03" + // sTypoAscender
|
||||||
"\x00\x20" + // sTypeDescender
|
"\x00\x20" + // sTypeDescender
|
||||||
"\x00\x38" + // sTypoLineGap
|
"\x00\x38" + // sTypoLineGap
|
||||||
"\x00\x5A" + // usWinAscent
|
string16(properties.ascent) + // usWinAscent
|
||||||
"\x02\xB4" + // usWinDescent
|
string16(properties.descent) + // usWinDescent
|
||||||
"\x00\xCE\x00\x00" + // ulCodePageRange1 (Bits 0-31)
|
"\x00\xCE\x00\x00" + // ulCodePageRange1 (Bits 0-31)
|
||||||
"\x00\x01\x00\x00" + // ulCodePageRange2 (Bits 32-63)
|
"\x00\x01\x00\x00" + // ulCodePageRange2 (Bits 32-63)
|
||||||
"\x00\x00" + // sxHeight
|
string16(properties.xHeight) + // sxHeight
|
||||||
"\x00\x00" + // sCapHeight
|
string16(properties.capHeight) + // sCapHeight
|
||||||
"\x00\x01" + // usDefaultChar
|
"\x00\x01" + // usDefaultChar
|
||||||
"\x00\xCD" + // usBreakChar
|
"\x00\xCD" + // usBreakChar
|
||||||
"\x00\x02"; // usMaxContext
|
"\x00\x02"; // usMaxContext
|
||||||
};
|
};
|
||||||
|
|
||||||
function createPostTable() {
|
function createPostTable(properties) {
|
||||||
TODO("Fill with real values from the font dict");
|
TODO("Fill with real values from the font dict");
|
||||||
|
|
||||||
return "\x00\x03\x00\x00" + // Version number
|
return "\x00\x03\x00\x00" + // Version number
|
||||||
"\x00\x00\x01\x00" + // italicAngle
|
string32(properties.italicAngle) + // italicAngle
|
||||||
"\x00\x00" + // underlinePosition
|
"\x00\x00" + // underlinePosition
|
||||||
"\x00\x00" + // underlineThickness
|
"\x00\x00" + // underlineThickness
|
||||||
"\x00\x00\x00\x00" + // isFixedPitch
|
"\x00\x00\x00\x00" + // isFixedPitch
|
||||||
@ -412,6 +412,7 @@ var Font = (function () {
|
|||||||
(format == 6 && numTables == 1 && !properties.encoding.empty)) {
|
(format == 6 && numTables == 1 && !properties.encoding.empty)) {
|
||||||
// Format 0 alone is not allowed by the sanitizer so let's rewrite
|
// Format 0 alone is not allowed by the sanitizer so let's rewrite
|
||||||
// that to a 3-1-4 Unicode BMP table
|
// that to a 3-1-4 Unicode BMP table
|
||||||
|
TODO("Use an other source of informations than charset here, it is not reliable");
|
||||||
var charset = properties.charset;
|
var charset = properties.charset;
|
||||||
var glyphs = [];
|
var glyphs = [];
|
||||||
for (var j = 0; j < charset.length; j++) {
|
for (var j = 0; j < charset.length; j++) {
|
||||||
@ -517,7 +518,7 @@ var Font = (function () {
|
|||||||
// Insert the missing table
|
// Insert the missing table
|
||||||
tables.push({
|
tables.push({
|
||||||
tag: "OS/2",
|
tag: "OS/2",
|
||||||
data: stringToArray(createOS2Table())
|
data: stringToArray(createOS2Table(properties))
|
||||||
});
|
});
|
||||||
|
|
||||||
// Replace the old CMAP table with a shiny new one
|
// Replace the old CMAP table with a shiny new one
|
||||||
@ -527,7 +528,7 @@ var Font = (function () {
|
|||||||
if (!post) {
|
if (!post) {
|
||||||
tables.push({
|
tables.push({
|
||||||
tag: "post",
|
tag: "post",
|
||||||
data: stringToArray(createPostTable())
|
data: stringToArray(createPostTable(properties))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,14 +644,12 @@ var Font = (function () {
|
|||||||
createTableEntry(otf, offsets, "CFF ", CFF);
|
createTableEntry(otf, offsets, "CFF ", CFF);
|
||||||
|
|
||||||
/** OS/2 */
|
/** OS/2 */
|
||||||
OS2 = stringToArray(createOS2Table());
|
OS2 = stringToArray(createOS2Table(properties));
|
||||||
createTableEntry(otf, offsets, "OS/2", OS2);
|
createTableEntry(otf, offsets, "OS/2", OS2);
|
||||||
|
|
||||||
//XXX Getting charstrings here seems wrong since this is another CFF glue
|
|
||||||
var charstrings = font.getOrderedCharStrings(properties.glyphs);
|
|
||||||
|
|
||||||
/** CMAP */
|
/** CMAP */
|
||||||
cmap = createCMapTable(charstrings);
|
var charstrings = font.charstrings;
|
||||||
|
cmap = createCMapTable(font.charstrings);
|
||||||
createTableEntry(otf, offsets, "cmap", cmap);
|
createTableEntry(otf, offsets, "cmap", cmap);
|
||||||
|
|
||||||
/** HEAD */
|
/** HEAD */
|
||||||
@ -719,7 +718,7 @@ var Font = (function () {
|
|||||||
createTableEntry(otf, offsets, "name", name);
|
createTableEntry(otf, offsets, "name", name);
|
||||||
|
|
||||||
/** POST */
|
/** POST */
|
||||||
post = stringToArray(createPostTable());
|
post = stringToArray(createPostTable(properties));
|
||||||
createTableEntry(otf, offsets, "post", post);
|
createTableEntry(otf, offsets, "post", post);
|
||||||
|
|
||||||
// Once all the table entries header are written, dump the data!
|
// Once all the table entries header are written, dump the data!
|
||||||
@ -1187,6 +1186,8 @@ var CFFStrings = [
|
|||||||
"001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"
|
"001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
var type1Parser = new Type1Parser();
|
||||||
|
|
||||||
var CFF = function(name, file, properties) {
|
var CFF = function(name, file, properties) {
|
||||||
// Get the data block containing glyphs and subrs informations
|
// Get the data block containing glyphs and subrs informations
|
||||||
var length1 = file.dict.get("Length1");
|
var length1 = file.dict.get("Length1");
|
||||||
@ -1194,13 +1195,11 @@ var CFF = function(name, file, properties) {
|
|||||||
file.skip(length1);
|
file.skip(length1);
|
||||||
var eexecBlock = file.getBytes(length2);
|
var eexecBlock = file.getBytes(length2);
|
||||||
|
|
||||||
// Decrypt the data blocks and retrieve the informations from it
|
// Decrypt the data blocks and retrieve it's content
|
||||||
var parser = new Type1Parser();
|
var data = type1Parser.extractFontProgram(eexecBlock);
|
||||||
var fontInfo = parser.extractFontProgram(eexecBlock);
|
|
||||||
|
|
||||||
properties.subrs = fontInfo.subrs;
|
this.charstrings = this.getOrderedCharStrings(data.charstrings);
|
||||||
properties.glyphs = fontInfo.charstrings;
|
this.data = this.wrap(name, this.charstrings, data.subrs, properties);
|
||||||
this.data = this.wrap(name, properties);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CFF.prototype = {
|
CFF.prototype = {
|
||||||
@ -1265,7 +1264,7 @@ CFF.prototype = {
|
|||||||
charstrings.push({
|
charstrings.push({
|
||||||
glyph: glyph,
|
glyph: glyph,
|
||||||
unicode: unicode,
|
unicode: unicode,
|
||||||
charstring: glyphs[i].data.slice()
|
charstring: glyphs[i].data
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1308,7 +1307,7 @@ CFF.prototype = {
|
|||||||
if (obj.charAt) {
|
if (obj.charAt) {
|
||||||
switch (obj) {
|
switch (obj) {
|
||||||
case "callsubr":
|
case "callsubr":
|
||||||
var subr = subrs[charstring[i - 1]].slice();
|
var subr = subrs[charstring[i - 1]];
|
||||||
if (subr.length > 1) {
|
if (subr.length > 1) {
|
||||||
subr = this.flattenCharstring(glyph, subr, subrs);
|
subr = this.flattenCharstring(glyph, subr, subrs);
|
||||||
subr.pop();
|
subr.pop();
|
||||||
@ -1402,18 +1401,16 @@ CFF.prototype = {
|
|||||||
error("failing with i = " + i + " in charstring:" + charstring + "(" + charstring.length + ")");
|
error("failing with i = " + i + " in charstring:" + charstring + "(" + charstring.length + ")");
|
||||||
},
|
},
|
||||||
|
|
||||||
wrap: function wrap(name, properties) {
|
wrap: function wrap(name, charstrings, subrs, properties) {
|
||||||
var charstrings = this.getOrderedCharStrings(properties.glyphs);
|
|
||||||
|
|
||||||
// Starts the conversion of the Type1 charstrings to Type2
|
// Starts the conversion of the Type1 charstrings to Type2
|
||||||
var charstringsCount = 0;
|
var charstringsCount = 0;
|
||||||
var charstringsDataLength = 0;
|
var charstringsDataLength = 0;
|
||||||
var glyphs = [];
|
var glyphs = [];
|
||||||
for (var i = 0; i < charstrings.length; i++) {
|
for (var i = 0; i < charstrings.length; i++) {
|
||||||
var charstring = charstrings[i].charstring.slice();
|
var charstring = charstrings[i].charstring;
|
||||||
var glyph = charstrings[i].glyph;
|
var glyph = charstrings[i].glyph;
|
||||||
|
|
||||||
var flattened = this.flattenCharstring(glyph, charstring, properties.subrs);
|
var flattened = this.flattenCharstring(glyph, charstring, subrs);
|
||||||
glyphs.push(flattened);
|
glyphs.push(flattened);
|
||||||
charstringsCount++;
|
charstringsCount++;
|
||||||
charstringsDataLength += flattened.length;
|
charstringsDataLength += flattened.length;
|
||||||
|
15
pdf.js
15
pdf.js
@ -2384,9 +2384,8 @@ var CanvasGraphics = (function() {
|
|||||||
error("Unknown font encoding");
|
error("Unknown font encoding");
|
||||||
|
|
||||||
var index = 0;
|
var index = 0;
|
||||||
for (var j = 0; j < encoding.length; j++) {
|
for (var j = 0; j < encoding.length; j++)
|
||||||
encodingMap[index++] = GlyphsUnicode[encoding[j]];
|
encodingMap[index++] = GlyphsUnicode[encoding[j]];
|
||||||
}
|
|
||||||
|
|
||||||
var firstChar = xref.fetchIfRef(fontDict.get("FirstChar"));
|
var firstChar = xref.fetchIfRef(fontDict.get("FirstChar"));
|
||||||
var widths = xref.fetchIfRef(fontDict.get("Widths"));
|
var widths = xref.fetchIfRef(fontDict.get("Widths"));
|
||||||
@ -2472,15 +2471,19 @@ var CanvasGraphics = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var subType = fontDict.get("Subtype");
|
var subType = fontDict.get("Subtype");
|
||||||
var bbox = descriptor.get("FontBBox");
|
assertWellFormed(IsName(subType), "invalid font Subtype");
|
||||||
assertWellFormed(IsName(subType) && IsArray(bbox),
|
|
||||||
"invalid font Subtype or FontBBox");
|
|
||||||
|
|
||||||
var properties = {
|
var properties = {
|
||||||
type: subType.name,
|
type: subType.name,
|
||||||
encoding: encodingMap,
|
encoding: encodingMap,
|
||||||
charset: charset,
|
charset: charset,
|
||||||
bbox: bbox
|
bbox: descriptor.get("FontBBox"),
|
||||||
|
ascent: descriptor.get("Ascent"),
|
||||||
|
descent: descriptor.get("Descent"),
|
||||||
|
xHeight: descriptor.get("XHeight"),
|
||||||
|
capHeight: descriptor.get("CapHeight"),
|
||||||
|
flags: descriptor.get("Flags"),
|
||||||
|
italicAngle: descriptor.get("ItalicAngle")
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user