summaryrefslogtreecommitdiff
path: root/source/fitz/font.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-05-07 13:38:45 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-05-16 12:48:07 +0200
commitda46868e717a246b726d2baeece734d6e28e528c (patch)
treeb4d0316e6259aec68d0c02eab1ce1697e5fd4762 /source/fitz/font.c
parent4f4cae9812ea4e1f4d78ea8b90a46d8f20519883 (diff)
downloadmupdf-da46868e717a246b726d2baeece734d6e28e528c.tar.xz
Restore Emoji font.
The Noto symbol font has been split into two. The second symbol font only contains a subset of the emojis, so reinstate the real emoji font and add both symbol fonts to the fallback chain.
Diffstat (limited to 'source/fitz/font.c')
-rw-r--r--source/fitz/font.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/source/fitz/font.c b/source/fitz/font.c
index 2e5630bd..f4098c9f 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -230,7 +230,7 @@ struct fz_font_context_s
/* Cached fallback fonts */
struct { fz_font *serif, *sans; } fallback[256];
- fz_font *symbol;
+ fz_font *symbol1, *symbol2;
fz_font *emoji;
};
@@ -307,7 +307,8 @@ void fz_drop_font_context(fz_context *ctx)
fz_drop_font(ctx, ctx->font->fallback[i].serif);
fz_drop_font(ctx, ctx->font->fallback[i].sans);
}
- fz_drop_font(ctx, ctx->font->symbol);
+ fz_drop_font(ctx, ctx->font->symbol1);
+ fz_drop_font(ctx, ctx->font->symbol2);
fz_drop_font(ctx, ctx->font->emoji);
fz_free(ctx, ctx->font);
ctx->font = NULL;
@@ -418,20 +419,33 @@ fz_font *fz_load_fallback_font(fz_context *ctx, int script, int language, int se
return *fontp;
}
-fz_font *fz_load_fallback_symbol_font(fz_context *ctx)
+static fz_font *fz_load_fallback_symbol1_font(fz_context *ctx)
{
const unsigned char *data;
int size;
- if (!ctx->font->symbol)
+ if (!ctx->font->symbol1)
{
- data = fz_lookup_noto_symbol_font(ctx, &size);
+ data = fz_lookup_noto_symbol1_font(ctx, &size);
if (data)
- ctx->font->symbol = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
+ ctx->font->symbol1 = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
}
- return ctx->font->symbol;
+ return ctx->font->symbol1;
}
-fz_font *fz_load_fallback_emoji_font(fz_context *ctx)
+static fz_font *fz_load_fallback_symbol2_font(fz_context *ctx)
+{
+ const unsigned char *data;
+ int size;
+ if (!ctx->font->symbol2)
+ {
+ data = fz_lookup_noto_symbol2_font(ctx, &size);
+ if (data)
+ ctx->font->symbol2 = fz_new_font_from_memory(ctx, NULL, data, size, 0, 0);
+ }
+ return ctx->font->symbol2;
+}
+
+static fz_font *fz_load_fallback_emoji_font(fz_context *ctx)
{
const unsigned char *data;
int size;
@@ -1679,7 +1693,15 @@ fz_encode_character_with_fallback(fz_context *ctx, fz_font *user_font, int unico
}
#endif
- font = fz_load_fallback_symbol_font(ctx);
+ font = fz_load_fallback_symbol1_font(ctx);
+ if (font)
+ {
+ gid = fz_encode_character(ctx, font, unicode);
+ if (gid > 0)
+ return *out_font = font, gid;
+ }
+
+ font = fz_load_fallback_symbol2_font(ctx);
if (font)
{
gid = fz_encode_character(ctx, font, unicode);