From 7570e7fa8a40cb41db6a1ab14b225cf00c4f56f5 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 11 Nov 2013 14:37:16 +0100 Subject: Add hooks to load system fonts. Use them in PDF interpreter. --- source/fitz/font.c | 14 ++++++++++++++ source/pdf/pdf-font.c | 22 ++++++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/fitz/font.c b/source/fitz/font.c index d78ccd6d..d201f441 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -185,6 +185,7 @@ struct fz_font_context_s { int ctx_refs; FT_Library ftlib; int ftlib_refs; + fz_load_system_font_func load_font; }; #undef __FTERRORS_H__ @@ -204,6 +205,7 @@ void fz_new_font_context(fz_context *ctx) ctx->font->ctx_refs = 1; ctx->font->ftlib = NULL; ctx->font->ftlib_refs = 0; + ctx->font->load_font = NULL; } fz_font_context * @@ -229,6 +231,18 @@ 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) +{ + ctx->font->load_font = f; +} + +fz_buffer *fz_load_system_font(fz_context *ctx, const char *name) +{ + if (ctx->font->load_font) + return ctx->font->load_font(ctx, name); + return NULL; +} + static const struct ft_error ft_errors[] = { #include FT_ERRORS_H diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c index 78ee7f18..638b5b35 100644 --- a/source/pdf/pdf-font.c +++ b/source/pdf/pdf-font.c @@ -198,14 +198,24 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname) static void pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname, int mono, int serif, int bold, int italic) { - unsigned char *data; - unsigned int len; + fz_buffer *buffer; - data = pdf_lookup_substitute_font(mono, serif, bold, italic, &len); - if (!data) - fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font"); + buffer = fz_load_system_font(ctx, fontname); + if (buffer) + { + fontdesc->font = fz_new_font_from_buffer(ctx, fontname, buffer, 0, 1); + } + else + { + unsigned char *data; + unsigned int len; - fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1); + data = pdf_lookup_substitute_font(mono, serif, bold, italic, &len); + if (!data) + fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font"); + + fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1); + } fontdesc->font->ft_substitute = 1; fontdesc->font->ft_bold = bold && !ft_is_bold(fontdesc->font->ft_face); -- cgit v1.2.3