st/texture-cache: Remove load_sliced_image()

It was only used by the `Animation`/`AnimatedIcon` classes, which
have now been removed since `Spinner` is now an independent
implementation.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3612>
This commit is contained in:
Florian Müllner 2025-01-26 20:59:45 +01:00 committed by Marge Bot
parent f24a624335
commit 9beacca329
2 changed files with 0 additions and 253 deletions

View File

@ -1043,31 +1043,6 @@ st_texture_cache_load_gicon (StTextureCache *cache,
return actor; return actor;
} }
static ClutterActor *
load_from_pixbuf (GdkPixbuf *pixbuf,
int paint_scale,
float resource_scale)
{
g_autoptr(ClutterContent) image = NULL;
ClutterActor *actor;
ClutterContext *context;
ClutterBackend *backend;
CoglContext *cogl_context;
actor = g_object_new (CLUTTER_TYPE_ACTOR,
"request-mode", CLUTTER_REQUEST_CONTENT_SIZE,
NULL);
context = clutter_actor_get_context (actor);
backend = clutter_context_get_backend (context);
cogl_context = clutter_backend_get_cogl_context (backend);
image = pixbuf_to_st_content_image (pixbuf, cogl_context, -1, -1,
paint_scale, resource_scale);
clutter_actor_set_content (actor, image);
return actor;
}
static void static void
hash_table_remove_with_scales (GHashTable *hash, hash_table_remove_with_scales (GHashTable *hash,
GList *scales, GList *scales,
@ -1150,224 +1125,6 @@ ensure_monitor_for_file (StTextureCache *cache,
} }
} }
typedef struct {
GFile *gfile;
gint grid_width, grid_height;
gint paint_scale;
gfloat resource_scale;
ClutterActor *actor;
GCancellable *cancellable;
GFunc load_callback;
gpointer load_callback_data;
} AsyncImageData;
static void
on_data_destroy (gpointer data)
{
AsyncImageData *d = (AsyncImageData *)data;
g_object_unref (d->gfile);
g_object_unref (d->actor);
g_object_unref (d->cancellable);
g_free (d);
}
static void
on_sliced_image_actor_destroyed (ClutterActor *actor,
gpointer data)
{
GTask *task = data;
GCancellable *cancellable = g_task_get_cancellable (task);
g_cancellable_cancel (cancellable);
}
static void
on_sliced_image_loaded (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
GObject *cache = source_object;
AsyncImageData *data = (AsyncImageData *)user_data;
GTask *task = G_TASK (res);
GList *list, *pixbufs;
if (g_task_had_error (task) || g_cancellable_is_cancelled (data->cancellable))
return;
clutter_actor_set_layout_manager (data->actor,
g_object_new (CLUTTER_TYPE_BIN_LAYOUT, NULL));
/* stop propagation of child expand flags */
clutter_actor_set_x_expand (data->actor, FALSE);
clutter_actor_set_y_expand (data->actor, FALSE);
pixbufs = g_task_propagate_pointer (task, NULL);
for (list = pixbufs; list; list = list->next)
{
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data),
data->paint_scale,
data->resource_scale);
clutter_actor_set_x_expand (actor, TRUE);
clutter_actor_set_y_expand (actor, TRUE);
clutter_actor_set_x_align (actor, CLUTTER_ACTOR_ALIGN_FILL);
clutter_actor_set_y_align (actor, CLUTTER_ACTOR_ALIGN_FILL);
clutter_actor_hide (actor);
clutter_actor_add_child (data->actor, actor);
}
g_list_free_full (pixbufs, g_object_unref);
g_signal_handlers_disconnect_by_func (data->actor,
on_sliced_image_actor_destroyed,
task);
if (data->load_callback != NULL)
data->load_callback (cache, data->load_callback_data);
}
static void
free_glist_unref_gobjects (gpointer p)
{
g_list_free_full (p, g_object_unref);
}
static void
on_loader_size_prepared (GdkPixbufLoader *loader,
gint width,
gint height,
gpointer user_data)
{
AsyncImageData *data = user_data;
int scale = ceilf (data->paint_scale * data->resource_scale);
gdk_pixbuf_loader_set_size (loader, width * scale, height * scale);
}
static void
load_sliced_image (GTask *result,
gpointer object,
gpointer task_data,
GCancellable *cancellable)
{
AsyncImageData *data;
GList *res = NULL;
GdkPixbuf *pix;
gint width, height, y, x;
gint scale_factor;
GdkPixbufLoader *loader = NULL;
GError *error = NULL;
gchar *buffer = NULL;
gsize length;
g_assert (cancellable);
data = task_data;
g_assert (data);
if (!g_file_load_contents (data->gfile, cancellable, &buffer, &length, NULL, &error))
{
g_warning ("Failed to open sliced image: %s", error->message);
goto out;
}
loader = gdk_pixbuf_loader_new ();
g_signal_connect (loader, "size-prepared", G_CALLBACK (on_loader_size_prepared), data);
if (!gdk_pixbuf_loader_write (loader, (const guchar *) buffer, length, &error))
{
g_warning ("Failed to load image: %s", error->message);
goto out;
}
if (!gdk_pixbuf_loader_close (loader, NULL))
goto out;
pix = gdk_pixbuf_loader_get_pixbuf (loader);
width = gdk_pixbuf_get_width (pix);
height = gdk_pixbuf_get_height (pix);
scale_factor = ceilf (data->paint_scale * data->resource_scale);
for (y = 0; y < height; y += data->grid_height * scale_factor)
{
for (x = 0; x < width; x += data->grid_width * scale_factor)
{
GdkPixbuf *pixbuf = gdk_pixbuf_new_subpixbuf (pix, x, y,
data->grid_width * scale_factor,
data->grid_height * scale_factor);
g_assert (pixbuf != NULL);
res = g_list_append (res, pixbuf);
}
}
out:
/* We don't need the original pixbuf anymore, which is owned by the loader,
* though the subpixbufs will hold a reference. */
g_clear_object (&loader);
g_free (buffer);
g_clear_pointer (&error, g_error_free);
g_task_return_pointer (result, res, free_glist_unref_gobjects);
}
/**
* st_texture_cache_load_sliced_image:
* @cache: A #StTextureCache
* @file: A #GFile
* @grid_width: Width in pixels
* @grid_height: Height in pixels
* @paint_scale: Scale factor of the display
* @load_callback: (scope async) (nullable): Function called when the image is loaded, or %NULL
* @user_data: Data to pass to the load callback
*
* This function reads a single image file which contains multiple images internally.
* The image file will be divided using @grid_width and @grid_height;
* note that the dimensions of the image loaded from @path
* should be a multiple of the specified grid dimensions.
*
* Returns: (transfer none): A new #ClutterActor
*/
ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache,
GFile *file,
gint grid_width,
gint grid_height,
gint paint_scale,
gfloat resource_scale,
GFunc load_callback,
gpointer user_data)
{
AsyncImageData *data;
GTask *result;
ClutterActor *actor = clutter_actor_new ();
GCancellable *cancellable = g_cancellable_new ();
g_return_val_if_fail (G_IS_FILE (file), NULL);
g_assert (paint_scale > 0);
g_assert (resource_scale > 0);
data = g_new0 (AsyncImageData, 1);
data->grid_width = grid_width;
data->grid_height = grid_height;
data->paint_scale = paint_scale;
data->resource_scale = resource_scale;
data->gfile = g_object_ref (file);
data->actor = actor;
data->cancellable = cancellable;
data->load_callback = load_callback;
data->load_callback_data = user_data;
g_object_ref (G_OBJECT (actor));
result = g_task_new (cache, cancellable, on_sliced_image_loaded, data);
g_signal_connect (actor, "destroy",
G_CALLBACK (on_sliced_image_actor_destroyed), result);
g_task_set_task_data (result, data, on_data_destroy);
g_task_run_in_thread (result, load_sliced_image);
g_object_unref (result);
return actor;
}
/** /**
* st_texture_cache_load_file_async: * st_texture_cache_load_file_async:
* @cache: A #StTextureCache * @cache: A #StTextureCache

View File

@ -44,16 +44,6 @@ typedef enum {
StTextureCache* st_texture_cache_get_default (void); StTextureCache* st_texture_cache_get_default (void);
ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache,
GFile *file,
gint grid_width,
gint grid_height,
gint paint_scale,
gfloat resource_scale,
GFunc load_callback,
gpointer user_data);
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache, ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
StThemeNode *theme_node, StThemeNode *theme_node,
GIcon *icon, GIcon *icon,