|
|
1d3252 |
--- poppler-0.26.5/poppler/PSOutputDev.cc
|
|
|
1d3252 |
+++ poppler-0.26.5/poppler/PSOutputDev.cc
|
|
|
1d3252 |
@@ -2069,7 +2069,7 @@ void PSOutputDev::setupEmbeddedType1Font
|
|
|
1d3252 |
static const char hexChar[17] = "0123456789abcdef";
|
|
|
1d3252 |
Object refObj, strObj, obj1, obj2, obj3;
|
|
|
1d3252 |
Dict *dict;
|
|
|
1d3252 |
- int length1, length2, length3;
|
|
|
1d3252 |
+ long length1, length2, length3;
|
|
|
1d3252 |
int c;
|
|
|
1d3252 |
int start[4];
|
|
|
1d3252 |
GBool binMode;
|
|
|
1d3252 |
@@ -2119,8 +2119,18 @@ void PSOutputDev::setupEmbeddedType1Font
|
|
|
1d3252 |
embFontList->append(psName->getCString());
|
|
|
1d3252 |
embFontList->append("\n");
|
|
|
1d3252 |
|
|
|
1d3252 |
- // copy ASCII portion of font
|
|
|
1d3252 |
strObj.streamReset();
|
|
|
1d3252 |
+ if (strObj.streamGetChar() == 0x80 &&
|
|
|
1d3252 |
+ strObj.streamGetChar() == 1) {
|
|
|
1d3252 |
+ // PFB format
|
|
|
1d3252 |
+ length1 = strObj.streamGetChar() |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 8) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 16) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 24);
|
|
|
1d3252 |
+ } else {
|
|
|
1d3252 |
+ strObj.streamReset();
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
+ // copy ASCII portion of font
|
|
|
1d3252 |
for (i = 0; i < length1 && (c = strObj.streamGetChar()) != EOF; ++i) {
|
|
|
1d3252 |
writePSChar(c);
|
|
|
1d3252 |
}
|
|
|
1d3252 |
@@ -2153,9 +2163,18 @@ void PSOutputDev::setupEmbeddedType1Font
|
|
|
1d3252 |
|
|
|
1d3252 |
// convert binary data to ASCII
|
|
|
1d3252 |
if (binMode) {
|
|
|
1d3252 |
- for (i = 0; i < 4; ++i) {
|
|
|
1d3252 |
- writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
|
|
|
1d3252 |
- writePSChar(hexChar[start[i] & 0x0f]);
|
|
|
1d3252 |
+ if (start[0] == 0x80 &&
|
|
|
1d3252 |
+ start[1] == 2) {
|
|
|
1d3252 |
+ length2 = start[2] |
|
|
|
1d3252 |
+ (start[3] << 8) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 16) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 24);
|
|
|
1d3252 |
+ i = 0;
|
|
|
1d3252 |
+ } else {
|
|
|
1d3252 |
+ for (i = 0; i < 4; ++i) {
|
|
|
1d3252 |
+ writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
|
|
|
1d3252 |
+ writePSChar(hexChar[start[i] & 0x0f]);
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
}
|
|
|
1d3252 |
#if 0 // this causes trouble for various PostScript printers
|
|
|
1d3252 |
// if Length2 is incorrect (too small), font data gets chopped, so
|
|
|
1d3252 |
@@ -2193,8 +2212,32 @@ void PSOutputDev::setupEmbeddedType1Font
|
|
|
1d3252 |
{
|
|
|
1d3252 |
if (length3 > 0) {
|
|
|
1d3252 |
// write fixed-content portion
|
|
|
1d3252 |
- while ((c = strObj.streamGetChar()) != EOF) {
|
|
|
1d3252 |
- writePSChar(c);
|
|
|
1d3252 |
+ c = strObj.streamGetChar();
|
|
|
1d3252 |
+ if (c == 0x80) {
|
|
|
1d3252 |
+ c = strObj.streamGetChar();
|
|
|
1d3252 |
+ if (c == 1) {
|
|
|
1d3252 |
+ length3 = strObj.streamGetChar() |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 8) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 16) |
|
|
|
1d3252 |
+ (strObj.streamGetChar() << 24);
|
|
|
1d3252 |
+
|
|
|
1d3252 |
+ i = 0;
|
|
|
1d3252 |
+ while (i < length3) {
|
|
|
1d3252 |
+ if ((c = strObj.streamGetChar()) == EOF) {
|
|
|
1d3252 |
+ break;
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
+ writePSChar(c);
|
|
|
1d3252 |
+ ++i;
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
+ } else {
|
|
|
1d3252 |
+ if (c != EOF) {
|
|
|
1d3252 |
+ writePSChar(c);
|
|
|
1d3252 |
+
|
|
|
1d3252 |
+ while ((c = strObj.streamGetChar()) != EOF) {
|
|
|
1d3252 |
+ writePSChar(c);
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
+ }
|
|
|
1d3252 |
}
|
|
|
1d3252 |
} else {
|
|
|
1d3252 |
// write padding and "cleartomark"
|