diff options
author | Simon Bünzli <zeniko@gmail.com> | 2013-12-20 00:21:53 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2014-01-13 17:22:03 +0000 |
commit | 056a8de560419eedaf097703893c798284ebb0a2 (patch) | |
tree | 8313aee783ea9aaa55baa8eaac147ff061a5191e /source/fitz | |
parent | 51d9a5673e367f03677d9ec684ec0e79fe445dd1 (diff) | |
download | mupdf-056a8de560419eedaf097703893c798284ebb0a2.tar.xz |
Bug 694851: enhance fz_load_system_font
For SumatraPDF, the following changes are required:
* fz_load_system_font is called from pdf_load_builtin_font as well so
that Arial, Courier New, etc. can be loaded from the system instead
of their Nimbus replacements. In order to distinguish between calls
from pdf_load_builtin_font and pdf_load_substitute_font, an
is_substitute argument is added.
* fz_load_system_cjk_font is added and called from
pdf_load_substitute_cjk_font so that a better replacement font can
be loaded instead of DroidSansFallback.
* Both fz_load_system_font and fz_load_system_cjk_font return fz_font*
instead of fz_buffer* so that implementers aren't required to load
fonts into memory (SumatraPDF uses fz_new_font_from_file for system
fonts).
In addition to that, fz_load_system_font_func is renamed to
fz_load_system_font_funcs since it now accepts two functions, and the
PDF_ROS_* constants are renamed to FZ_ADOBE_* (collection names aren't
passed as const char* so that implementers know which collections to
expect). For convenience, fz_load_*_font also never throws since
currently all callers have further fallbacks available.
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/font.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/source/fitz/font.c b/source/fitz/font.c index b1ba1b02..6027164c 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -188,6 +188,7 @@ struct fz_font_context_s { FT_Library ftlib; int ftlib_refs; fz_load_system_font_func load_font; + fz_load_system_cjk_font_func load_cjk_font; }; #undef __FTERRORS_H__ @@ -233,16 +234,48 @@ void fz_drop_font_context(fz_context *ctx) fz_free(ctx, ctx->font); } -void fz_install_load_system_font_func(fz_context *ctx, fz_load_system_font_func f) +void fz_install_load_system_font_funcs(fz_context *ctx, fz_load_system_font_func f, fz_load_system_cjk_font_func f_cjk) { ctx->font->load_font = f; + ctx->font->load_cjk_font = f_cjk; } -fz_buffer *fz_load_system_font(fz_context *ctx, const char *name) +fz_font *fz_load_system_font(fz_context *ctx, const char *name, int is_substitute) { + fz_font *font = NULL; + if (ctx->font->load_font) - return ctx->font->load_font(ctx, name); - return NULL; + { + fz_try(ctx) + { + font = ctx->font->load_font(ctx, name, is_substitute); + } + fz_catch(ctx) + { + font = NULL; + } + } + + return font; +} + +fz_font *fz_load_system_cjk_font(fz_context *ctx, const char *name, int ros, int serif) +{ + fz_font *font = NULL; + + if (ctx->font->load_cjk_font) + { + fz_try(ctx) + { + font = ctx->font->load_cjk_font(ctx, name, ros, serif); + } + fz_catch(ctx) + { + font = NULL; + } + } + + return font; } static const struct ft_error ft_errors[] = |