diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-01-20 16:21:17 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-01-20 16:28:41 +0100 |
commit | ad6807ba2a3fbd1c276ad5797a27ec771aeaf59b (patch) | |
tree | 684137a635e4d3a3812d53daf10f29e1ef8652ac | |
parent | 065036c63146c85c45253e48137612ede9451958 (diff) | |
download | mupdf-ad6807ba2a3fbd1c276ad5797a27ec771aeaf59b.tar.xz |
Add system fallback font callback.
-rw-r--r-- | include/mupdf/fitz/font.h | 46 | ||||
-rw-r--r-- | source/fitz/font.c | 50 |
2 files changed, 57 insertions, 39 deletions
diff --git a/include/mupdf/fitz/font.h b/include/mupdf/fitz/font.h index c453e085..7bd36629 100644 --- a/include/mupdf/fitz/font.h +++ b/include/mupdf/fitz/font.h @@ -136,48 +136,50 @@ const char *fz_font_name(fz_context *ctx, fz_font *font); fz_rect *fz_font_bbox(fz_context *ctx, fz_font *font); /* - fz_load_system_font_func: Type for user supplied system - font loading hook. + fz_load_system_font_fn: Type for user supplied system font loading hook. name: The name of the font to load. - bold: 1 if a bold font desired, 0 otherwise. - italic: 1 if an italic font desired, 0 otherwise. + needs_exact_metrics: 1 if an exact metric match is required for the font requested. - needs_exact_metrics: 1 if an exact metric match is required - for the font requested. - - Returns a new font handle, or NULL if no font found (or on - error). + Returns a new font handle, or NULL if no font found (or on error). */ -typedef fz_font *(*fz_load_system_font_func)(fz_context *ctx, const char *name, int bold, int italic, int needs_exact_metrics); +typedef fz_font *(*fz_load_system_font_fn)(fz_context *ctx, const char *name, int bold, int italic, int needs_exact_metrics); /* - fz_load_system_cjk_font_func: Type for user supplied cjk - font loading hook. + fz_load_system_cjk_font_fn: Type for user supplied cjk font loading hook. name: The name of the font to load. + ros: The registry from which to load the font (e.g. FZ_ADOBE_KOREA_1) + serif: 1 if a serif font is desired, 0 otherwise. - ros: The registry from which to load the font (e.g. - FZ_ADOBE_KOREA_1) + Returns a new font handle, or NULL if no font found (or on error). +*/ +typedef fz_font *(*fz_load_system_cjk_font_fn)(fz_context *ctx, const char *name, int ros, int serif); - serif: 1 if a serif font is desired, 0 otherwise. +/* + fz_load_system_fallback_font_fn: Type for user supplied fallback font loading hook. - Returns a new font handle, or NULL if no font found (or on - error). + name: The name of the font to load. + script: UCDN script enum. + language: FZ_LANG enum. + serif, bold, italic: boolean style flags. + + Returns a new font handle, or NULL if no font found (or on error). */ -typedef fz_font *(*fz_load_system_cjk_font_func)(fz_context *ctx, const char *name, int ros, int serif); +typedef fz_font *(*fz_load_system_fallback_font_fn)(fz_context *ctx, int script, int language, int serif, int bold, int italic); /* - fz_install_load_system_font_funcs: Install functions to allow + fz_install_load_system_font_fn: Install functions to allow MuPDF to request fonts from the system. - f, f_cjk: The hooks to use. - Only one set of hooks can be in use at a time. */ -void fz_install_load_system_font_funcs(fz_context *ctx, fz_load_system_font_func f, fz_load_system_cjk_font_func f_cjk); +void fz_install_load_system_font_funcs(fz_context *ctx, + fz_load_system_font_fn f, + fz_load_system_cjk_font_fn f_cjk, + fz_load_system_fallback_font_fn f_fallback); /* fz_load_*_font returns NULL if no font could be loaded (also on error) */ /* diff --git a/source/fitz/font.c b/source/fitz/font.c index 4e30579f..cdab6081 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -194,8 +194,9 @@ struct fz_font_context_s int ctx_refs; FT_Library ftlib; int ftlib_refs; - fz_load_system_font_func load_font; - fz_load_system_cjk_font_func load_cjk_font; + fz_load_system_font_fn load_font; + fz_load_system_cjk_font_fn load_cjk_font; + fz_load_system_fallback_font_fn load_fallback_font; /* Cached fallback fonts */ struct { fz_font *serif, *sans; } fallback[256]; @@ -252,10 +253,14 @@ void fz_drop_font_context(fz_context *ctx) } } -void fz_install_load_system_font_funcs(fz_context *ctx, fz_load_system_font_func f, fz_load_system_cjk_font_func f_cjk) +void fz_install_load_system_font_funcs(fz_context *ctx, + fz_load_system_font_fn f, + fz_load_system_cjk_font_fn f_cjk, + fz_load_system_fallback_font_fn f_back) { ctx->font->load_font = f; ctx->font->load_cjk_font = f_cjk; + ctx->font->load_fallback_font = f_back; } fz_font *fz_load_system_font(fz_context *ctx, const char *name, int bold, int italic, int needs_exact_metrics) @@ -265,13 +270,9 @@ fz_font *fz_load_system_font(fz_context *ctx, const char *name, int bold, int it if (ctx->font->load_font) { fz_try(ctx) - { font = ctx->font->load_font(ctx, name, bold, italic, needs_exact_metrics); - } fz_catch(ctx) - { font = NULL; - } } return font; @@ -284,13 +285,24 @@ fz_font *fz_load_system_cjk_font(fz_context *ctx, const char *name, int ros, int 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; +} + +fz_font *fz_load_system_fallback_font(fz_context *ctx, int script, int language, int serif, int bold, int italic) +{ + fz_font *font = NULL; + + if (ctx->font->load_fallback_font) + { + fz_try(ctx) + font = ctx->font->load_fallback_font(ctx, script, language, serif, bold, italic); + fz_catch(ctx) + font = NULL; } return font; @@ -298,6 +310,7 @@ fz_font *fz_load_system_cjk_font(fz_context *ctx, const char *name, int ros, int fz_font *fz_load_fallback_font(fz_context *ctx, int script, int language, int serif, int bold, int italic) { + fz_font *font; const char *data; int index; int size; @@ -338,14 +351,17 @@ fz_font *fz_load_fallback_font(fz_context *ctx, int script, int language, int se if (ctx->font->fallback[index].sans) return ctx->font->fallback[index].sans; - data = fz_lookup_noto_font(ctx, script, language, 0, &size); - if (data) + + font = fz_load_system_fallback_font(ctx, script, language, serif, bold, italic); + if (!font) { - ctx->font->fallback[index].sans = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0); - return ctx->font->fallback[index].sans; + data = fz_lookup_noto_font(ctx, script, language, 0, &size); + if (data) + font = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0); } - - return NULL; + if (font) + ctx->font->fallback[index].sans = font; + return font; } fz_font *fz_load_fallback_symbol_font(fz_context *ctx) |