iucar / rpms / root

Forked from rpms/root 3 years ago
Clone
Blob Blame History Raw
diff -ur root-6.06.02.orig/graf2d/mathtext/src/fontembedps.cxx root-6.06.02/graf2d/mathtext/src/fontembedps.cxx
--- root-6.06.02.orig/graf2d/mathtext/src/fontembedps.cxx	2016-03-03 10:36:03.000000000 +0100
+++ root-6.06.02/graf2d/mathtext/src/fontembedps.cxx	2016-03-20 14:52:11.268005800 +0100
@@ -30,14 +30,14 @@
 #ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN 1
 #endif // LITTLE_ENDIAN
-#include "Byteswap.h"
-#define bswap_16(x)   Rbswap_16((x))
-#define bswap_32(x)   Rbswap_32((x))
 #else // R__BYTESWAP
 #ifdef LITTLE_ENDIAN
 #undef LITTLE_ENDIAN
 #endif // LITTLE_ENDIAN
 #endif // R__BYTESWAP
+#include "Byteswap.h"
+#define bswap_16(x)   Rbswap_16((x))
+#define bswap_32(x)   Rbswap_32((x))
 
 // References:
 //
@@ -236,29 +236,26 @@
       if(magic_number[0] == '\200') {
          // IBM PC format printer font binary
 
-         // FIXME: Maybe the real name can be parsed out of the
-         // file
-         font_name = "";
-
          struct pfb_segment_header_s segment_header;
          size_t offset = 0;
 
-         segment_header.type = 0;
+         // The two char elements of struct
+         // pfb_segment_header_s are most likely aligned to
+         // larger than 1 byte boundaries, so copy all the
+         // elements individually
+         segment_header.always_128 = font_data[offset];
+         segment_header.type = font_data[offset + 1];
+
          while (segment_header.type != TYPE_EOF) {
-            // The two char elements of struct
-            // pfb_segment_header_s are most likely aligned to
-            // larger than 1 byte boundaries, so copy all the
-            // elements individually
-            segment_header.always_128 = font_data[offset];
-            segment_header.type = font_data[offset + 1];
             memcpy(&segment_header.length, &font_data[offset + 2],
                    sizeof(unsigned int));
             offset += sizeof(unsigned int) + 2;
-#ifdef LITTLE_ENDIAN
+#ifndef LITTLE_ENDIAN
             segment_header.length =
             bswap_32(segment_header.length);
 #endif // LITTLE_ENDIAN
             char *buffer = new char[segment_header.length];
+            char *fname;
 
             memcpy(buffer, &font_data[offset],
                    segment_header.length);
@@ -278,6 +275,26 @@
                      buffer[segment_header.length - 1] = '\n';
                   }
                   ret.append(buffer, segment_header.length);
+
+                  fname = (char*)memmem(buffer, segment_header.length,
+                                        "/FontName", 9);
+                  if (fname) {
+                     fname += 9;
+                     while (fname < buffer + segment_header.length &&
+                            isspace(*fname)) {
+                        fname++;
+                     }
+                     if (fname < buffer + segment_header.length &&
+                         *fname == '/') {
+                        fname++;
+                     }
+                     int len = 0;
+                     while (fname + len < buffer + segment_header.length &&
+                            isgraph(*(fname + len))) {
+                        len++;
+                     }
+                     font_name.assign(fname, len);
+                  }
                   break;
                case TYPE_BINARY:
                   append_asciihex(
@@ -289,6 +306,9 @@
             }
 
             delete [] buffer;
+
+            segment_header.always_128 = font_data[offset];
+            segment_header.type = font_data[offset + 1];
          }
 
          return ret;