diff --git a/fonts/Makefile b/fonts/Makefile index b5a918a..b747af4 100644 --- a/fonts/Makefile +++ b/fonts/Makefile @@ -43,24 +43,26 @@ FONTS = \ Helvetica-Bold \ Helvetica-BoldOblique \ Helvetica-Oblique \ - Monospace \ - Monospace-Bold \ - Monospace-BoldOblique \ - Monospace-Oblique \ - Sans \ - Sans-Bold \ - Sans-BoldOblique \ - Sans-Oblique \ - Serif-Roman \ - Serif-Bold \ - Serif-BoldOblique \ - Serif-Oblique \ Symbol \ Times-Bold \ Times-BoldItalic \ Times-Italic \ Times-Roman +TTF_FONTS = \ + DejaVuSansMono \ + DejaVuSansMono-Bold \ + DejaVuSansMono-BoldOblique \ + DejaVuSansMono-Oblique \ + DejaVuSans \ + DejaVuSans-Oblique \ + DejaVuSans-Bold \ + DejaVuSans-BoldOblique \ + DejaVuSerif \ + DejaVuSerif-Bold \ + DejaVuSerif-Italic \ + DejaVuSerif-BoldItalic + # # Make everything... @@ -79,10 +81,12 @@ install: $(MKDIR) $(datadir)/htmldoc/fonts;\ fi for font in $(FONTS); do \ - $(CP) $$font.afm $(datadir)/htmldoc/fonts; \ - $(CP) $$font.pfa $(datadir)/htmldoc/fonts; \ + $(CP) -a $$font.afm $(datadir)/htmldoc/fonts; \ + $(CP) -a $$font.pfb $(datadir)/htmldoc/fonts; \ + done + for font in $(TTF_FONTS); do \ + $(CP) -a $$font.ttf $(datadir)/htmldoc/fonts; \ done - $(CHMOD) ugo+r $(datadir)/htmldoc/fonts/* # diff --git a/htmldoc/htmllib.cxx b/htmldoc/htmllib.cxx index 7281964..57ddd08 100644 --- a/htmldoc/htmllib.cxx +++ b/htmldoc/htmllib.cxx @@ -212,22 +212,22 @@ const char *_htmlFonts[TYPE_MAX][STYLE_MAX] = "Helvetica-BoldOblique" }, { - "Monospace", - "Monospace-Bold", - "Monospace-Oblique", - "Monospace-BoldOblique" + "DejaVuSansMono", + "DejaVuSansMono-Bold", + "DejaVuSansMono-Oblique", + "DejaVuSansMono-BoldOblique" }, { - "Serif-Roman", - "Serif-Bold", - "Serif-Oblique", - "Serif-BoldOblique" + "DejaVuSerif", + "DejaVuSerif-Bold", + "DejaVuSerif-Italic", + "DejaVuSerif-BoldItalic" }, { - "Sans", - "Sans-Bold", - "Sans-Oblique", - "Sans-BoldOblique" + "DejaVuSans", + "DejaVuSans-Bold", + "DejaVuSans-Oblique", + "DejaVuSans-BoldOblique" }, { "Symbol", @@ -2104,7 +2104,8 @@ htmlLoadFontWidths(void) float width; /* Width value */ char glyph[64]; /* Glyph name */ char line[1024]; /* Line from AFM file */ - + int used_popen; /* Did we popen? */ + char popen_command[2048]; /* Argument to popen */ /* * Now read all of the font widths... @@ -2118,8 +2119,22 @@ htmlLoadFontWidths(void) snprintf(filename, sizeof(filename), "%s/fonts/%s.afm", _htmlData, _htmlFonts[i][j]); + used_popen = 0; if ((fp = fopen(filename, "r")) == NULL) { + /* + * Try opening as ttf + */ + + snprintf(filename, sizeof(filename), "%s/fonts/%s.ttf", _htmlData, + _htmlFonts[i][j]); + snprintf(popen_command, sizeof(popen_command), + "ttf2pt1 '%s' -G A - 2> /dev/null", filename); + used_popen = 1; + fp = popen(popen_command, "r"); + } + if (fp == NULL) + { #ifndef DEBUG progress_error(HD_ERROR_FILE_NOT_FOUND, "Unable to open font width file %s!", filename); @@ -2160,7 +2175,14 @@ htmlLoadFontWidths(void) } } - fclose(fp); + if (used_popen) + { + pclose(fp); + } + else + { + fclose(fp); + } // Make sure that non-breaking space has the same width as // a breaking space... diff --git a/htmldoc/ps-pdf.cxx b/htmldoc/ps-pdf.cxx index 0bc8271..9cfae68 100644 --- a/htmldoc/ps-pdf.cxx +++ b/htmldoc/ps-pdf.cxx @@ -471,6 +471,10 @@ static void write_trailer(FILE *out, int pages); static int write_type1(FILE *out, typeface_t typeface, style_t style); static void write_utf16(FILE *out, uchar *s); +static FILE *open_afm_file(char *name); +static FILE *open_pfa_file(char *name); +static FILE *tmpfile_from_popen(char *command); + /* @@ -12336,10 +12340,9 @@ write_type1(FILE *out, /* I - File to write to */ /* * Try to open the PFA file for the Type1 font... */ - - snprintf(filename, sizeof(filename), "%s/fonts/%s.pfa", _htmlData, + snprintf(filename, sizeof(filename), "%s/fonts/%s", _htmlData, _htmlFonts[typeface][style]); - if ((fp = fopen(filename, "r")) == NULL) + if ((fp = open_pfa_file(filename)) == NULL) { #ifndef DEBUG progress_error(HD_ERROR_FILE_NOT_FOUND, @@ -12457,9 +12460,9 @@ write_type1(FILE *out, /* I - File to write to */ * Try to open the AFM file for the Type1 font... */ - snprintf(filename, sizeof(filename), "%s/fonts/%s.afm", _htmlData, + snprintf(filename, sizeof(filename), "%s/fonts/%s", _htmlData, _htmlFonts[typeface][style]); - if ((fp = fopen(filename, "r")) == NULL) + if ((fp = open_afm_file(filename)) == NULL) { #ifndef DEBUG progress_error(HD_ERROR_FILE_NOT_FOUND, @@ -12577,6 +12580,113 @@ write_type1(FILE *out, /* I - File to write to */ /* + * 'open_afm_file()' - Get a seekable AFM file either directly or otherwise + */ + +static FILE * // O - AFM file +open_afm_file(char *name) // I - Font filename without extension +{ + + char filename[1024]; /* AFM filename */ + char popen_command[2048]; /* Argument to popen */ + FILE *fp; /* The file */ + + /* + * First try AFM + */ + snprintf(filename, sizeof(filename), "%s.afm", name); + fp = fopen(filename, "r"); + + /* + * Then try TTF + */ + if (fp == NULL) + { + snprintf(filename, sizeof(filename), "%s.ttf", name); + snprintf(popen_command, sizeof(popen_command), + "ttf2pt1 '%s' -G A - 2> /dev/null", filename); + fp = tmpfile_from_popen(popen_command); + } + + return (fp); +} + +/* + * 'open_pfa_file()' - Get a seekable PFA file from PFB or TTF + */ + +static FILE * // O - PFA file +open_pfa_file(char *name) // I - Font filename without extension +{ + + char filename[1024]; /* PFA filename */ + char popen_command[2048]; /* Argument to popen */ + FILE *fp; /* The file */ + + /* + * First try PFB + */ + snprintf(filename, sizeof(filename), "%s.pfb", name); + if (access(filename, F_OK) == 0) + { + snprintf(popen_command, sizeof(popen_command), + "t1ascii '%s' -l 60", filename); + fp = tmpfile_from_popen(popen_command); + } + else + { + /* + * Then try TTF + */ + snprintf(filename, sizeof(filename), "%s.ttf", name); + snprintf(popen_command, sizeof(popen_command), + "ttf2pt1 '%s' -G F - 2> /dev/null | t1asm -a -l 60", filename); + fp = tmpfile_from_popen(popen_command); + } + + return (fp); +} + +/* + * 'tmpfile_from_popen()' - Generate a temporary text file from popen + */ + +static FILE * // O - Output file +tmpfile_from_popen(char *command) // I - Command for popen +{ + + FILE *fp; /* file */ + FILE *pfp; /* popen file */ + char line[1024]; /* Line from file */ + + pfp = popen(command, "r"); + + if (pfp == NULL) + return (NULL); + + /* + * Open a temporary file to hold the result + */ + fp = tmpfile(); + if (fp == NULL) { + pclose(pfp); + return (NULL); + } + + while (fgets(line, sizeof(line), pfp) != NULL) + fputs(line, fp); + + if (line[strlen(line) - 1] != '\n') + fputs("\n", fp); + + rewind(fp); + + pclose(pfp); + + return (fp); +} + +/* * 'write_utf16()' - Write a UTF-16 string... */