summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2022-08-07 23:10:23 +0100
committerAntónio Fernandes <antoniof@gnome.org>2022-09-01 12:23:06 +0100
commitacb74897f68d180ccb1f529b14726dd9ddfea090 (patch)
treecd45df25916296bf2b57d0315c5b6c4626b22c15
parent314fc335dce1ee733d3607c908f9091fcd8d19eb (diff)
downloadnautilus-acb74897f68d180ccb1f529b14726dd9ddfea090.tar.gz
ui-utilities: Add filmholes using GdkSnapshot
This can take advantage of GPU and prepares for next changes.
-rw-r--r--src/nautilus-file.c33
-rw-r--r--src/nautilus-ui-utilities.c46
-rw-r--r--src/nautilus-ui-utilities.h4
3 files changed, 48 insertions, 35 deletions
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index a2c02f690..375f148dc 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -5146,6 +5146,7 @@ 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;
@@ -5159,6 +5160,11 @@ nautilus_file_get_thumbnail_icon (NautilusFile *file,
if (file->details->thumbnail)
{
+ gdouble texture_width;
+ gdouble texture_height;
+ g_autoptr (GdkTexture) texture = NULL;
+ g_autoptr (GtkSnapshot) snapshot = gtk_snapshot_new ();
+
w = gdk_pixbuf_get_width (file->details->thumbnail);
h = gdk_pixbuf_get_height (file->details->thumbnail);
@@ -5191,20 +5197,24 @@ nautilus_file_get_thumbnail_icon (NautilusFile *file,
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;
}
+ texture = gdk_texture_new_for_pixbuf (pixbuf);
+ texture_width = gdk_texture_get_width (texture);
+ texture_height = gdk_texture_get_height (texture);
+ gdk_paintable_snapshot (GDK_PAINTABLE (texture),
+ GDK_SNAPSHOT (snapshot),
+ texture_width, texture_height);
+ if (size >= NAUTILUS_GRID_ICON_SIZE_SMALL &&
+ nautilus_is_video_file (file))
+ {
+ nautilus_ui_frame_video (snapshot, texture_width, texture_height);
+ }
+ paintable = gtk_snapshot_to_paintable (snapshot, NULL);
+
DEBUG ("Returning thumbnailed image, at size %d %d",
(int) (w * thumb_scale), (int) (h * thumb_scale));
}
@@ -5217,10 +5227,9 @@ nautilus_file_get_thumbnail_icon (NautilusFile *file,
nautilus_create_thumbnail (file);
}
- if (pixbuf != NULL)
+ if (paintable != NULL)
{
- g_autoptr (GdkTexture) texture = gdk_texture_new_for_pixbuf (pixbuf);
- icon = nautilus_icon_info_new_for_paintable (GDK_PAINTABLE (texture), scale);
+ icon = nautilus_icon_info_new_for_paintable (paintable, scale);
}
else if (file->details->is_thumbnailing)
{
diff --git a/src/nautilus-ui-utilities.c b/src/nautilus-ui-utilities.c
index 74bba91f2..d87422460 100644
--- a/src/nautilus-ui-utilities.c
+++ b/src/nautilus-ui-utilities.c
@@ -164,39 +164,41 @@ ensure_filmholes (void)
}
void
-nautilus_ui_frame_video (GdkPixbuf **pixbuf)
+nautilus_ui_frame_video (GtkSnapshot *snapshot,
+ gdouble width,
+ gdouble height)
{
- int width, height;
+ g_autoptr (GdkTexture) left_texture = NULL;
+ g_autoptr (GdkTexture) right_texture = NULL;
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);
- 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);
- }
+ /* 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);
}
gboolean
diff --git a/src/nautilus-ui-utilities.h b/src/nautilus-ui-utilities.h
index 44af13586..f3df67f9c 100644
--- a/src/nautilus-ui-utilities.h
+++ b/src/nautilus-ui-utilities.h
@@ -35,7 +35,9 @@ void nautilus_g_menu_replace_string_in_item (GMenu *menu,
const gchar *attribute,
const gchar *string);
-void nautilus_ui_frame_video (GdkPixbuf **pixbuf);
+void nautilus_ui_frame_video (GtkSnapshot *snapshot,
+ gdouble width,
+ gdouble height);
gboolean nautilus_date_time_is_between_dates (GDateTime *date,
GDateTime *initial_date,