diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-05-07 13:38:45 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2018-05-16 12:48:07 +0200 |
commit | da46868e717a246b726d2baeece734d6e28e528c (patch) | |
tree | b4d0316e6259aec68d0c02eab1ce1697e5fd4762 /source/fitz/font.c | |
parent | 4f4cae9812ea4e1f4d78ea8b90a46d8f20519883 (diff) | |
download | mupdf-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.c | 40 |
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); |