Make Type1 glyphs use the default width they declare
This commit is contained in:
parent
3fbeeccb96
commit
0ad010ecbd
68
PDFFont.js
68
PDFFont.js
@ -1375,10 +1375,10 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
|
||||
* as descrived in 'Using Subroutines' of 'Adobe Type 1 Font Format',
|
||||
* chapter 8.
|
||||
*/
|
||||
this.flattenCharstring = function(aCharstring, aDefaultWidth, aSubrs) {
|
||||
this.flattenCharstring = function(aCharstring, aSubrs) {
|
||||
operandStack.clear();
|
||||
executionStack.clear();
|
||||
executionStack.push(aCharstring);
|
||||
executionStack.push(aCharstring.slice());
|
||||
|
||||
var leftSidebearing = 0;
|
||||
var lastPoint = 0;
|
||||
@ -1392,24 +1392,13 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
|
||||
switch (obj) {
|
||||
case "hsbw":
|
||||
var charWidthVector = operandStack.pop();
|
||||
leftSidebearing = operandStack.pop();
|
||||
|
||||
if (charWidthVector != aDefaultWidth)
|
||||
operandStack.push(charWidthVector - aDefaultWidth);
|
||||
break;
|
||||
|
||||
case "rmoveto":
|
||||
var dy = operandStack.pop();
|
||||
var dx = operandStack.pop();
|
||||
var leftSidebearing = operandStack.pop();
|
||||
operandStack.push(charWidthVector);
|
||||
|
||||
if (leftSidebearing) {
|
||||
dx += leftSidebearing;
|
||||
leftSidebearing = 0;
|
||||
operandStack.push(leftSidebearing);
|
||||
operandStack.push("hmoveto");
|
||||
}
|
||||
|
||||
operandStack.push(dx);
|
||||
operandStack.push(dy);
|
||||
operandStack.push("rmoveto");
|
||||
break;
|
||||
|
||||
case "div":
|
||||
@ -1445,12 +1434,13 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
|
||||
break;
|
||||
|
||||
case "callothersubr":
|
||||
// XXX need to be improved
|
||||
var index = operandStack.pop();
|
||||
var count = operandStack.pop();
|
||||
var data = operandStack.pop();
|
||||
// XXX The callothersubr needs to support at least the 3 defaults
|
||||
// otherSubrs of the spec
|
||||
if (index != 3)
|
||||
dump("callothersubr for index: " + index);
|
||||
error("callothersubr for index: " + index);
|
||||
operandStack.push(3);
|
||||
operandStack.push("callothersubr");
|
||||
break;
|
||||
@ -1490,25 +1480,6 @@ var CFF = function(aFontFile) {
|
||||
};
|
||||
|
||||
CFF.prototype = {
|
||||
getDefaultWidth: function(aCharstrings) {
|
||||
var defaultWidth = 0;
|
||||
var defaultUsedCount = 0;
|
||||
|
||||
var widths = {};
|
||||
for (var i = 0; i < aCharstrings.length; i++) {
|
||||
var width = aCharstrings[i].charstring[1];
|
||||
var usedCount = (widths[width] || 0) + 1;
|
||||
|
||||
if (usedCount > defaultUsedCount) {
|
||||
defaultUsedCount = usedCount;
|
||||
defaultWidth = width;
|
||||
}
|
||||
|
||||
widths[width] = usedCount;
|
||||
}
|
||||
return parseInt(defaultWidth);
|
||||
},
|
||||
|
||||
createCFFIndexHeader: function(aObjects, aIsByte) {
|
||||
var data = [];
|
||||
|
||||
@ -1602,7 +1573,6 @@ CFF.prototype = {
|
||||
};
|
||||
|
||||
var charstrings = this.getOrderedCharStrings(aFont);
|
||||
var defaultWidth = this.getDefaultWidth(charstrings);
|
||||
|
||||
var charstringsCount = 0;
|
||||
var charstringsDataLength = 0;
|
||||
@ -1617,7 +1587,7 @@ CFF.prototype = {
|
||||
error("glyphs already exists!");
|
||||
glyphsChecker[glyph] = true;
|
||||
|
||||
var flattened = parser.flattenCharstring(charstring, defaultWidth, subrs);
|
||||
var flattened = parser.flattenCharstring(charstring, subrs);
|
||||
glyphs.push(flattened);
|
||||
charstringsCount++;
|
||||
charstringsDataLength += flattened.length;
|
||||
@ -1712,8 +1682,6 @@ CFF.prototype = {
|
||||
charstringsIndex = charstringsIndex.join(" ").split(" "); // XXX why?
|
||||
|
||||
|
||||
var fontBBox = aFont.get("FontBBox");
|
||||
|
||||
//Top Dict Index
|
||||
var topDictIndex = [
|
||||
0x00, 0x01, 0x01, 0x01, 0x30,
|
||||
@ -1724,6 +1692,7 @@ CFF.prototype = {
|
||||
248, 31, 4 // Weight
|
||||
];
|
||||
|
||||
var fontBBox = aFont.get("FontBBox");
|
||||
for (var i = 0; i < fontBBox.length; i++)
|
||||
topDictIndex = topDictIndex.concat(this.encodeNumber(fontBBox[i]));
|
||||
topDictIndex.push(5) // FontBBox;
|
||||
@ -1768,19 +1737,22 @@ CFF.prototype = {
|
||||
currentOffset += charstringsIndex.length;
|
||||
|
||||
// Private Data
|
||||
var privateData = [
|
||||
248, 136, 20,
|
||||
248, 136, 21,
|
||||
var defaultWidth = this.encodeNumber(0);
|
||||
var privateData = [].concat(
|
||||
defaultWidth, [20],
|
||||
defaultWidth, [21],
|
||||
[
|
||||
119, 159, 248, 97, 159, 247, 87, 159, 6,
|
||||
30, 10, 3, 150, 37, 255, 12, 9,
|
||||
139, 12, 10,
|
||||
172, 10,
|
||||
139, 12,
|
||||
10, 172, 10,
|
||||
172, 150, 143, 146, 150, 146, 12, 12,
|
||||
247, 32, 11,
|
||||
247, 10, 161, 147, 154, 150, 143, 12, 13,
|
||||
139, 12, 14,
|
||||
28, 0, 55, 19
|
||||
];
|
||||
]);
|
||||
privateData = privateData.join(" ").split(" ");
|
||||
cff.set(privateData, currentOffset);
|
||||
currentOffset += privateData.length;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user