summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/fitz/font.h46
-rw-r--r--source/fitz/font.c50
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)