From f472e4d0def18620ae9c0fca7a3cab9f9bcde8ad Mon Sep 17 00:00:00 2001
From: LibretroAdmin <reallibretroretroarch@gmail.com>
Date: Mon, 1 Aug 2022 02:07:36 +0200
Subject: [PATCH] (gfx_widgets) Call fill_pathname_application_special outside
 of hot functions (gfx widgets) Pre-assemble and store paths that are not
 subject to change

---
 gfx/gfx_widgets.c    | 104 ++++++++++++++++++++++---------------------
 gfx/gfx_widgets.h    |   8 ++++
 menu/drivers/ozone.c |   9 ++--
 3 files changed, 65 insertions(+), 56 deletions(-)

diff --git a/gfx/gfx_widgets.c b/gfx/gfx_widgets.c
index 8df7196b81..b04519ce21 100644
--- a/gfx/gfx_widgets.c
+++ b/gfx/gfx_widgets.c
@@ -795,44 +795,33 @@ static void gfx_widgets_layout(
    /* Initialise fonts */
    if (string_is_empty(font_path))
    {
-      char ozone_path[PATH_MAX_LENGTH];
       char font_file[PATH_MAX_LENGTH];
-      /* Base path */
-      fill_pathname_join(ozone_path, dir_assets, "ozone", sizeof(ozone_path));
       /* Create regular font */
-      fill_pathname_join(font_file, ozone_path, "regular.ttf", sizeof(font_file));
       gfx_widgets_font_init(p_disp, p_dispwidget,
             &p_dispwidget->gfx_widget_fonts.regular,
-            is_threaded, font_file, BASE_FONT_SIZE);
-
+            is_threaded, p_dispwidget->ozone_regular_font_path, BASE_FONT_SIZE);
       /* Create bold font */
-      fill_pathname_join(font_file, ozone_path, "bold.ttf", sizeof(font_file));
       gfx_widgets_font_init(p_disp, p_dispwidget,
             &p_dispwidget->gfx_widget_fonts.bold,
-            is_threaded, font_file, BASE_FONT_SIZE);
+            is_threaded, p_dispwidget->ozone_bold_font_path, BASE_FONT_SIZE);
 
       /* Create msg_queue font */
       switch (*msg_hash_get_uint(MSG_HASH_USER_LANGUAGE))
       {
          case RETRO_LANGUAGE_ARABIC:
          case RETRO_LANGUAGE_PERSIAN:
-            fill_pathname_application_special(font_file, sizeof(font_file),
-                  APPLICATION_SPECIAL_DIRECTORY_ASSETS_PKG);
-            fill_pathname_join(font_file, font_file, "fallback-font.ttf", sizeof(font_file));
+            fill_pathname_join(font_file, p_dispwidget->assets_pkg_dir, "fallback-font.ttf", sizeof(font_file));
             break;
          case RETRO_LANGUAGE_CHINESE_SIMPLIFIED:
          case RETRO_LANGUAGE_CHINESE_TRADITIONAL:
-            fill_pathname_application_special(font_file, sizeof(font_file),
-                  APPLICATION_SPECIAL_DIRECTORY_ASSETS_PKG);
-            fill_pathname_join(font_file, font_file, "chinese-fallback-font.ttf", sizeof(font_file));
+            fill_pathname_join(font_file, p_dispwidget->assets_pkg_dir, "chinese-fallback-font.ttf", sizeof(font_file));
             break;
          case RETRO_LANGUAGE_KOREAN:
-            fill_pathname_application_special(font_file, sizeof(font_file),
-                  APPLICATION_SPECIAL_DIRECTORY_ASSETS_PKG);
-            fill_pathname_join(font_file, font_file, "korean-fallback-font.ttf", sizeof(font_file));
+            fill_pathname_join(font_file, p_dispwidget->assets_pkg_dir, "korean-fallback-font.ttf", sizeof(font_file));
             break;
          default:
-            fill_pathname_join(font_file, ozone_path, "regular.ttf", sizeof(font_file));
+            strlcpy(font_file, p_dispwidget->ozone_regular_font_path, sizeof(font_file));
+            break;
       }
       gfx_widgets_font_init(p_disp, p_dispwidget,
             &p_dispwidget->gfx_widget_fonts.msg_queue,
@@ -1890,34 +1879,6 @@ static void gfx_widgets_context_reset(
       const char *dir_assets, char *font_path)
 {
    size_t i;
-   char xmb_path[PATH_MAX_LENGTH];
-   char monochrome_png_path[PATH_MAX_LENGTH];
-   char gfx_widgets_path[PATH_MAX_LENGTH];
-   char theme_path[PATH_MAX_LENGTH];
-   fill_pathname_join(
-      gfx_widgets_path,
-      dir_assets,
-      "menu_widgets",
-      sizeof(gfx_widgets_path)
-   );
-   fill_pathname_join(
-      xmb_path,
-      dir_assets,
-      "xmb",
-      sizeof(xmb_path)
-   );
-   fill_pathname_join(
-      theme_path,
-      xmb_path,
-      "monochrome",
-      sizeof(theme_path)
-   );
-   fill_pathname_join(
-      monochrome_png_path,
-      theme_path,
-      "png",
-      sizeof(monochrome_png_path)
-   );
 
    /* Load textures */
    /* Icons */
@@ -1925,7 +1886,7 @@ static void gfx_widgets_context_reset(
    {
       gfx_display_reset_textures_list(
             gfx_widgets_icons_names[i],
-            monochrome_png_path,
+            p_dispwidget->monochrome_png_path,
             &p_dispwidget->gfx_widgets_icons_textures[i],
             TEXTURE_FILTER_MIPMAP_LINEAR,
             NULL,
@@ -1935,21 +1896,21 @@ static void gfx_widgets_context_reset(
    /* Message queue */
    gfx_display_reset_textures_list(
          "msg_queue_icon.png",
-         gfx_widgets_path,
+         p_dispwidget->gfx_widgets_path,
          &p_dispwidget->msg_queue_icon,
          TEXTURE_FILTER_LINEAR,
          NULL,
          NULL);
    gfx_display_reset_textures_list(
          "msg_queue_icon_outline.png",
-         gfx_widgets_path,
+         p_dispwidget->gfx_widgets_path,
          &p_dispwidget->msg_queue_icon_outline,
          TEXTURE_FILTER_LINEAR,
          NULL,
          NULL);
    gfx_display_reset_textures_list(
          "msg_queue_icon_rect.png",
-         gfx_widgets_path,
+         p_dispwidget->gfx_widgets_path,
          &p_dispwidget->msg_queue_icon_rect,
          TEXTURE_FILTER_NEAREST,
          NULL,
@@ -1967,7 +1928,8 @@ static void gfx_widgets_context_reset(
       if (widget->context_reset)
          widget->context_reset(is_threaded, width, height,
                fullscreen, dir_assets, font_path,
-               monochrome_png_path, gfx_widgets_path);
+               p_dispwidget->monochrome_png_path,
+               p_dispwidget->gfx_widgets_path);
    }
 
    /* Update scaling/dimensions */
@@ -2035,6 +1997,7 @@ bool gfx_widgets_init(
 
    if (!p_dispwidget->inited)
    {
+      char theme_path[PATH_MAX_LENGTH];
       p_dispwidget->gfx_widgets_frame_count = 0;
 
       for (i = 0; i < ARRAY_SIZE(widgets); i++)
@@ -2056,6 +2019,45 @@ bool gfx_widgets_init(
       p_dispwidget->current_msgs_lock = slock_new();
 #endif
 
+      fill_pathname_join(
+            p_dispwidget->gfx_widgets_path,
+            dir_assets,
+            "menu_widgets",
+            sizeof(p_dispwidget->gfx_widgets_path)
+            );
+      fill_pathname_join(
+            p_dispwidget->xmb_path,
+            dir_assets,
+            "xmb",
+            sizeof(p_dispwidget->xmb_path)
+            );
+      /* Base path */
+      fill_pathname_join(p_dispwidget->ozone_path,
+            dir_assets,
+            "ozone",
+            sizeof(p_dispwidget->ozone_path));
+      fill_pathname_join(p_dispwidget->ozone_regular_font_path,
+            p_dispwidget->ozone_path, "regular.ttf",
+            sizeof(p_dispwidget->ozone_regular_font_path));
+      fill_pathname_join(p_dispwidget->ozone_bold_font_path,
+            p_dispwidget->ozone_path, "bold.ttf",
+            sizeof(p_dispwidget->ozone_bold_font_path));
+      fill_pathname_join(
+            theme_path,
+            p_dispwidget->xmb_path,
+            "monochrome",
+            sizeof(theme_path)
+            );
+      fill_pathname_join(
+            p_dispwidget->monochrome_png_path,
+            theme_path,
+            "png",
+            sizeof(p_dispwidget->monochrome_png_path)
+            );
+      fill_pathname_application_special(
+            p_dispwidget->assets_pkg_dir, sizeof(p_dispwidget->assets_pkg_dir),
+            APPLICATION_SPECIAL_DIRECTORY_ASSETS_PKG);
+
       p_dispwidget->inited = true;
    }
 
diff --git a/gfx/gfx_widgets.h b/gfx/gfx_widgets.h
index 368274b91b..cddef240f4 100644
--- a/gfx/gfx_widgets.h
+++ b/gfx/gfx_widgets.h
@@ -215,6 +215,14 @@ typedef struct dispgfx_widget
    unsigned ai_service_overlay_height;
 #endif
 
+   char assets_pkg_dir[PATH_MAX_LENGTH];
+   char xmb_path[PATH_MAX_LENGTH];                /* TODO/FIXME - decouple from XMB */
+   char ozone_path[PATH_MAX_LENGTH];              /* TODO/FIXME - decouple from Ozone */
+   char ozone_regular_font_path[PATH_MAX_LENGTH]; /* TODO/FIXME - decouple from Ozone */
+   char ozone_bold_font_path[PATH_MAX_LENGTH];    /* TODO/FIXME - decouple from Ozone */
+
+   char monochrome_png_path[PATH_MAX_LENGTH];
+   char gfx_widgets_path[PATH_MAX_LENGTH];
    char gfx_widgets_status_text[255];
 
    /* There can only be one message animation at a time to 
diff --git a/menu/drivers/ozone.c b/menu/drivers/ozone.c
index 65a3453bf1..b4a352f302 100644
--- a/menu/drivers/ozone.c
+++ b/menu/drivers/ozone.c
@@ -563,6 +563,7 @@ struct ozone_handle
    char assets_path[PATH_MAX_LENGTH];
    char png_path[PATH_MAX_LENGTH];
    char icons_path[PATH_MAX_LENGTH];
+   char icons_path_default[PATH_MAX_LENGTH];
    char tab_path[PATH_MAX_LENGTH];
    char fullscreen_thumbnail_label[255];
 
@@ -4445,14 +4446,10 @@ static ozone_node_t *ozone_alloc_node(void)
 static void ozone_context_reset_horizontal_list(ozone_handle_t *ozone)
 {
    unsigned i;
-   char icons_path_default[PATH_MAX_LENGTH];
    size_t list_size = ozone_list_get_size(ozone, MENU_LIST_HORIZONTAL);
 
    RHMAP_FREE(ozone->playlist_db_node_map);
 
-   fill_pathname_join(icons_path_default, ozone->icons_path,
-         "default", sizeof(icons_path_default));
-
    for (i = 0; i < list_size; i++)
    {
       const char *path         = NULL;
@@ -4516,7 +4513,7 @@ static void ozone_context_reset_horizontal_list(ozone_handle_t *ozone)
 
          /* If the content icon doesn't exist, return default-content */
          if (!path_is_valid(content_texturepath))
-            fill_pathname_join_delim(content_texturepath, icons_path_default,
+            fill_pathname_join_delim(content_texturepath, ozone->icons_path_default,
                   "content.png", '-', sizeof(content_texturepath));
 
          if (image_texture_load(&ti, content_texturepath))
@@ -7845,6 +7842,8 @@ static void *ozone_init(void **userdata, bool video_is_threaded)
    fill_pathname_application_special(ozone->icons_path,
        sizeof(ozone->icons_path),
        APPLICATION_SPECIAL_DIRECTORY_ASSETS_OZONE_ICONS);
+   fill_pathname_join(ozone->icons_path_default, ozone->icons_path,
+		   "default", sizeof(ozone->icons_path_default));
 
    ozone_last_use_preferred_system_color_theme = settings->bools.menu_use_preferred_system_color_theme;
    p_anim->updatetime_cb                       = ozone_menu_animation_update_time;