add correct char width
This commit is contained in:
parent
77292b3a07
commit
226f3fa3ee
76
fonts.js
76
fonts.js
@ -2040,28 +2040,69 @@ var ActualCFF = (function() {
|
|||||||
var privOffset = privInfo[1], privLength = privInfo[0];
|
var privOffset = privInfo[1], privLength = privInfo[0];
|
||||||
var privBytes = bytes.subarray(privOffset, privOffset + privLength);
|
var privBytes = bytes.subarray(privOffset, privOffset + privLength);
|
||||||
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']);
|
var encoding = this.parseEncoding(topDict['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);
|
||||||
|
|
||||||
this.charstrings = this.getCharStrings(encoding, charset);
|
this.charstrings = this.getCharStrings(encoding, charset, charStrings,
|
||||||
|
privDict);
|
||||||
|
|
||||||
// var dict = dictIndex.get(0);
|
// var dict = dictIndex.get(0);
|
||||||
log('blah');
|
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 = [];
|
var charstrings = [];
|
||||||
for (var i = 0, ii = charsets.length; i < ii; ++i) {
|
for (var i = 0, ii = charsets.length; i < ii; ++i) {
|
||||||
var charName = charsets[i];
|
var charName = charsets[i];
|
||||||
var charCode = GlyphsUnicode[charName];
|
var charCode = GlyphsUnicode[charName];
|
||||||
if (charCode)
|
if (charCode) {
|
||||||
charstrings.push( {unicode: charCode, width: 0});
|
var charString = this.parseCharString(charStrings.get(i),
|
||||||
|
defaultWidth, nominalWidth);
|
||||||
|
charstrings.push({unicode: charCode, width: charString.width});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return charstrings;
|
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) {
|
parseEncoding: function cff_parseencoding(pos) {
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
return Encodings.StandardEncoding;
|
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) {
|
getTopDict: function cff_gettopdict(baseDict, strings) {
|
||||||
var dict = {};
|
var dict = {};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user