diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2011-04-15 02:39:08 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2011-04-15 11:33:48 +0200 |
commit | 33a189cce63587e52d76bffadcd547a55818cf92 (patch) | |
tree | f2aed0a727cba285c034a1e775a5e5312fd33019 /pdf | |
parent | 064d416089b0742d0397c79e011742d3bece4817 (diff) | |
download | mupdf-33a189cce63587e52d76bffadcd547a55818cf92.tar.xz |
Use DroidSans.ttf as substitute font.
Diffstat (limited to 'pdf')
-rw-r--r-- | pdf/mupdf.h | 3 | ||||
-rw-r--r-- | pdf/pdf_font.c | 109 | ||||
-rw-r--r-- | pdf/pdf_fontfile.c | 41 |
3 files changed, 83 insertions, 70 deletions
diff --git a/pdf/mupdf.h b/pdf/mupdf.h index d9d6355d..30032798 100644 --- a/pdf/mupdf.h +++ b/pdf/mupdf.h @@ -388,7 +388,8 @@ fz_error pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref, char **strings int pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid); unsigned char *pdf_find_builtin_font(char *name, unsigned int *len); -unsigned char *pdf_find_builtin_cjk_font(int ros, int gothic, unsigned int *len); +unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len); +unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len); fz_error pdf_load_type3_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); fz_error pdf_load_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj); diff --git a/pdf/pdf_font.c b/pdf/pdf_font.c index fc3d42fe..d0a67b31 100644 --- a/pdf/pdf_font.c +++ b/pdf/pdf_font.c @@ -169,14 +169,12 @@ pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname) data = pdf_find_builtin_font(fontname, &len); if (!data) - return fz_throw("cannot find font: '%s'", fontname); + return fz_throw("cannot find builtin font: '%s'", fontname); error = fz_new_font_from_memory(&fontdesc->font, data, len, 0); if (error) return fz_rethrow(error, "cannot load freetype font from memory"); - fz_strlcpy(fontdesc->font->name, fontname, sizeof fontdesc->font->name); - if (!strcmp(fontname, "Symbol") || !strcmp(fontname, "ZapfDingbats")) fontdesc->flags |= PDF_FD_SYMBOLIC; @@ -184,13 +182,34 @@ pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname) } static fz_error -pdf_load_builtin_cjk_font(pdf_font_desc *fontdesc, int ros, int gothic) +pdf_load_substitute_font(pdf_font_desc *fontdesc, int mono, int serif, int bold, int italic) { fz_error error; unsigned char *data; unsigned int len; - data = pdf_find_builtin_cjk_font(ros, gothic, &len); + data = pdf_find_substitute_font(mono, serif, bold, italic, &len); + if (!data) + return fz_throw("cannot find substitute font"); + + error = fz_new_font_from_memory(&fontdesc->font, data, len, 0); + if (error) + return fz_rethrow(error, "cannot load freetype font from memory"); + + fontdesc->font->ft_substitute = 1; + fontdesc->font->ft_bold = bold; + fontdesc->font->ft_italic = italic; + return fz_okay; +} + +static fz_error +pdf_load_substitute_cjk_font(pdf_font_desc *fontdesc, int ros, int serif) +{ + fz_error error; + unsigned char *data; + unsigned int len; + + data = pdf_find_substitute_cjk_font(ros, serif, &len); if (!data) return fz_throw("cannot find builtin CJK font"); @@ -206,89 +225,43 @@ static fz_error pdf_load_system_font(pdf_font_desc *fontdesc, char *fontname, char *collection) { fz_error error; - char *name; - - int isbold = 0; - int isitalic = 0; - int isserif = 0; - int isscript = 0; - int isfixed = 0; + int bold = 0; + int italic = 0; + int serif = 0; + int mono = 0; if (strstr(fontname, "Bold")) - isbold = 1; + bold = 1; if (strstr(fontname, "Italic")) - isitalic = 1; + italic = 1; if (strstr(fontname, "Oblique")) - isitalic = 1; + italic = 1; if (fontdesc->flags & PDF_FD_FIXED_PITCH) - isfixed = 1; + mono = 1; if (fontdesc->flags & PDF_FD_SERIF) - isserif = 1; + serif = 1; if (fontdesc->flags & PDF_FD_ITALIC) - isitalic = 1; - if (fontdesc->flags & PDF_FD_SCRIPT) - isscript = 1; + italic = 1; if (fontdesc->flags & PDF_FD_FORCE_BOLD) - isbold = 1; + bold = 1; if (collection) { if (!strcmp(collection, "Adobe-CNS1")) - return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_CNS, !isserif); + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_CNS, serif); else if (!strcmp(collection, "Adobe-GB1")) - return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_GB, !isserif); + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_GB, serif); else if (!strcmp(collection, "Adobe-Japan1")) - return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_JAPAN, !isserif); - else if (!strcmp(collection, "Adobe-Japan2")) - return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_JAPAN, !isserif); + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_JAPAN, serif); else if (!strcmp(collection, "Adobe-Korea1")) - return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_KOREA, !isserif); + return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_KOREA, serif); return fz_throw("unknown cid collection: %s", collection); } - else if (isfixed) - { - if (isitalic) { - if (isbold) name = "Courier-BoldOblique"; - else name = "Courier-Oblique"; - } - else { - if (isbold) name = "Courier-Bold"; - else name = "Courier"; - } - } - - else if (isserif) - { - if (isitalic) { - if (isbold) name = "Times-BoldItalic"; - else name = "Times-Italic"; - } - else { - if (isbold) name = "Times-Bold"; - else name = "Times-Roman"; - } - } - - else - { - if (isitalic) { - if (isbold) name = "Helvetica-BoldOblique"; - else name = "Helvetica-Oblique"; - } - else { - if (isbold) name = "Helvetica-Bold"; - else name = "Helvetica"; - } - } - - error = pdf_load_builtin_font(fontdesc, name); + error = pdf_load_substitute_font(fontdesc, mono, serif, bold, italic); if (error) - return fz_throw("cannot load builtin substitute font: %s", name); - - /* it's a substitute font: override the metrics */ - fontdesc->font->ft_substitute = 1; + return fz_throw("cannot load substitute font"); return fz_okay; } diff --git a/pdf/pdf_fontfile.c b/pdf/pdf_fontfile.c index 59a30594..55f883f1 100644 --- a/pdf/pdf_fontfile.c +++ b/pdf/pdf_fontfile.c @@ -7,6 +7,10 @@ #include "../generated/font_base14.h" +#ifndef NODROIDFONT +#include "../generated/font_droid.h" +#endif + #ifndef NOCJKFONT #include "../generated/font_cjk.h" #endif @@ -83,7 +87,42 @@ pdf_find_builtin_font(char *name, unsigned int *len) } unsigned char * -pdf_find_builtin_cjk_font(int ros, int gothic, unsigned int *len) +pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len) +{ +#ifdef NODROIDFONT + if (mono) { + if (bold) { + if (italic) return pdf_find_builtin_font("Courier-BoldOblique", len); + else return pdf_find_builtin_font("Courier-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Courier-Oblique", len); + else return pdf_find_builtin_font("Courier", len); + } + } else if (serif) { + if (bold) { + if (italic) return pdf_find_builtin_font("Times-BoldItalic", len); + else return pdf_find_builtin_font("Times-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Times-Italic", len); + else return pdf_find_builtin_font("Times-Roman", len); + } + } else { + if (bold) { + if (italic) return pdf_find_builtin_font("Helvetica-BoldOblique", len); + else return pdf_find_builtin_font("Helvetica-Bold", len); + } else { + if (italic) return pdf_find_builtin_font("Helvetica-Oblique", len); + else return pdf_find_builtin_font("Helvetica", len); + } + } +#else + *len = sizeof pdf_font_DroidSans; + return (unsigned char*) pdf_font_DroidSans; +#endif +} + +unsigned char * +pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len) { #ifndef NOCJKFONT *len = sizeof pdf_font_DroidSansFallback; |