From 9ecf466ce110c03ceca9447151632b0e9006b6d6 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Sat, 22 Mar 2014 20:29:23 -0700 Subject: [PATCH] texture-cache: use scale factor to load background and borders https://bugzilla.gnome.org/show_bug.cgi?id=726907 --- src/st/st-texture-cache.c | 33 +++++++++++++++++++++++---------- src/st/st-texture-cache.h | 6 ++++-- src/st/st-theme-node-drawing.c | 15 ++++++++++++--- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c index c194ec5db..8916ebc73 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c @@ -246,10 +246,11 @@ rgba_from_clutter (GdkRGBA *rgba, rgba->alpha = color->alpha / 255.; } -/* A private structure for keeping width and height. */ +/* A private structure for keeping width, height and scale. */ typedef struct { int width; int height; + int scale; } Dimensions; /* This struct corresponds to a request for an texture. @@ -317,6 +318,7 @@ on_image_size_prepared (GdkPixbufLoader *pixbuf_loader, Dimensions *available_dimensions = data; int available_width = available_dimensions->width; int available_height = available_dimensions->height; + int scale_factor = available_dimensions->scale; int scaled_width; int scaled_height; @@ -324,8 +326,8 @@ on_image_size_prepared (GdkPixbufLoader *pixbuf_loader, &scaled_width, &scaled_height); gdk_pixbuf_loader_set_size (pixbuf_loader, - scaled_width, - scaled_height); + scaled_width * scale_factor, + scaled_height * scale_factor); } static GdkPixbuf * @@ -333,6 +335,7 @@ impl_load_pixbuf_data (const guchar *data, gsize size, int available_width, int available_height, + int scale, GError **error) { GdkPixbufLoader *pixbuf_loader = NULL; @@ -346,6 +349,7 @@ impl_load_pixbuf_data (const guchar *data, available_dimensions.width = available_width; available_dimensions.height = available_height; + available_dimensions.scale = scale; g_signal_connect (pixbuf_loader, "size-prepared", G_CALLBACK (on_image_size_prepared), &available_dimensions); @@ -379,6 +383,7 @@ impl_load_pixbuf_data (const guchar *data, /* We know that the image will later be rotated, so we reverse the available dimensions. */ available_dimensions.width = available_height; available_dimensions.height = available_width; + available_dimensions.scale = scale; g_signal_connect (pixbuf_loader, "size-prepared", G_CALLBACK (on_image_size_prepared), &available_dimensions); @@ -466,6 +471,7 @@ static GdkPixbuf * impl_load_pixbuf_file (const char *uri, int available_width, int available_height, + int scale, GError **error) { GdkPixbuf *pixbuf = NULL; @@ -481,6 +487,7 @@ impl_load_pixbuf_file (const char *uri, { pixbuf = impl_load_pixbuf_data ((const guchar *) contents, size, available_width, available_height, + scale, error); } @@ -503,7 +510,7 @@ load_pixbuf_thread (GSimpleAsyncResult *result, g_assert (data != NULL); g_assert (data->uri != NULL); - pixbuf = impl_load_pixbuf_file (data->uri, data->width, data->height, &error); + pixbuf = impl_load_pixbuf_file (data->uri, data->width, data->height, 1, &error); if (error != NULL) { @@ -1328,6 +1335,7 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache, const gchar *uri, int available_width, int available_height, + int scale, GError **error) { CoglHandle texdata; @@ -1340,7 +1348,7 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache, if (texdata == NULL) { - pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, error); + pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, scale, error); if (!pixbuf) goto out; @@ -1369,6 +1377,7 @@ st_texture_cache_load_uri_sync_to_cairo_surface (StTextureCache *cache, const gchar *uri, int available_width, int available_height, + int scale, GError **error) { cairo_surface_t *surface; @@ -1381,7 +1390,7 @@ st_texture_cache_load_uri_sync_to_cairo_surface (StTextureCache *cache, if (surface == NULL) { - pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, error); + pixbuf = impl_load_pixbuf_file (uri, available_width, available_height, scale, error); if (!pixbuf) goto out; @@ -1408,6 +1417,7 @@ out: * st_texture_cache_load_file_to_cogl_texture: * @cache: A #StTextureCache * @file_path: Path to a file in supported image format + * @scale: Scale factor of the display * * This function synchronously loads the given file path * into a COGL texture. On error, a warning is emitted @@ -1417,7 +1427,8 @@ out: */ CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, - const gchar *file_path) + const gchar *file_path, + gint scale) { CoglHandle texture; GFile *file; @@ -1428,7 +1439,7 @@ st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, uri = g_file_get_uri (file); texture = st_texture_cache_load_uri_sync_to_cogl_texture (cache, ST_TEXTURE_CACHE_POLICY_FOREVER, - uri, -1, -1, &error); + uri, -1, -1, scale, &error); g_object_unref (file); g_free (uri); @@ -1445,6 +1456,7 @@ st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, * st_texture_cache_load_file_to_cairo_surface: * @cache: A #StTextureCache * @file_path: Path to a file in supported image format + * @scale: Scale factor of the display * * This function synchronously loads the given file path * into a cairo surface. On error, a warning is emitted @@ -1454,7 +1466,8 @@ st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, */ cairo_surface_t * st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache, - const gchar *file_path) + const gchar *file_path, + gint scale) { cairo_surface_t *surface; GFile *file; @@ -1465,7 +1478,7 @@ st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache, uri = g_file_get_uri (file); surface = st_texture_cache_load_uri_sync_to_cairo_surface (cache, ST_TEXTURE_CACHE_POLICY_FOREVER, - uri, -1, -1, &error); + uri, -1, -1, scale, &error); g_object_unref (file); g_free (uri); diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h index bfcf93557..07f40adc4 100644 --- a/src/st/st-texture-cache.h +++ b/src/st/st-texture-cache.h @@ -93,10 +93,12 @@ ClutterActor *st_texture_cache_load_uri_async (StTextureCache *cache, int available_height); CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, - const gchar *file_path); + const gchar *file_path, + gint scale); cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache, - const gchar *file_path); + const gchar *file_path, + gint scale); /** * StTextureCacheLoader: (skip) diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index dc5b817a9..aa7591cb0 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -606,12 +606,14 @@ create_cairo_pattern_of_background_image (StThemeNode *node, gdouble background_image_width, background_image_height; gdouble x, y; gdouble scale_w, scale_h; + int scale_factor; file = st_theme_node_get_background_image (node); texture_cache = st_texture_cache_get_default (); - surface = st_texture_cache_load_file_to_cairo_surface (texture_cache, file); + g_object_get (node->context, "scale-factor", &scale_factor, NULL); + surface = st_texture_cache_load_file_to_cairo_surface (texture_cache, file, scale_factor); if (surface == NULL) return NULL; @@ -1301,8 +1303,12 @@ st_theme_node_load_border_image (StThemeNode *node) const char *filename; filename = st_border_image_get_filename (border_image); + + int scale_factor; + g_object_get (node->context, "scale-factor", &scale_factor, NULL); + node->border_slices_texture = st_texture_cache_load_file_to_cogl_texture (st_texture_cache_get_default (), - filename); + filename, scale_factor); if (node->border_slices_texture == COGL_INVALID_HANDLE) goto out; @@ -1347,9 +1353,12 @@ st_theme_node_load_background_image (StThemeNode *node) if (background_image == NULL) goto out; + int scale_factor; + g_object_get (node->context, "scale-factor", &scale_factor, NULL); + background_image_shadow_spec = st_theme_node_get_background_image_shadow (node); node->background_texture = st_texture_cache_load_file_to_cogl_texture (st_texture_cache_get_default (), - background_image); + background_image, scale_factor); if (node->background_texture == COGL_INVALID_HANDLE) goto out;