From 0437b898ca6ae954e0f4127271da3d37b96af886 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Tue, 13 Jun 2023 00:25:49 -0700 Subject: [PATCH] Allow primary & fallback locale fonts to be specified e.g., for Chinese Traditional, try to use the full font (that we supply as an optional download), then try the 'subset' font that we ship with Tux Paint. --- src/fonts.c | 33 ++++++++++++++++++--------------- src/fonts.h | 3 ++- src/tuxpaint.c | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/fonts.c b/src/fonts.c index ff02eb991..26afe5f15 100644 --- a/src/fonts.c +++ b/src/fonts.c @@ -174,24 +174,27 @@ static void reliable_read(int fd, void *buf, size_t count); #endif const char * PANGO_DEFAULT_FONT = "DejaVu Sans"; +const char * PANGO_DEFAULT_FONT_FALLBACK = NULL; -/* Names of the fonts we include in `fonts/locale/` */ +/* Names of the fonts we include in `fonts/locale/` + (LANG_* codes are from `src/i18n.h`) */ // (Try `otfinfo --info fonts/locale/*.ttf | grep "Full name:"`) default_locale_font_t default_local_fonts[] = { - { LANG_AR, "ae_Nice" }, - { LANG_BO, "Tsampa Keyboard" }, // NOTE: Our current translation is Wylie transliterated, not Unicode! */ - { LANG_EL, "Thryomanes" }, - { LANG_GU, "Lohit Gujarati" }, - { LANG_HE, "Nachlieli Light" }, - { LANG_HI, "Raghindi" }, - { LANG_JA, "GJGothicPNSubset" }, - { LANG_KA, "TuxPaint Georgian" }, - { LANG_KO, "Baekmuk Gulim" }, - { LANG_TA, "TSCu_Comic" }, - { LANG_TE, "Vemana2000" }, - { LANG_TH, "Garuda" }, - { LANG_ZH_TW, "SubsetForTuxPaint" }, - { -1, NULL }, + { LANG_AR, "ae_Nice", NULL }, + { LANG_BO, "Tsampa Keyboard", NULL }, // NOTE: Our current translation is Wylie transliterated, not Unicode! */ + { LANG_EL, "Thryomanes", NULL}, + { LANG_GU, "Lohit Gujarati", NULL }, + { LANG_HE, "Nachlieli Light", NULL }, + { LANG_HI, "Raghindi", NULL }, + { LANG_JA, "Gen Jyuu Gothic P Regular", "GJGothicPNSubset" }, + { LANG_KA, "TuxPaint Georgian", NULL }, /* FIXME: Upon what is this font based? Never knew -bjk 2023.06.12 */ + { LANG_KO, "Baekmuk Gulim", NULL }, + { LANG_TA, "TSCu_Comic", NULL }, + { LANG_TE, "Vemana2000", NULL }, + { LANG_TH, "Garuda", NULL }, + { LANG_ZH_CN, "AR PL SungtiL GB", NULL }, + { LANG_ZH_TW, "HanWangKaiMediumChuIn", "SubsetForTuxPaint" }, + { -1, NULL, NULL }, }; void TuxPaint_Font_CloseFont(TuxPaint_Font * tpf) diff --git a/src/fonts.h b/src/fonts.h index 2cb34c2a8..f369fb32e 100644 --- a/src/fonts.h +++ b/src/fonts.h @@ -52,10 +52,11 @@ typedef struct default_locale_font_s { int locale_id; const char * font_name; + const char * font_name_fallback; } default_locale_font_t; extern default_locale_font_t default_local_fonts[]; -extern const char * PANGO_DEFAULT_FONT; +extern const char * PANGO_DEFAULT_FONT, * PANGO_DEFAULT_FONT_FALLBACK; #include "compiler.h" diff --git a/src/tuxpaint.c b/src/tuxpaint.c index c32df042d..790da62e4 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -27926,6 +27926,7 @@ static void setup_config(char *argv[]) { char str[128]; char *picturesdir; + char *tp_ui_font_fallback; int i; #if !defined(_WIN32) && !defined(__ANDROID__) @@ -28104,14 +28105,18 @@ static void setup_config(char *argv[]) button_label_y_nudge = setup_i18n(tmpcfg.parsertmp_lang, tmpcfg.parsertmp_locale, &num_wished_langs); /* Determine the referred font for the current locale */ + PANGO_DEFAULT_FONT_FALLBACK = NULL; for (i = 0; default_local_fonts[i].locale_id != -1; i++) { if (default_local_fonts[i].locale_id == get_current_language()) { PANGO_DEFAULT_FONT = default_local_fonts[i].font_name; + PANGO_DEFAULT_FONT_FALLBACK = default_local_fonts[i].font_name_fallback; } } + tp_ui_font_fallback = NULL; + if (tmpcfg.tp_ui_font) { char * tmp_str; @@ -28122,6 +28127,10 @@ static void setup_config(char *argv[]) { printf/*DEBUG_PRINTF*/("Requested default UI font, \"%s\"\n", PANGO_DEFAULT_FONT); tp_ui_font = strdup(PANGO_DEFAULT_FONT); + if (PANGO_DEFAULT_FONT_FALLBACK != NULL) + { + tp_ui_font_fallback = strdup(PANGO_DEFAULT_FONT_FALLBACK); + } } else { @@ -28162,6 +28171,19 @@ static void setup_config(char *argv[]) tmp_str = ask_pango_for_font(tp_ui_font); if (tmp_str != NULL) { + if (strcmp(tp_ui_font, tmp_str) != 0 && tp_ui_font_fallback != NULL) + { + free(tp_ui_font); + tp_ui_font = strdup(tp_ui_font_fallback); + tp_ui_font_fallback = NULL; + + printf/*DEBUG_PRINTF*/("Requested fallback default UI font, \"%s\"\n", tp_ui_font); + tmp_str = ask_pango_for_font(tp_ui_font); + } + } + + if (tmp_str != NULL) + { printf("Actual UI font will be \"%s\"\n", tmp_str); free(tmp_str); }