[nautilus/wip/antoniof/hidpi-and-icons-cleanup: 5/11] Revert "file: Support HiDPI icons"




commit e975b04dcf6219767f50f8a6dbcff70121ad3a01
Author: António Fernandes <antoniof gnome org>
Date:   Mon Aug 8 00:12:20 2022 +0100

    Revert "file: Support HiDPI icons"
    
    This reverts commit 503ef03509169bcb15aa748a06451daabce03662.

 src/nautilus-directory-async.c |  5 +++
 src/nautilus-file-private.h    |  3 ++
 src/nautilus-file.c            | 93 ++++++++++++++++++++++++++++++------------
 src/nautilus-grid-cell.c       |  9 +---
 src/nautilus-icon-info.c       | 31 +++++++-------
 src/nautilus-icon-info.h       |  2 +-
 src/nautilus-name-cell.c       |  9 +---
 src/nautilus-ui-utilities.c    | 46 ++++++++++-----------
 src/nautilus-ui-utilities.h    |  4 +-
 9 files changed, 117 insertions(+), 85 deletions(-)
---
diff --git a/src/nautilus-directory-async.c b/src/nautilus-directory-async.c
index 3e7f421e6..4899ea7b6 100644
--- a/src/nautilus-directory-async.c
+++ b/src/nautilus-directory-async.c
@@ -3608,6 +3608,11 @@ thumbnail_done (NautilusDirectory *directory,
         g_object_unref (file->details->thumbnail);
         file->details->thumbnail = NULL;
     }
