return parseFloat(str.substr(start, count) || 0);
};
+ function isSeparator(c) {
+ return c == ' ' || c == '\n' || c == '\x0d';
+ };
+
this.extractFontProgram = function t1_extractFontProgram(stream) {
var eexec = decrypt(stream, kEexecEncryptionKey, 4);
var eexecStr = '';
var c = '';
var count = eexecStr.length;
for (var i = 0; i < count; i++) {
- var getToken = function() {
- while (i < count && (eexecStr[i] == ' ' || eexecStr[i] == '\n'))
+ var getToken = function getToken() {
+ while (i < count && isSeparator(eexecStr[i]))
++i;
var token = '';
- while (i < count && !(eexecStr[i] == ' ' || eexecStr[i] == '\n'))
+ while (i < count && !isSeparator(eexecStr[i]))
token += eexecStr[i++];
return token;
}
i += length;
token = '';
- } else if (c == ' ' || c == '\n') {
+ } else if (isSeparator(c)) {
length = parseInt(token);
token = '';
} else {
var token = '';
var count = headerString.length;
for (var i = 0; i < count; i++) {
- var getToken = function() {
+ var getToken = function getToken() {
var char = headerString[i];
- while (i < count && (char == ' ' || char == '\n' || char == '/'))
+ while (i < count && (isSeparator(char) || char == '/'))
char = headerString[++i];
var token = '';
- while (i < count && !(char == ' ' || char == '\n' || char == '/')) {
+ while (i < count && !(isSeparator(char) || char == '/')) {
token += char;
char = headerString[++i];
}
};
var c = headerString[i];
- if (c == ' ' || c == '\n') {
+ if (isSeparator(c)) {
switch (token) {
case '/FontMatrix':
var matrix = readNumberArray(headerString, i + 1);
if ('undefined' == typeof(properties.differences[index])) {
properties.encoding[index] = glyph;
- properties.glyphs[glyph] = GlyphsUnicode[glyph];
+ properties.glyphs[glyph] = GlyphsUnicode[glyph] || index;
}
getToken(); // read the in 'put'
}
};
/**
- * The CFF class takes a Type1 file and wrap it into a 'Compact Font Format',
- * which itself embed Type2 charstrings.
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
*/
var CFFStrings = [
'.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
var CFF = function(name, file, properties) {
// Get the data block containing glyphs and subrs informations
- var length1 = file.dict.get('Length1');
- if (!IsNum(length1))
- length1 = length1.num;
-
- var length2 = file.dict.get('Length2');
- if (!IsNum(length2))
- length2 = length2.num;
-
- var headerBlock = file.getBytes(length1);
+ var headerBlock = file.getBytes(properties.length1);
type1Parser.extractFontHeader(headerBlock, properties);
// Decrypt the data blocks and retrieve it's content
- var eexecBlock = file.getBytes(length2);
+ var eexecBlock = file.getBytes(properties.length2);
var data = type1Parser.extractFontProgram(eexecBlock);
for (var info in data.properties)
properties[info] = data.properties[info];
}
constructor.isSpace = function(ch) {
- return ch == ' ' || ch == '\t';
+ return ch == ' ' || ch == '\t' || ch == '\x0d';
};
// A '1' in this array means the character is white space. A '1' or
fontName = fontName.name.replace(/[\+,\-]/g, '_');
var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+ var length1, length2;
if (fontFile) {
fontFile = xref.fetchIfRef(fontFile);
if (fileType)
fileType = fileType.name;
}
+
+ length1 = fontFile.dict.get('Length1');
+ if (!IsInt(length1))
+ length1 = xref.fetchIfRef(length1);
+
+ length2 = fontFile.dict.get('Length2');
+ if (!IsInt(length2))
+ length2 = xref.fetchIfRef(length2);
}
var widths = fontDict.get('Widths');
italicAngle: descriptor.get('ItalicAngle'),
fixedPitch: false,
textMatrix: IDENTITY_MATRIX,
- compositeFont: compositeFont
+ compositeFont: compositeFont,
+ length1: length1,
+ length2: length2
};
return {