Merge pull request #366 from sbarman/encoding2

Encoding2
This commit is contained in:
Andreas Gal 2011-08-23 18:51:52 -07:00
commit 5ec1f4d913

207
pdf.js
View File

@ -4176,6 +4176,7 @@ var PartialEvaluator = (function() {
} }
var encodingMap = {}; var encodingMap = {};
var glyphMap = {};
var charset = []; var charset = [];
if (compositeFont) { if (compositeFont) {
// Special CIDFont support // Special CIDFont support
@ -4213,117 +4214,131 @@ var PartialEvaluator = (function() {
'9.7.5.3'); '9.7.5.3');
} }
} }
} else if (fontDict.has('Encoding')) { } else {
var encoding = xref.fetchIfRef(fontDict.get('Encoding')); var baseEncoding = null, diffEncoding = [];
if (IsDict(encoding)) { if (fontDict.has('Encoding')) {
// Build a map of between codes and glyphs var encoding = xref.fetchIfRef(fontDict.get('Encoding'));
// Load the base encoding if (IsDict(encoding)) {
var baseName = encoding.get('BaseEncoding'); // Build a map of between codes and glyphs
if (baseName) { // Load the base encoding
var base = Encodings[baseName.name]; var baseName = encoding.get('BaseEncoding');
for (var j = 0, end = base.length; j < end; j++) if (baseName) {
encodingMap[j] = GlyphsUnicode[base[j]] || 0; baseEncoding = Encodings[baseName.name].slice();
} else {
TODO('need to load default encoding');
}
// Load the differences between the base and original
var differences = encoding.get('Differences');
var index = 0;
for (var j = 0; j < differences.length; j++) {
var data = differences[j];
if (IsNum(data)) {
index = data;
} else {
encodingMap[index++] = (subType.name == 'TrueType') ? j :
GlyphsUnicode[data.name];
} }
}
} else if (IsName(encoding)) {
var encoding = Encodings[encoding.name];
if (!encoding)
error('Unknown font encoding');
var index = 0; // Load the differences between the base and original
for (var j = 0; j < encoding.length; j++) var differences = encoding.get('Differences');
encodingMap[index++] = GlyphsUnicode[encoding[j]]; var index = 0;
for (var j = 0; j < differences.length; j++) {
// firstChar and width are required var data = differences[j];
// (except for 14 standard fonts) if (IsNum(data)) {
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar')); index = data;
var widths = xref.fetchIfRef(fontDict.get('Widths')) || []; } else {
for (var j = 0; j < widths.length; j++) { diffEncoding[index++] = data.name;
if (widths[j]) }
charset.push(encoding[j + firstChar]); }
} else if (IsName(encoding)) {
baseEncoding = Encodings[encoding.name].slice();
} }
} }
} else if (fontDict.has('ToUnicode')) {
encodingMap = {empty: true};
var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
if (IsName(cmapObj)) {
error('ToUnicode file cmap translation not implemented');
} else if (IsStream(cmapObj)) {
var encoding = Encodings['WinAnsiEncoding'];
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
var tokens = []; if (!baseEncoding) {
var token = ''; var type = subType.name;
if (type == 'TrueType') {
baseEncoding = Encodings.WinAnsiEncoding.slice(0);
} else if (type == 'Type1') {
baseEncoding = Encodings.StandardEncoding.slice(0);
} else {
error('Unknown type of font');
}
}
var cmap = cmapObj.getBytes(cmapObj.length); // merge in the differences
for (var i = 0; i < cmap.length; i++) { var length = baseEncoding.length > diffEncoding.length ?
var byte = cmap[i]; baseEncoding.length : diffEncoding.length;
if (byte == 0x20 || byte == 0x0A || byte == 0x3C || byte == 0x3E) { for (var i = 0, ii = length; i < ii; ++i) {
switch (token) { var diffGlyph = diffEncoding[i];
case 'useCMap': var baseGlyph = baseEncoding[i];
error('useCMap is not implemented'); if (diffGlyph) {
break; glyphMap[i] = diffGlyph;
encodingMap[i] = GlyphsUnicode[diffGlyph];
} else if (baseGlyph) {
glyphMap[i] = baseGlyph;
encodingMap[i] = GlyphsUnicode[baseGlyph];
}
}
case 'beginbfchar': if (fontDict.has('ToUnicode')) {
case 'beginbfrange': var cmapObj = xref.fetchIfRef(fontDict.get('ToUnicode'));
case 'begincodespacerange': if (IsName(cmapObj)) {
token = ''; error('ToUnicode file cmap translation not implemented');
tokens = []; } else if (IsStream(cmapObj)) {
break; var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
case 'endcodespacerange': var tokens = [];
TODO('Support CMap ranges'); var token = '';
break;
case 'endbfrange': var cmap = cmapObj.getBytes(cmapObj.length);
for (var j = 0; j < tokens.length; j += 3) { for (var i = 0; i < cmap.length; i++) {
var startRange = parseInt('0x' + tokens[j]); var byte = cmap[i];
var endRange = parseInt('0x' + tokens[j + 1]); if (byte == 0x20 || byte == 0x0A || byte == 0x3C ||
var code = parseInt('0x' + tokens[j + 2]); byte == 0x3E) {
switch (token) {
case 'useCMap':
error('useCMap is not implemented');
break;
for (var k = startRange; k <= endRange; k++) { case 'beginbfchar':
charset.push(encoding[code++] || '.notdef'); case 'beginbfrange':
} case 'begincodespacerange':
token = '';
tokens = [];
break;
case 'endcodespacerange':
TODO('Support CMap ranges');
break;
case 'endbfrange':
for (var j = 0; j < tokens.length; j += 3) {
var startRange = parseInt('0x' + tokens[j]);
var endRange = parseInt('0x' + tokens[j + 1]);
var code = parseInt('0x' + tokens[j + 2]);
}
break;
case 'endbfchar':
for (var j = 0; j < tokens.length; j += 2) {
var index = parseInt('0x' + tokens[j]);
var code = parseInt('0x' + tokens[j + 1]);
encodingMap[index] = code;
}
break;
default:
if (token.length) {
tokens.push(token);
token = '';
}
break;
} }
break; } else if (byte == 0x5B || byte == 0x5D) {
error('CMAP list parsing is not implemented');
case 'endbfchar': } else {
for (var j = 0; j < tokens.length; j += 2) { token += String.fromCharCode(byte);
var index = parseInt('0x' + tokens[j]);
var code = parseInt('0x' + tokens[j + 1]);
encodingMap[index] = GlyphsUnicode[encoding[code]];
charset.push(encoding[code] || '.notdef');
}
break;
default:
if (token.length) {
tokens.push(token);
token = '';
}
break;
} }
} else if (byte == 0x5B || byte == 0x5D) {
error('CMAP list parsing is not implemented');
} else {
token += String.fromCharCode(byte);
} }
} }
} }
// firstChar and width are required
// (except for 14 standard fonts)
var firstChar = xref.fetchIfRef(fontDict.get('FirstChar'));
var widths = xref.fetchIfRef(fontDict.get('Widths')) || [];
for (var j = 0; j < widths.length; j++) {
if (widths[j])
charset.push(glyphMap[j + firstChar]);
}
} }
if (!fd) { if (!fd) {