+    if (file->details->scaled_thumbnail)
+    {
+        g_object_unref (file->details->scaled_thumbnail);
+        file->details->scaled_thumbnail = NULL;
+    }
 
     if (pixbuf)
     {
diff --git a/src/nautilus-file-private.h b/src/nautilus-file-private.h
index e575edb62..831ed8d44 100644
--- a/src/nautilus-file-private.h
+++ b/src/nautilus-file-private.h
@@ -91,6 +91,9 @@ struct NautilusFileDetails
        GdkPixbuf *thumbnail;
        time_t thumbnail_mtime;
 
+       GdkPixbuf *scaled_thumbnail;
+       double thumbnail_scale;
+
        GList *mime_list; /* If this is a directory, the list of MIME types in it. */
 
        /* Info you might get from a link (.desktop, .directory or nautilus link) */
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index 24e24a5bd..b60d65d9b 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -912,6 +912,10 @@ finalize (GObject *object)
     {
         g_object_unref (file->details->thumbnail);
     }
+    if (file->details->scaled_thumbnail)
+    {
+        g_object_unref (file->details->scaled_thumbnail);
+    }
 
     if (file->details->mount)
     {
@@ -5142,42 +5146,69 @@ nautilus_file_get_thumbnail_icon (NautilusFile          *file,
                                   int                    scale,
                                   NautilusFileIconFlags  flags)
 {
-    g_autoptr (GdkPaintable) paintable = NULL;
+    int modified_size;
+    GdkPixbuf *pixbuf;
+    int w, h, s;
+    double thumb_scale;
+    GIcon *gicon;
     NautilusIconInfo *icon;
 
     icon = NULL;
+    gicon = NULL;
+    pixbuf = NULL;
 
-<<<<<<< HEAD
     modified_size = size * scale;
-=======
-    if (file->details->thumbnail != NULL)
+
+    if (file->details->thumbnail)
     {
-        GdkPixbuf *pixbuf = file->details->thumbnail;
-        double width = gdk_pixbuf_get_width (pixbuf) / scale;
-        double height = gdk_pixbuf_get_height (pixbuf) / scale;
-        g_autoptr (GdkTexture) texture = gdk_texture_new_for_pixbuf (pixbuf);
-        g_autoptr (GtkSnapshot) snapshot = gtk_snapshot_new ();
->>>>>>> 0b7293ad3 (file: Support HiDPI icons)
+        w = gdk_pixbuf_get_width (file->details->thumbnail);
+        h = gdk_pixbuf_get_height (file->details->thumbnail);
 
-        if (MAX (width, height) > size)
+        s = MAX (w, h);
+        /* Don't scale up small thumbnails in the standard view */
+        if (s <= NAUTILUS_GRID_ICON_SIZE_MEDIUM)
         {
-            float scale_down_factor = MAX (width, height) / size;
-
-            width = width / scale_down_factor;
-            height = height / scale_down_factor;
+            thumb_scale = (double) size / NAUTILUS_GRID_ICON_SIZE_SMALL;
+        }
+        else
+        {
+            thumb_scale = (double) modified_size / s;
         }
 
-        gdk_paintable_snapshot (GDK_PAINTABLE (texture),
-                                GDK_SNAPSHOT (snapshot),
-                                width, height);
+        /* Make sure that icons don't get smaller than NAUTILUS_LIST_ICON_SIZE_SMALL */
+        if (s * thumb_scale <= NAUTILUS_LIST_ICON_SIZE_SMALL)
+        {
+            thumb_scale = (double) NAUTILUS_LIST_ICON_SIZE_SMALL / s;
+        }
 
-        if (size >= NAUTILUS_GRID_ICON_SIZE_SMALL &&
-            nautilus_is_video_file (file))
+        if (file->details->thumbnail_scale == thumb_scale &&
+            file->details->scaled_thumbnail != NULL)
         {
-            nautilus_ui_frame_video (snapshot, width, height);
+            pixbuf = file->details->scaled_thumbnail;
+        }
+        else
+        {
+            pixbuf = gdk_pixbuf_scale_simple (file->details->thumbnail,
+                                              MAX (w * thumb_scale, 1),
+                                              MAX (h * thumb_scale, 1),
+                                              GDK_INTERP_BILINEAR);
+
+            /* We don't want frames around small icons */
+            if (!gdk_pixbuf_get_has_alpha (file->details->thumbnail) || s >= 128 * scale)
+            {
+                if (nautilus_is_video_file (file))
+                {
+                    nautilus_ui_frame_video (&pixbuf);
+                }
+            }
+
+            g_clear_object (&file->details->scaled_thumbnail);
+            file->details->scaled_thumbnail = pixbuf;
+            file->details->thumbnail_scale = thumb_scale;
         }
 
-        paintable = gtk_snapshot_to_paintable (snapshot, NULL);
+        DEBUG ("Returning thumbnailed image, at size %d %d",
+               (int) (w * thumb_scale), (int) (h * thumb_scale));
     }
     else if (file->details->thumbnail_path == NULL &&
              file->details->can_read &&
@@ -5188,19 +5219,27 @@ nautilus_file_get_thumbnail_icon (NautilusFile          *file,
         nautilus_create_thumbnail (file);
     }
 
-    if (paintable != NULL)
+    if (pixbuf != NULL)
     {
-        icon = nautilus_icon_info_new_for_paintable (paintable, scale);
+        gicon = G_ICON (g_object_ref (pixbuf));
     }
     else if (file->details->is_thumbnailing)
     {
-        g_autoptr (GIcon) gicon = NULL;
-
         gicon = g_themed_icon_new (ICON_NAME_THUMBNAIL_LOADING);
-        if (gicon != NULL)
+    }
+
+    if (gicon != NULL)
+    {
+        if (g_icon_equal (gicon, G_ICON (pixbuf)))
+        {
+            icon = nautilus_icon_info_new_for_pixbuf (pixbuf, scale);
+        }
+        else
         {
             icon = nautilus_icon_info_lookup (gicon, size, scale);
         }
+
+        g_object_unref (gicon);
     }
 
     return icon;
diff --git a/src/nautilus-grid-cell.c b/src/nautilus-grid-cell.c
index 6599408cc..63d9dc576 100644
--- a/src/nautilus-grid-cell.c
+++ b/src/nautilus-grid-cell.c
@@ -34,22 +34,15 @@ update_icon (NautilusGridCell *self)
     GtkStyleContext *style_context;
     NautilusFile *file;
     guint icon_size;
-    gint scale_factor;
     g_autofree gchar *thumbnail_path = NULL;
 
     item = nautilus_view_cell_get_item (NAUTILUS_VIEW_CELL (self));
     g_return_if_fail (item != NULL);
     file = nautilus_view_item_get_file (item);
     icon_size = nautilus_view_item_get_icon_size (item);
-<<<<<<< HEAD
     flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS;
-=======
-    scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (self));
-    flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
-            NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE;
->>>>>>> 0b7293ad3 (file: Support HiDPI icons)
 
-    icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, scale_factor, flags);
+    icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, 1, flags);
     gtk_picture_set_paintable (GTK_PICTURE (self->icon), icon_paintable);
 
     /* Set the same height and width for all icons regardless of aspect ratio.
diff --git a/src/nautilus-icon-info.c b/src/nautilus-icon-info.c
index b5754518c..0831ae168 100644
--- a/src/nautilus-icon-info.c
+++ b/src/nautilus-icon-info.c
@@ -28,6 +28,8 @@ struct _NautilusIconInfo
     GdkPaintable *paintable;
 
     char *icon_name;
+
+    gint orig_scale;
 };
 
 static void schedule_reap_cache (void);
@@ -101,18 +103,20 @@ nautilus_icon_info_class_init (NautilusIconInfoClass *icon_info_class)
 }
 
 NautilusIconInfo *
-nautilus_icon_info_new_for_paintable (GdkPaintable *paintable,
-                                      gint          scale)
+nautilus_icon_info_new_for_pixbuf (GdkPixbuf *pixbuf,
+                                   gint       scale)
 {
     NautilusIconInfo *icon;
 
     icon = g_object_new (NAUTILUS_TYPE_ICON_INFO, NULL);
 
-    if (paintable != NULL)
+    if (pixbuf)
     {
-        icon->paintable = g_object_ref (paintable);
+        icon->paintable = GDK_PAINTABLE (gdk_texture_new_for_pixbuf (pixbuf));
     }
 
+    icon->orig_scale = scale;
+
     return icon;
 }
 
@@ -124,7 +128,9 @@ nautilus_icon_info_new_for_icon_paintable (GtkIconPaintable *icon_paintable,
     g_autoptr (GFile) file = NULL;
     char *basename, *p;
 
-    icon = nautilus_icon_info_new_for_paintable (GDK_PAINTABLE (icon_paintable), scale);
+    icon = g_object_new (NAUTILUS_TYPE_ICON_INFO, NULL);
+
+    icon->paintable = GDK_PAINTABLE (g_object_ref (icon_paintable));
 
     file = gtk_icon_paintable_get_file (icon_paintable);
     if (file != NULL)
@@ -142,6 +148,8 @@ nautilus_icon_info_new_for_icon_paintable (GtkIconPaintable *icon_paintable,
         icon->icon_name = g_strdup (gtk_icon_paintable_get_icon_name (icon_paintable));
     }
 
+    icon->orig_scale = scale;
+
     return icon;
 }
 
@@ -336,8 +344,7 @@ nautilus_icon_info_lookup (GIcon *icon,
 
     if (G_IS_LOADABLE_ICON (icon))
     {
-        g_autoptr (GdkPixbuf) pixbuf = NULL;
-        g_autoptr (GdkTexture) texture = NULL;
+        GdkPixbuf *pixbuf;
         LoadableIconKey lookup_key;
         LoadableIconKey *key;
         GInputStream *stream;
@@ -361,6 +368,7 @@ nautilus_icon_info_lookup (GIcon *icon,
             return g_object_ref (icon_info);
         }
 
+        pixbuf = NULL;
         stream = g_loadable_icon_load (G_LOADABLE_ICON (icon),
                                        size * scale,
                                        NULL, NULL, NULL);
@@ -374,12 +382,7 @@ nautilus_icon_info_lookup (GIcon *icon,
             g_object_unref (stream);
         }
 
-        if (pixbuf != NULL)
-        {
-            texture = gdk_texture_new_for_pixbuf (pixbuf);
-        }
-
-        icon_info = nautilus_icon_info_new_for_paintable (GDK_PAINTABLE (texture), scale);
+        icon_info = nautilus_icon_info_new_for_pixbuf (pixbuf, scale);
 
         key = loadable_icon_key_new (icon, scale, size);
         g_hash_table_insert (loadable_icon_cache, key, icon_info);
@@ -391,7 +394,7 @@ nautilus_icon_info_lookup (GIcon *icon,
                                                      icon, size, scale, GTK_TEXT_DIR_NONE, 0);
     if (icon_paintable == NULL)
     {
-        return nautilus_icon_info_new_for_paintable (NULL, scale);
+        return nautilus_icon_info_new_for_pixbuf (NULL, scale);
     }
 
     if (G_IS_THEMED_ICON (icon))
diff --git a/src/nautilus-icon-info.h b/src/nautilus-icon-info.h
index 727d3b226..074789fda 100644
--- a/src/nautilus-icon-info.h
+++ b/src/nautilus-icon-info.h
@@ -14,7 +14,7 @@ G_BEGIN_DECLS
 #define NAUTILUS_TYPE_ICON_INFO (nautilus_icon_info_get_type ())
 G_DECLARE_FINAL_TYPE (NautilusIconInfo, nautilus_icon_info, NAUTILUS, ICON_INFO, GObject)
 
-NautilusIconInfo *    nautilus_icon_info_new_for_paintable            (GdkPaintable      *paintable,
+NautilusIconInfo *    nautilus_icon_info_new_for_pixbuf               (GdkPixbuf         *pixbuf,
                                                                       int                scale);
 NautilusIconInfo *    nautilus_icon_info_lookup                       (GIcon             *icon,
                                                                       int                size,
diff --git a/src/nautilus-name-cell.c b/src/nautilus-name-cell.c
index c1a1cf6bd..bab99561b 100644
--- a/src/nautilus-name-cell.c
+++ b/src/nautilus-name-cell.c
@@ -128,7 +128,6 @@ update_icon (NautilusNameCell *self)
     NautilusViewItem *item;
     NautilusFile *file;
     guint icon_size;
-    gint scale_factor;
     int icon_height;
     int extra_margin;
     g_autofree gchar *thumbnail_path = NULL;
@@ -138,15 +137,9 @@ update_icon (NautilusNameCell *self)
 
     file = nautilus_view_item_get_file (item);
     icon_size = nautilus_view_item_get_icon_size (item);
-<<<<<<< HEAD
     flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS;
-=======
-    scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (self));
-    flags = NAUTILUS_FILE_ICON_FLAGS_USE_THUMBNAILS |
-            NAUTILUS_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE;
->>>>>>> 0b7293ad3 (file: Support HiDPI icons)
 
-    icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, scale_factor, flags);
+    icon_paintable = nautilus_file_get_icon_paintable (file, icon_size, 1, flags);
     gtk_picture_set_paintable (GTK_PICTURE (self->icon), icon_paintable);
 
     /* Set the same width for all icons regardless of aspect ratio.
diff --git a/src/nautilus-ui-utilities.c b/src/nautilus-ui-utilities.c
index d87422460..74bba91f2 100644
--- a/src/nautilus-ui-utilities.c
+++ b/src/nautilus-ui-utilities.c
@@ -164,41 +164,39 @@ ensure_filmholes (void)
 }
 
 void
-nautilus_ui_frame_video (GtkSnapshot *snapshot,
-                         gdouble      width,
-                         gdouble      height)
+nautilus_ui_frame_video (GdkPixbuf **pixbuf)
 {
-    g_autoptr (GdkTexture) left_texture = NULL;
-    g_autoptr (GdkTexture) right_texture = NULL;
+    int width, height;
     int holes_width, holes_height;
+    int i;
 
     if (!ensure_filmholes ())
     {
         return;
     }
 
+    width = gdk_pixbuf_get_width (*pixbuf);
+    height = gdk_pixbuf_get_height (*pixbuf);
     holes_width = gdk_pixbuf_get_width (filmholes_left);
     holes_height = gdk_pixbuf_get_height (filmholes_left);
 
-    /* Left */
-    gtk_snapshot_push_repeat (snapshot,
-                              &GRAPHENE_RECT_INIT (0, 0, holes_width, height),
-                              NULL);
-    left_texture = gdk_texture_new_for_pixbuf (filmholes_left);
-    gtk_snapshot_append_texture (snapshot,
-                                 left_texture,
-                                 &GRAPHENE_RECT_INIT (0, 0, holes_width, holes_height));
-    gtk_snapshot_pop (snapshot);
-
-    /* Right */
-    gtk_snapshot_push_repeat (snapshot,
-                              &GRAPHENE_RECT_INIT (width - holes_width, 0, holes_width, height),
-                              NULL);
-    right_texture = gdk_texture_new_for_pixbuf (filmholes_right);
-    gtk_snapshot_append_texture (snapshot,
-                                 right_texture,
-                                 &GRAPHENE_RECT_INIT (width - holes_width, 0, holes_width, holes_height));
-    gtk_snapshot_pop (snapshot);
+    for (i = 0; i < height; i += holes_height)
+    {
+        gdk_pixbuf_composite (filmholes_left, *pixbuf, 0, i,
+                              MIN (width, holes_width),
+                              MIN (height - i, holes_height),
+                              0, i, 1, 1, GDK_INTERP_NEAREST, 255);
+    }
+
+    for (i = 0; i < height; i += holes_height)
+    {
+        gdk_pixbuf_composite (filmholes_right, *pixbuf,
+                              width - holes_width, i,
+                              MIN (width, holes_width),
+                              MIN (height - i, holes_height),
+                              width - holes_width, i,
+                              1, 1, GDK_INTERP_NEAREST, 255);
+    }
 }
 
 gboolean
diff --git a/src/nautilus-ui-utilities.h b/src/nautilus-ui-utilities.h
index f3df67f9c..44af13586 100644
--- a/src/nautilus-ui-utilities.h
+++ b/src/nautilus-ui-utilities.h
@@ -35,9 +35,7 @@ void        nautilus_g_menu_replace_string_in_item  (GMenu             *menu,
                                                      const gchar       *attribute,
                                                      const gchar       *string);
 
-void        nautilus_ui_frame_video                 (GtkSnapshot       *snapshot,
-                                                     gdouble            width,
-                                                     gdouble            height);
+void        nautilus_ui_frame_video                 (GdkPixbuf        **pixbuf);
 
 gboolean    nautilus_date_time_is_between_dates     (GDateTime         *date,
                                                      GDateTime         *initial_date,


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