root/root-type1-embed.patch
Mattias Ellert fda3bc6d17 Update to 5.34.32
- New sub-package: root-fonts (STIX version 0.9 required by TMathText)
- Use GNU Free instead of Liberation, works better with TMathText
- Fix segfault when embedding Type 1 fonts
- Drop patch root-no-extra-formats.patch (workaround for above problem)
2015-07-03 16:51:58 +02:00

93 lines
3.3 KiB
Diff

diff -ur root-5.34.32.orig/graf2d/mathtext/src/fontembedps.cxx root-5.34.32/graf2d/mathtext/src/fontembedps.cxx
--- root-5.34.32.orig/graf2d/mathtext/src/fontembedps.cxx 2015-06-23 17:56:20.000000000 +0200
+++ root-5.34.32/graf2d/mathtext/src/fontembedps.cxx 2015-07-02 09:10:36.740969892 +0200
@@ -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:
//
@@ -225,27 +225,25 @@
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 = 2;
+ size_t offset = 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];
- memcpy(&segment_header.length, &font_data[offset + 2],
- sizeof(unsigned int));
- offset += sizeof(unsigned int) + 2;
+
while (segment_header.type != TYPE_EOF) {
-#ifdef LITTLE_ENDIAN
+ memcpy(&segment_header.length, &font_data[offset + 2],
+ sizeof(unsigned int));
+ offset += sizeof(unsigned int) + 2;
+#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);
@@ -265,6 +263,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(
@@ -276,6 +294,9 @@
}
delete [] buffer;
+
+ segment_header.always_128 = font_data[offset];
+ segment_header.type = font_data[offset + 1];
}
return ret;