|
|
@ -1284,8 +1284,6 @@ var Font = (function Font() { |
|
|
|
var charcode = chars.charCodeAt(i); |
|
|
|
var charcode = chars.charCodeAt(i); |
|
|
|
var unicode = encoding[charcode]; |
|
|
|
var unicode = encoding[charcode]; |
|
|
|
if ('undefined' == typeof(unicode)) { |
|
|
|
if ('undefined' == typeof(unicode)) { |
|
|
|
// FIXME/issue 233: we're hitting this in test/pdf/sizes.pdf
|
|
|
|
|
|
|
|
// at the moment, for unknown reasons.
|
|
|
|
|
|
|
|
warn('Unencoded charcode ' + charcode); |
|
|
|
warn('Unencoded charcode ' + charcode); |
|
|
|
unicode = charcode; |
|
|
|
unicode = charcode; |
|
|
|
} |
|
|
|
} |
|
|
@ -1485,16 +1483,22 @@ var Type1Parser = function() { |
|
|
|
// TODO Clean this code
|
|
|
|
// TODO Clean this code
|
|
|
|
if (value == 13) { |
|
|
|
if (value == 13) { |
|
|
|
if (charstring.length == 2) { |
|
|
|
if (charstring.length == 2) { |
|
|
|
|
|
|
|
lsb = charstring[0]; |
|
|
|
width = charstring[1]; |
|
|
|
width = charstring[1]; |
|
|
|
|
|
|
|
charstring.splice(0, 1); |
|
|
|
} else if (charstring.length == 4 && charstring[3] == 'div') { |
|
|
|
} else if (charstring.length == 4 && charstring[3] == 'div') { |
|
|
|
|
|
|
|
lsb = charstring[0]; |
|
|
|
width = charstring[1] / charstring[2]; |
|
|
|
width = charstring[1] / charstring[2]; |
|
|
|
|
|
|
|
charstring.splice(0, 1); |
|
|
|
|
|
|
|
} else if (charstring.length == 4 && charstring[2] == 'div') { |
|
|
|
|
|
|
|
lsb = charstring[0] / charstring[1]; |
|
|
|
|
|
|
|
width = charstring[3]; |
|
|
|
|
|
|
|
charstring.splice(0, 3); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
error('Unsupported hsbw format: ' + charstring); |
|
|
|
error('Unsupported hsbw format: ' + charstring); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
lsb = charstring[0]; |
|
|
|
|
|
|
|
charstring.push(lsb, 'hmoveto'); |
|
|
|
charstring.push(lsb, 'hmoveto'); |
|
|
|
charstring.splice(0, 1); |
|
|
|
|
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
command = charStringDictionary[value]; |
|
|
|
command = charStringDictionary[value]; |
|
|
@ -1584,13 +1588,12 @@ var Type1Parser = function() { |
|
|
|
while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n')) |
|
|
|
while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n')) |
|
|
|
++i; |
|
|
|
++i; |
|
|
|
|
|
|
|
|
|
|
|
var t = ''; |
|
|
|
var token = ''; |
|
|
|
while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n')) |
|
|
|
while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n')) |
|
|
|
t += eexecStr[i++]; |
|
|
|
token += eexecStr[i++]; |
|
|
|
|
|
|
|
|
|
|
|
return t; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return token; |
|
|
|
|
|
|
|
}; |
|
|
|
var c = eexecStr[i]; |
|
|
|
var c = eexecStr[i]; |
|
|
|
|
|
|
|
|
|
|
|
if ((glyphsSection || subrsSection) && c == 'R') { |
|
|
|
if ((glyphsSection || subrsSection) && c == 'R') { |
|
|
@ -1674,18 +1677,28 @@ var Type1Parser = function() { |
|
|
|
return program; |
|
|
|
return program; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
this.extractFontHeader = function t1_extractFontProgram(stream) { |
|
|
|
this.extractFontHeader = function t1_extractFontHeader(stream, properties) { |
|
|
|
var headerString = ''; |
|
|
|
var headerString = ''; |
|
|
|
for (var i = 0; i < stream.length; i++) |
|
|
|
for (var i = 0; i < stream.length; i++) |
|
|
|
headerString += String.fromCharCode(stream[i]); |
|
|
|
headerString += String.fromCharCode(stream[i]); |
|
|
|
|
|
|
|
|
|
|
|
var info = { |
|
|
|
|
|
|
|
textMatrix: null |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var token = ''; |
|
|
|
var token = ''; |
|
|
|
var count = headerString.length; |
|
|
|
var count = headerString.length; |
|
|
|
for (var i = 0; i < count; i++) { |
|
|
|
for (var i = 0; i < count; i++) { |
|
|
|
|
|
|
|
var getToken = function() { |
|
|
|
|
|
|
|
var char = headerString[i]; |
|
|
|
|
|
|
|
while (i < count && (char == ' ' || char == '\n' || char == '/')) |
|
|
|
|
|
|
|
char = headerString[++i]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var token = ''; |
|
|
|
|
|
|
|
while (i < count && !(char == ' ' || char == '\n' || char == '/')) { |
|
|
|
|
|
|
|
token += char; |
|
|
|
|
|
|
|
char = headerString[++i]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return token; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var c = headerString[i]; |
|
|
|
var c = headerString[i]; |
|
|
|
if (c == ' ' || c == '\n') { |
|
|
|
if (c == ' ' || c == '\n') { |
|
|
|
switch (token) { |
|
|
|
switch (token) { |
|
|
@ -1699,7 +1712,25 @@ var Type1Parser = function() { |
|
|
|
// Make the angle into the right direction
|
|
|
|
// Make the angle into the right direction
|
|
|
|
matrix[2] *= -1; |
|
|
|
matrix[2] *= -1; |
|
|
|
|
|
|
|
|
|
|
|
info.textMatrix = matrix; |
|
|
|
properties.textMatrix = matrix; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case '/Encoding': |
|
|
|
|
|
|
|
if (!properties.builtInEncoding) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var size = parseInt(getToken()); |
|
|
|
|
|
|
|
getToken(); // read in 'array'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (var j = 0; j < size; j++) { |
|
|
|
|
|
|
|
var token = getToken(); |
|
|
|
|
|
|
|
if (token == 'dup') { |
|
|
|
|
|
|
|
var index = parseInt(getToken()); |
|
|
|
|
|
|
|
var glyph = getToken(); |
|
|
|
|
|
|
|
properties.encoding[index] = GlyphsUnicode[glyph]; |
|
|
|
|
|
|
|
getToken(); // read the in 'put'
|
|
|
|
|
|
|
|
j = index; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
token = ''; |
|
|
|
token = ''; |
|
|
@ -1707,8 +1738,6 @@ var Type1Parser = function() { |
|
|
|
token += c; |
|
|
|
token += c; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return info; |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -1792,13 +1821,11 @@ var CFF = function(name, file, properties) { |
|
|
|
var length2 = file.dict.get('Length2'); |
|
|
|
var length2 = file.dict.get('Length2'); |
|
|
|
|
|
|
|
|
|
|
|
var headerBlock = file.getBytes(length1); |
|
|
|
var headerBlock = file.getBytes(length1); |
|
|
|
var header = type1Parser.extractFontHeader(headerBlock); |
|
|
|
type1Parser.extractFontHeader(headerBlock, properties); |
|
|
|
for (var info in header) |
|
|
|
|
|
|
|
properties[info] = header[info]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Decrypt the data blocks and retrieve it's content
|
|
|
|
// Decrypt the data blocks and retrieve it's content
|
|
|
|
var eexecBlock = file.getBytes(length2); |
|
|
|
var eexecBlock = file.getBytes(length2); |
|
|
|
var data = type1Parser.extractFontProgram(eexecBlock); |
|
|
|
var data = type1Parser.extractFontProgram(eexecBlock, properties); |
|
|
|
for (var info in data.properties) |
|
|
|
for (var info in data.properties) |
|
|
|
properties[info] = data.properties[info]; |
|
|
|
properties[info] = data.properties[info]; |
|
|
|
|
|
|
|
|
|
|
@ -1868,15 +1895,14 @@ CFF.prototype = { |
|
|
|
|
|
|
|
|
|
|
|
getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs) { |
|
|
|
getOrderedCharStrings: function cff_getOrderedCharStrings(glyphs) { |
|
|
|
var charstrings = []; |
|
|
|
var charstrings = []; |
|
|
|
|
|
|
|
var missings = []; |
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < glyphs.length; i++) { |
|
|
|
for (var i = 0; i < glyphs.length; i++) { |
|
|
|
var glyph = glyphs[i]; |
|
|
|
var glyph = glyphs[i]; |
|
|
|
var unicode = GlyphsUnicode[glyph.glyph]; |
|
|
|
var unicode = GlyphsUnicode[glyph.glyph]; |
|
|
|
if (!unicode) { |
|
|
|
if (!unicode) { |
|
|
|
if (glyph.glyph != '.notdef') { |
|
|
|
if (glyph.glyph != '.notdef') |
|
|
|
warn(glyph.glyph + |
|
|
|
missings.push(glyph.glyph); |
|
|
|
' does not have an entry in the glyphs unicode dictionary'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
charstrings.push({ |
|
|
|
charstrings.push({ |
|
|
|
glyph: glyph, |
|
|
|
glyph: glyph, |
|
|
@ -1888,6 +1914,9 @@ CFF.prototype = { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (missings.length) |
|
|
|
|
|
|
|
warn(missings + ' does not have unicode in the glyphs dictionary'); |
|
|
|
|
|
|
|
|
|
|
|
charstrings.sort(function charstrings_sort(a, b) { |
|
|
|
charstrings.sort(function charstrings_sort(a, b) { |
|
|
|
return a.unicode - b.unicode; |
|
|
|
return a.unicode - b.unicode; |
|
|
|
}); |
|
|
|
}); |
|
|
|