Browse Source

cleanup code

sbarman 14 years ago
parent
commit
d502866111
  1. 55
      fonts.js
  2. 2
      pdf.js

55
fonts.js

@ -2036,12 +2036,14 @@ var Type2CFF = (function() {
parse: function cff_parse() { parse: function cff_parse() {
var header = this.parseHeader(); var header = this.parseHeader();
var nameIndex = this.parseIndex(header.endPos); var nameIndex = this.parseIndex(header.endPos);
var dictIndex = this.parseIndex(nameIndex.endPos); var dictIndex = this.parseIndex(nameIndex.endPos);
if (dictIndex.length != 1)
error('More than 1 font');
var stringIndex = this.parseIndex(dictIndex.endPos); var stringIndex = this.parseIndex(dictIndex.endPos);
var gsubrIndex = this.parseIndex(stringIndex.endPos); var gsubrIndex = this.parseIndex(stringIndex.endPos);
if (dictIndex.length != 1)
error('More than 1 font');
var strings = this.getStrings(stringIndex); var strings = this.getStrings(stringIndex);
@ -2056,19 +2058,19 @@ var Type2CFF = (function() {
baseDict = this.parseDict(privBytes); baseDict = this.parseDict(privBytes);
var privDict = this.getPrivDict(baseDict, strings); var privDict = this.getPrivDict(baseDict, strings);
// var encoding = this.parseEncoding(topDict['Encoding']); TODO('Parse encoding');
var charStrings = this.parseIndex(topDict['CharStrings']); var charStrings = this.parseIndex(topDict['CharStrings']);
var charset = this.parseCharsets(topDict['charset'], charStrings.length, var charset = this.parseCharsets(topDict['charset'], charStrings.length,
strings); strings);
// charstrings contains info about glyphs (one element per glyph // charstrings contains info about glyphs (one element per glyph
// containing mappings for {unicode, width} // containing mappings for {unicode, width})
this.charstrings = this.getCharStrings(charset, charStrings, this.charstrings = this.getCharStrings(charset, charStrings,
privDict, this.properties); privDict, this.properties);
}, },
getCharStrings: function cff_charstrings(charsets, charStrings, getCharStrings: function cff_charstrings(charsets, charStrings,
privDict, properties) { privDict, properties) {
var widths = properties.glyphWidths; var widths = properties.widths;
var defaultWidth = privDict['defaultWidthX']; var defaultWidth = privDict['defaultWidthX'];
var nominalWidth = privDict['nominalWidthX']; var nominalWidth = privDict['nominalWidthX'];
@ -2078,10 +2080,11 @@ var Type2CFF = (function() {
var charName = charsets[i]; var charName = charsets[i];
var charCode = GlyphsUnicode[charName]; var charCode = GlyphsUnicode[charName];
if (charCode) { if (charCode) {
var width = widths[charCode]; var width = widths[charCode] || defaultWidth;
if (!width)
width = defaultWidth;
charstrings.push({unicode: charCode, width: width}); charstrings.push({unicode: charCode, width: width});
} else {
if (charName !== '.notdef')
warn('Cannot find unicode for glyph ' + charName);
} }
} }
return charstrings; return charstrings;
@ -2099,17 +2102,18 @@ var Type2CFF = (function() {
var bytes = this.bytes; var bytes = this.bytes;
var format = bytes[pos++]; var format = bytes[pos++];
var charset = ['.notdef']; var charset = ['.notdef'];
// subtract 1 for the .notdef glyph
length -= 1;
switch (format) { switch (format) {
case 0: case 0:
for (var i = 0, ii = length - 1; i < ii; ++i) { for (var i = 0; i < length; ++i) {
var id = bytes[pos++]; var id = bytes[pos++];
id = (id << 8) | bytes[pos++]; id = (id << 8) | bytes[pos++];
charset.push(strings[id]); charset.push(strings[id]);
} }
return charset; return charset;
case 1: case 1:
// subtract 1 for the .notdef glyph
length -= 1;
while (charset.length <= length) { while (charset.length <= length) {
var first = bytes[pos++]; var first = bytes[pos++];
first = (first << 8) | bytes[pos++]; first = (first << 8) | bytes[pos++];
@ -2119,18 +2123,27 @@ var Type2CFF = (function() {
} }
return charset; return charset;
case 2: case 2:
while (charset.length <= length) {
var first = bytes[pos++];
first = (first << 8) | bytes[pos++];
var numLeft = bytes[pos++];
numLeft = (numLeft << 8) | bytes[pos++];
for (var i = 0; i <= numLeft; ++i)
charset.push(strings[first++]);
}
return charset;
default: default:
error('Unknown charset format');
} }
}, },
getPrivDict: function cff_getprivdict(baseDict, strings) { getPrivDict: function cff_getprivdict(baseDict, strings) {
var dict = {}; var dict = {};
// default values
dict['defaultWidthX'] = 0; dict['defaultWidthX'] = 0;
dict['nominalWidthX'] = 0; dict['nominalWidthX'] = 0;
// default values
for (var i = 0, ii = baseDict.length; i < ii; ++i) { for (var i = 0, ii = baseDict.length; i < ii; ++i) {
var pair = baseDict[i]; var pair = baseDict[i];
var key = pair[0]; var key = pair[0];
@ -2192,12 +2205,19 @@ var Type2CFF = (function() {
return dict; return dict;
}, },
getStrings: function cff_getstrings(stringIndex) { getStrings: function cff_getstrings(stringIndex) {
function bytesToString(bytesArr) {
var s = "";
for (var i = 0, ii = bytesArr.length; i < ii; ++i)
s += String.fromCharCode(bytesArr[i]);
return s;
}
var stringArray = []; var stringArray = [];
for (var i = 0, ii = CFFStrings.length; i < ii; ++i) for (var i = 0, ii = CFFStrings.length; i < ii; ++i)
stringArray.push(CFFStrings[i]); stringArray.push(CFFStrings[i]);
for (var i = 0, ii = stringIndex.length; i < ii; ++i) for (var i = 0, ii = stringIndex.length; i < ii; ++i)
stringArray.push(this.bytesToString(stringIndex.get(i))); stringArray.push(bytesToString(stringIndex.get(i)));
return stringArray; return stringArray;
}, },
@ -2207,6 +2227,7 @@ var Type2CFF = (function() {
while(bytes[offset] != 1) while(bytes[offset] != 1)
++offset; ++offset;
if (offset != 0) { if (offset != 0) {
warning("cff data is shifted"); warning("cff data is shifted");
bytes = bytes.subarray(offset); bytes = bytes.subarray(offset);
@ -2325,12 +2346,6 @@ var Type2CFF = (function() {
endPos: end endPos: end
} }
}, },
bytesToString: function cff_bytestostring(bytesArr) {
var s = "";
for (var i = 0, ii = bytesArr.length; i < ii; ++i)
s += String.fromCharCode(bytesArr[i]);
return s;
}
}; };
return constructor; return constructor;

2
pdf.js

@ -3838,7 +3838,7 @@ var PartialEvaluator = (function() {
var properties = { var properties = {
type: subType.name, type: subType.name,
subtype: fileType, subtype: fileType,
glyphWidths: glyphWidths, widths: glyphWidths,
encoding: encodingMap, encoding: encodingMap,
charset: charset, charset: charset,
firstChar: fontDict.get('FirstChar'), firstChar: fontDict.get('FirstChar'),

Loading…
Cancel
Save