[gtk/wip/baedert/icontheme: 814/821] icontheme: Stop using GPtrArrays in choose_icon



commit 7edc230c5ae12b79728c9467989a60fc805f41ee
Author: Timm Bäder <mail baedert org>
Date:   Sat May 25 17:39:44 2019 +0200

    icontheme: Stop using GPtrArrays in choose_icon
    
    We actually know the exact amount of new icon names we will have before.

 gtk/gtkicontheme.c | 104 ++++++++++++++++++++++++++++++++---------------------
 1 file changed, 64 insertions(+), 40 deletions(-)
---
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 3f24570a9f..8da0f34b43 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -1890,13 +1890,14 @@ real_choose_icon (GtkIconTheme       *icon_theme,
 }
 
 static void
-icon_name_list_add_icon (GPtrArray   *icons,
-                         const gchar *dir_suffix,
-                         gchar       *icon_name)
+icon_name_list_add_icon (char       **icon_names,
+                         const char  *dir_suffix,
+                         char        *icon_name,
+                         int         *iterator)
 {
   if (dir_suffix)
-    g_ptr_array_add (icons, g_strconcat (icon_name, dir_suffix, NULL));
-  g_ptr_array_add (icons, icon_name);
+    icon_names[(*iterator)++] = g_strconcat (icon_name, dir_suffix, NULL);
+  icon_names[(*iterator)++] = icon_name;
 }
 
 static GtkIconInfo *
@@ -1906,12 +1907,15 @@ choose_icon (GtkIconTheme       *icon_theme,
              gint                scale,
              GtkIconLookupFlags  flags)
 {
-  gboolean has_regular = FALSE, has_symbolic = FALSE;
   GtkIconInfo *icon_info;
-  GPtrArray *new_names;
   const gchar *dir_suffix;
+  char **new_names = NULL;
+  int n_new_names = 0;
   guint i;
   int n_icon_names = 0;
+  int n_symbolic_icon_names = 0;
+  int n_regular_icon_names = 0;
+  int dir_factor;
 
   if (flags & GTK_ICON_LOOKUP_DIR_LTR)
     dir_suffix = "-ltr";
@@ -1920,82 +1924,99 @@ choose_icon (GtkIconTheme       *icon_theme,
   else
     dir_suffix = NULL;
 
+  dir_factor = (dir_suffix == NULL ? 1 : 2);
+
   for (i = 0; icon_names[i]; i++)
     {
       if (icon_name_is_symbolic (icon_names[i], -1))
-        has_symbolic = TRUE;
+        n_symbolic_icon_names ++;
       else
-        has_regular = TRUE;
+        n_regular_icon_names ++;
 
       n_icon_names ++;
     }
 
-  if ((flags & GTK_ICON_LOOKUP_FORCE_REGULAR) && has_symbolic)
+  if ((flags & GTK_ICON_LOOKUP_FORCE_REGULAR) && n_symbolic_icon_names > 0)
     {
-      new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
-      for (i = 0; icon_names[i]; i++)
+      int p = 0;
+
+      n_new_names = dir_factor * ((n_symbolic_icon_names * 2) + n_regular_icon_names);
+      new_names = g_alloca (sizeof (char *) * n_new_names);
+
+      for (i = 0; i < n_icon_names; i ++)
         {
-          if (icon_name_is_symbolic (icon_names[i], -1))
-            icon_name_list_add_icon (new_names, dir_suffix, g_strndup (icon_names[i], strlen (icon_names[i]) 
- strlen ("-symbolic")));
+          int icon_name_len = strlen (icon_names[i]);
+
+          if (icon_name_is_symbolic (icon_names[i], icon_name_len))
+            icon_name_list_add_icon (new_names, dir_suffix, g_strndup (icon_names[i], icon_name_len - strlen 
("-symbolic")), &p);
           else
-            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
         }
-      for (i = 0; icon_names[i]; i++)
+
+      for (i = 0; i < n_icon_names; i ++)
         {
           if (icon_name_is_symbolic (icon_names[i], -1))
-            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
         }
 
+      g_assert (p == n_new_names);
+
       icon_info = real_choose_icon (icon_theme,
-                                    (const gchar **) new_names->pdata,
-                                    new_names->len,
+                                    (const char **)new_names,
+                                    n_new_names,
                                     size,
                                     scale,
                                     flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR | 
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
 
-      g_ptr_array_free (new_names, TRUE);
     }
-  else if ((flags & GTK_ICON_LOOKUP_FORCE_SYMBOLIC) && has_regular)
+  else if ((flags & GTK_ICON_LOOKUP_FORCE_SYMBOLIC) && n_regular_icon_names > 0)
     {
-      new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
-      for (i = 0; icon_names[i]; i++)
+      int p = 0;
+
+      n_new_names = dir_factor * ((n_regular_icon_names * 2) + n_symbolic_icon_names);
+      new_names = g_alloca (sizeof (char *) * n_new_names);
+
+      for (i = 0; i < n_icon_names; i ++)
         {
           if (!icon_name_is_symbolic (icon_names[i], -1))
-            icon_name_list_add_icon (new_names, dir_suffix, g_strconcat (icon_names[i], "-symbolic", NULL));
+            icon_name_list_add_icon (new_names, dir_suffix, g_strconcat (icon_names[i], "-symbolic", NULL), 
&p);
           else
-            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
         }
-      for (i = 0; icon_names[i]; i++)
+
+      for (i = 0; i < n_icon_names; i ++)
         {
           if (!icon_name_is_symbolic (icon_names[i], -1))
-            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
+            icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
         }
 
+      g_assert (p == n_new_names);
+
       icon_info = real_choose_icon (icon_theme,
-                                    (const gchar **) new_names->pdata,
-                                    new_names->len,
+                                    (const char **)new_names,
+                                    n_new_names,
                                     size,
                                     scale,
                                     flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR | 
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
-
-      g_ptr_array_free (new_names, TRUE);
     }
   else if (dir_suffix)
     {
-      new_names = g_ptr_array_new_full (2 * n_icon_names, g_free);
-      for (i = 0; icon_names[i]; i++)
-        {
-          icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]));
-        }
+      int p = 0;
+
+      n_new_names = (dir_suffix != NULL ? 2 : 1) * n_icon_names;
+      new_names = g_alloca (sizeof (char *) * n_new_names);
+
+      for (i = 0; i < n_icon_names; i ++)
+        icon_name_list_add_icon (new_names, dir_suffix, g_strdup (icon_names[i]), &p);
+
+      g_assert (p == n_new_names);
 
       icon_info = real_choose_icon (icon_theme,
-                                    (const gchar **) new_names->pdata,
-                                    new_names->len,
+                                    (const char **)new_names,
+                                    n_new_names,
                                     size,
                                     scale,
                                     flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR | 
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
-
-      g_ptr_array_free (new_names, TRUE);
     }
   else
     {
@@ -2007,6 +2028,9 @@ choose_icon (GtkIconTheme       *icon_theme,
                                     flags & ~(GTK_ICON_LOOKUP_FORCE_REGULAR | 
GTK_ICON_LOOKUP_FORCE_SYMBOLIC));
     }
 
+  for (i = 0; i < n_new_names; i ++)
+    g_free (new_names[i]);
+
   return icon_info;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]