Remove the aggregate commands and do some methods dance
This commit is contained in:
parent
4191485e1f
commit
ffa52f9dbd
263
PDFFont.js
263
PDFFont.js
@ -604,94 +604,6 @@ var Type1Parser = function(aAsciiStream, aBinaryStream) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function aggregateCommand(aCommand) {
|
|
||||||
var command = aCommand;
|
|
||||||
switch (command) {
|
|
||||||
case "hstem":
|
|
||||||
case "vstem":
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "rrcurveto":
|
|
||||||
var stack = [operandStack.pop(), operandStack.pop(),
|
|
||||||
operandStack.pop(), operandStack.pop(),
|
|
||||||
operandStack.pop(), operandStack.pop()];
|
|
||||||
var next = true;
|
|
||||||
while (next) {
|
|
||||||
var op = operandStack.peek();
|
|
||||||
if (op == "rrcurveto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
} else {
|
|
||||||
next = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "hlineto":
|
|
||||||
case "vlineto":
|
|
||||||
var last = command;
|
|
||||||
var stack = [operandStack.pop()];
|
|
||||||
var next = true;
|
|
||||||
while (next) {
|
|
||||||
var op = operandStack.peek();
|
|
||||||
if (op == "vlineto" && last == "hlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
} else if (op == "hlineto" && last == "vlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
} else if (op == "rlineto" && command == "hlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
var x = stack.pop();
|
|
||||||
operandStack.push(0);
|
|
||||||
operandStack.push(x);
|
|
||||||
command = "rlineto";
|
|
||||||
} else if (op == "rlineto" && command == "vlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
operandStack.push(0);
|
|
||||||
command = "rlineto";
|
|
||||||
} else {
|
|
||||||
next = false;
|
|
||||||
}
|
|
||||||
last = op;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "rlineto":
|
|
||||||
var stack = [operandStack.pop(), operandStack.pop()];
|
|
||||||
var next = true;
|
|
||||||
while (next) {
|
|
||||||
var op = operandStack.peek();
|
|
||||||
if (op == "rlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
} else if (op == "hlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(0);
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
} else if (op == "vlineto") {
|
|
||||||
operandStack.pop();
|
|
||||||
stack.push(operandStack.pop());
|
|
||||||
stack.push(0);
|
|
||||||
} else {
|
|
||||||
next= false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (stack.length)
|
|
||||||
operandStack.push(stack.pop());
|
|
||||||
operandStack.push(command);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flatten the commands by interpreting the postscript code and replacing
|
* Flatten the commands by interpreting the postscript code and replacing
|
||||||
* every 'callsubr', 'callothersubr' by the real commands.
|
* every 'callsubr', 'callothersubr' by the real commands.
|
||||||
@ -852,6 +764,87 @@ Type1Font.prototype = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
createCFFIndexHeader: function(aObjects, aIsByte) {
|
||||||
|
var data = [];
|
||||||
|
|
||||||
|
// First 2 bytes contains the number of objects contained into this index
|
||||||
|
var count = aObjects.length;
|
||||||
|
var bytes = this.integerToBytes(count, 2);
|
||||||
|
for (var i = 0; i < bytes.length; i++)
|
||||||
|
data.push(bytes[i]);
|
||||||
|
|
||||||
|
// Next byte contains the offset size use to reference object in the file
|
||||||
|
// Actually we're using 0x04 to be sure to be able to store everything
|
||||||
|
// without thinking of it while coding.
|
||||||
|
data.push(0x04);
|
||||||
|
|
||||||
|
// Add another offset after this one because we need a new offset
|
||||||
|
var relativeOffset = 1;
|
||||||
|
for (var i = 0; i < count + 1; i++) {
|
||||||
|
var bytes = this.integerToBytes(relativeOffset, 4);
|
||||||
|
for (var j = 0; j < bytes.length; j++)
|
||||||
|
data.push(bytes[j]);
|
||||||
|
|
||||||
|
if (aObjects[i])
|
||||||
|
relativeOffset += aObjects[i].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i =0; i < count; i++) {
|
||||||
|
for (var j = 0; j < aObjects[i].length; j++)
|
||||||
|
data.push(aIsByte ? aObjects[i][j] : aObjects[i][j].charCodeAt(0));
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
},
|
||||||
|
|
||||||
|
integerToBytes: function(aValue, aBytesCount) {
|
||||||
|
var bytes = [];
|
||||||
|
for (var i = 0; i < aBytesCount; i++)
|
||||||
|
bytes[i] = 0x00;
|
||||||
|
|
||||||
|
do {
|
||||||
|
bytes[--aBytesCount] = (aValue & 0xFF);
|
||||||
|
aValue = aValue >> 8;
|
||||||
|
} while (aBytesCount && aValue > 0);
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
},
|
||||||
|
|
||||||
|
encodeNumber: function(aValue) {
|
||||||
|
var x = 0;
|
||||||
|
if (aValue >= -107 && aValue <= 107) {
|
||||||
|
return [aValue + 139];
|
||||||
|
} else if (aValue >= 108 && aValue <= 1131) {
|
||||||
|
x = aValue - 108;
|
||||||
|
return [
|
||||||
|
this.integerToBytes(x / 256 + 247, 1),
|
||||||
|
x % 256
|
||||||
|
];
|
||||||
|
} else if (aValue >= -1131 && aValue <= -108) {
|
||||||
|
x = Math.abs(aValue) - 108;
|
||||||
|
return [
|
||||||
|
this.integerToBytes(x / 256 + 251, 1),
|
||||||
|
x % 256
|
||||||
|
];
|
||||||
|
} else if (aValue >= -32768 && aValue <= 32767) {
|
||||||
|
return [
|
||||||
|
28,
|
||||||
|
integerToBytes(aValue >> 8, 1),
|
||||||
|
integerToBytes(aValue, 1)
|
||||||
|
];
|
||||||
|
} else if (aValue >= (-2147483647-1) && aValue <= 2147483647) {
|
||||||
|
return [
|
||||||
|
0xFF,
|
||||||
|
integerToBytes(aValue >> 24, 1),
|
||||||
|
integerToBytes(aValue >> 16, 1),
|
||||||
|
integerToBytes(aValue >> 8, 1),
|
||||||
|
integerToBytes(aValue, 1)
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
error("Value: " + aValue + " is not allowed");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
convertToOTF: function(aFontName) {
|
convertToOTF: function(aFontName) {
|
||||||
var font = Fonts.get(aFontName);
|
var font = Fonts.get(aFontName);
|
||||||
|
|
||||||
@ -871,11 +864,6 @@ Type1Font.prototype = {
|
|||||||
for (var glyph in charstrings.map) {
|
for (var glyph in charstrings.map) {
|
||||||
var charstring = charstrings.get(glyph);
|
var charstring = charstrings.get(glyph);
|
||||||
glyphs[glyph] = parser.flattenCharstring(charstring, defaultWidth, nominalWidth, subrs);
|
glyphs[glyph] = parser.flattenCharstring(charstring, defaultWidth, nominalWidth, subrs);
|
||||||
|
|
||||||
//log("=================================== " + glyph + " ==============================");
|
|
||||||
//log(charstrings.get(glyph));
|
|
||||||
//log(flattenedCharstring);
|
|
||||||
//log(validationData[glyph]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a CFF font data
|
// Create a CFF font data
|
||||||
@ -942,7 +930,7 @@ Type1Font.prototype = {
|
|||||||
];
|
];
|
||||||
for (var glyph in charstrings.map) {
|
for (var glyph in charstrings.map) {
|
||||||
var index = CFFStrings.indexOf(glyph);
|
var index = CFFStrings.indexOf(glyph);
|
||||||
var bytes = integerToBytes(index, 2);
|
var bytes = this.integerToBytes(index, 2);
|
||||||
charset.push(bytes[0]);
|
charset.push(bytes[0]);
|
||||||
charset.push(bytes[1]);
|
charset.push(bytes[1]);
|
||||||
}
|
}
|
||||||
@ -985,7 +973,7 @@ Type1Font.prototype = {
|
|||||||
error(c);
|
error(c);
|
||||||
charstring.push(token);
|
charstring.push(token);
|
||||||
} else {
|
} else {
|
||||||
var bytes = encodeNumber(c);
|
var bytes = this.encodeNumber(c);
|
||||||
for (var j = 0; j < bytes.length; j++)
|
for (var j = 0; j < bytes.length; j++)
|
||||||
charstring.push(bytes[j]);
|
charstring.push(bytes[j]);
|
||||||
}
|
}
|
||||||
@ -1033,12 +1021,11 @@ Type1Font.prototype = {
|
|||||||
cff.set(shit, currentOffset);
|
cff.set(shit, currentOffset);
|
||||||
currentOffset += shit.length;
|
currentOffset += shit.length;
|
||||||
|
|
||||||
var file = new Uint8Array(cff, 0, currentOffset);
|
|
||||||
var parser = new Type2Parser();
|
|
||||||
|
|
||||||
|
|
||||||
log("==================== debug ====================");
|
log("==================== debug ====================");
|
||||||
log("== parse");
|
log("== parse");
|
||||||
|
var file = new Uint8Array(cff, 0, currentOffset);
|
||||||
|
var parser = new Type2Parser();
|
||||||
parser.parse(new Stream(file));
|
parser.parse(new Stream(file));
|
||||||
|
|
||||||
var data = [];
|
var data = [];
|
||||||
@ -1047,86 +1034,6 @@ Type1Font.prototype = {
|
|||||||
|
|
||||||
log("== write to file");
|
log("== write to file");
|
||||||
writeToFile(data, "/tmp/pdf.js.cff");
|
writeToFile(data, "/tmp/pdf.js.cff");
|
||||||
},
|
|
||||||
|
|
||||||
createCFFIndexHeader: function(aObjects, aIsByte) {
|
|
||||||
var data = [];
|
|
||||||
|
|
||||||
// First 2 bytes contains the number of objects contained into this index
|
|
||||||
var count = aObjects.length;
|
|
||||||
var bytes = integerToBytes(count, 2);
|
|
||||||
for (var i = 0; i < bytes.length; i++)
|
|
||||||
data.push(bytes[i]);
|
|
||||||
|
|
||||||
// Next byte contains the offset size use to reference object in the file
|
|
||||||
// Actually we're using 0x04 to be sure to be able to store everything
|
|
||||||
// without thinking of it while coding.
|
|
||||||
data.push(0x04);
|
|
||||||
|
|
||||||
// Add another offset after this one because we need a new offset
|
|
||||||
var relativeOffset = 1;
|
|
||||||
for (var i = 0; i < count + 1; i++) {
|
|
||||||
var bytes = integerToBytes(relativeOffset, 4);
|
|
||||||
for (var j = 0; j < bytes.length; j++)
|
|
||||||
data.push(bytes[j]);
|
|
||||||
|
|
||||||
if (aObjects[i])
|
|
||||||
relativeOffset += aObjects[i].length;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i =0; i < count; i++) {
|
|
||||||
for (var j = 0; j < aObjects[i].length; j++)
|
|
||||||
data.push(aIsByte ? aObjects[i][j] : aObjects[i][j].charCodeAt(0));
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function integerToBytes(aValue, aBytesCount) {
|
|
||||||
var bytes = [];
|
|
||||||
for (var i = 0; i < aBytesCount; i++)
|
|
||||||
bytes[i] = 0x00;
|
|
||||||
|
|
||||||
do {
|
|
||||||
bytes[--aBytesCount] = (aValue & 0xFF);
|
|
||||||
aValue = aValue >> 8;
|
|
||||||
} while (aBytesCount && aValue > 0);
|
|
||||||
|
|
||||||
return bytes;
|
|
||||||
};
|
|
||||||
|
|
||||||
function encodeNumber(aValue) {
|
|
||||||
var x = 0;
|
|
||||||
if (aValue >= -107 && aValue <= 107) {
|
|
||||||
return [aValue + 139];
|
|
||||||
} else if (aValue >= 108 && aValue <= 1131) {
|
|
||||||
x = aValue - 108;
|
|
||||||
return [
|
|
||||||
integerToBytes(x / 256 + 247, 1),
|
|
||||||
x % 256
|
|
||||||
];
|
|
||||||
} else if (aValue >= -1131 && aValue <= -108) {
|
|
||||||
x = Math.abs(aValue) - 108;
|
|
||||||
return [
|
|
||||||
integerToBytes(x / 256 + 251, 1),
|
|
||||||
x % 256
|
|
||||||
];
|
|
||||||
} else if (aValue >= -32768 && aValue <= 32767) {
|
|
||||||
return [
|
|
||||||
28,
|
|
||||||
integerToBytes(aValue >> 8, 1),
|
|
||||||
integerToBytes(aValue, 1)
|
|
||||||
];
|
|
||||||
} else if (aValue >= (-2147483647-1) && aValue <= 2147483647) {
|
|
||||||
return [
|
|
||||||
0xFF,
|
|
||||||
integerToBytes(aValue >> 24, 1),
|
|
||||||
integerToBytes(aValue >> 16, 1),
|
|
||||||
integerToBytes(aValue >> 8, 1),
|
|
||||||
integerToBytes(aValue, 1)
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
error("Value: " + aValue + " is not allowed");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user