summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/fitz/font.h4
-rw-r--r--source/fitz/font.c14
-rw-r--r--source/pdf/pdf-font.c22
3 files changed, 34 insertions, 6 deletions
diff --git a/include/mupdf/fitz/font.h b/include/mupdf/fitz/font.h
index 29a87f48..4bdd4caa 100644
--- a/include/mupdf/fitz/font.h
+++ b/include/mupdf/fitz/font.h
@@ -65,6 +65,10 @@ void fz_new_font_context(fz_context *ctx);
fz_font_context *fz_keep_font_context(fz_context *ctx);
void fz_drop_font_context(fz_context *ctx);
+typedef fz_buffer *(*fz_load_system_font_func)(fz_context *ctx, const char *name);
+void fz_install_load_system_font_func(fz_context *ctx, fz_load_system_font_func f);
+fz_buffer *fz_load_system_font(fz_context *ctx, const char *name);
+
fz_font *fz_new_type3_font(fz_context *ctx, char *name, const fz_matrix *matrix);
fz_font *fz_new_font_from_memory(fz_context *ctx, char *name, unsigned char *data, int len, int index, int use_glyph_bbox);
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);