add correct char width

This commit is contained in:
sbarman 2011-07-18 15:49:32 -07:00
parent 77292b3a07
commit 226f3fa3ee

View File

@ -2040,28 +2040,69 @@ var ActualCFF = (function() {
var privOffset = privInfo[1], privLength = privInfo[0];
var privBytes = bytes.subarray(privOffset, privOffset + privLength);
baseDict = this.parseDict(privBytes);
// var privDict = this.getPrivDict(baseDict, strings);
var privDict = this.getPrivDict(baseDict, strings);
var encoding = this.parseEncoding(topDict['Encoding']);
var charStrings = this.parseIndex(topDict['CharStrings']);
var charset = this.parseCharsets(topDict['charset'], charStrings.length,
strings);
this.charstrings = this.getCharStrings(encoding, charset);
this.charstrings = this.getCharStrings(encoding, charset, charStrings,
privDict);
// var dict = dictIndex.get(0);
log('blah');
},
getCharStrings: function cff_charstrings(encoding, charsets) {
getCharStrings: function cff_charstrings(encoding, charsets, charStrings,
privDict) {
var defaultWidth = privDict['defaultWidthX'];
var nominalWidth = privDict['nominalWidthX'];
var charstrings = [];
for (var i = 0, ii = charsets.length; i < ii; ++i) {
var charName = charsets[i];
var charCode = GlyphsUnicode[charName];
if (charCode)
charstrings.push( {unicode: charCode, width: 0});
var charCode = GlyphsUnicode[charName];
if (charCode) {
var charString = this.parseCharString(charStrings.get(i),
defaultWidth, nominalWidth);
charstrings.push({unicode: charCode, width: charString.width});
}
}
return charstrings;
},
parseCharString: function cff_parsecs(bytes, defaultWidth, nominalWidth) {
var pos = 0;
function parseInt() {
var value = bytes[pos++];
if (value < 32)
return null;
if (value <= 246) {
return value - 139;
} else if (value <= 250) {
return ((value - 247) * 256) + bytes[pos++] + 108;
} else if (value <= 254) {
return -((value - 251) * 256) - bytes[pos++] - 108;
} else {
error('Incorrect byte');
}
};
var val = bytes[pos];
var w;
if (val >= 32 && val <= 254) {
w = parseInt();
}
if (w)
w += nominalWidth;
else
w = defaultWidth;
return {width: w}
},
parseEncoding: function cff_parseencoding(pos) {
if (pos == 0) {
return Encodings.StandardEncoding;
@ -2099,6 +2140,29 @@ var ActualCFF = (function() {
}
},
getPrivDict: function cff_getprivdict(baseDict, strings) {
var dict = {};
dict['defaultWidthX'] = 0;
dict['nominalWidthX'] = 0;
// default values
for (var i = 0, ii = baseDict.length; i < ii; ++i) {
var pair = baseDict[i];
var key = pair[0];
var value = pair[1];
switch(key) {
case 20:
dict['defaultWidthX'] = value[0];
case 21:
dict['nominalWidthX'] = value[0];
default:
TODO('interpret top dict key');
}
}
return dict;
},
getTopDict: function cff_gettopdict(baseDict, strings) {
var dict = {};