[gnome-desktop/wip/muktupavels/hidpi] gnome_bg_create_surface: always honor device scale



commit 666ddf4d78560711f1f56c3deee195bc708b5400
Author: Lars Uebernickel <lars uebernic de>
Date:   Tue Mar 17 13:18:07 2015 +0100

    gnome_bg_create_surface: always honor device scale
    
    Also when creating the surface through a temporary X connection. The
    returned surface now always has the same size and device scale set,
    regardless of whether @is_root is set.
    
    Also always draw the backgrounds scaled to the size of the destination
    window.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=746044
    https://gitlab.gnome.org/GNOME/gnome-desktop/issues/59

 libgnome-desktop/gnome-bg.c | 55 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 47 insertions(+), 8 deletions(-)
---
diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c
index 230a2f29..d35d666e 100644
--- a/libgnome-desktop/gnome-bg.c
+++ b/libgnome-desktop/gnome-bg.c
@@ -744,7 +744,8 @@ draw_color (GnomeBG *bg,
 static void
 draw_color_each_monitor (GnomeBG *bg,
                         GdkPixbuf *dest,
-                        GdkScreen *screen)
+                        GdkScreen *screen,
+                        gint scale)
 {
        GdkRectangle rect;
        gint num_monitors;
@@ -753,6 +754,10 @@ draw_color_each_monitor (GnomeBG *bg,
        num_monitors = gdk_screen_get_n_monitors (screen);
        for (monitor = 0; monitor < num_monitors; monitor++) {
                gdk_screen_get_monitor_geometry (screen, monitor, &rect);
+               rect.x *= scale;
+               rect.y *= scale;
+               rect.width *= scale;
+               rect.height *= scale;
                draw_color_area (bg, dest, &rect);
        }
 }
@@ -936,7 +941,8 @@ draw_once (GnomeBG   *bg,
 static void
 draw_each_monitor (GnomeBG   *bg,
                   GdkPixbuf *dest,
-                  GdkScreen *screen)
+                  GdkScreen *screen,
+                  gint       scale)
 {
        GdkRectangle rect;
        gint num_monitors;
@@ -946,6 +952,10 @@ draw_each_monitor (GnomeBG   *bg,
        for (monitor = 0; monitor < num_monitors; monitor++) {
                GdkPixbuf *pixbuf;
                gdk_screen_get_monitor_geometry (screen, monitor, &rect);
+               rect.x *= scale;
+               rect.y *= scale;
+               rect.width *= scale;
+               rect.height *= scale;
                pixbuf = get_pixbuf_for_size (bg, monitor, rect.width, rect.height);
                if (pixbuf) {
                        draw_image_area (bg,
@@ -967,9 +977,29 @@ gnome_bg_draw (GnomeBG *bg,
                return;
 
        if (is_root && (bg->placement != G_DESKTOP_BACKGROUND_STYLE_SPANNED)) {
-               draw_color_each_monitor (bg, dest, screen);
+               draw_color_each_monitor (bg, dest, screen, 1);
                if (bg->placement != G_DESKTOP_BACKGROUND_STYLE_NONE) {
-                       draw_each_monitor (bg, dest, screen);
+                       draw_each_monitor (bg, dest, screen, 1);
+               }
+       } else {
+               draw_color (bg, dest);
+               if (bg->placement != G_DESKTOP_BACKGROUND_STYLE_NONE) {
+                       draw_once (bg, dest);
+               }
+       }
+}
+
+static void
+gnome_bg_draw_at_scale (GnomeBG   *bg,
+                       GdkPixbuf *dest,
+                       gint       scale,
+                       GdkScreen *screen,
+                       gboolean   is_root)
+{
+       if (is_root && (bg->placement != G_DESKTOP_BACKGROUND_STYLE_SPANNED)) {
+               draw_color_each_monitor (bg, dest, screen, scale);
+               if (bg->placement != G_DESKTOP_BACKGROUND_STYLE_NONE) {
+                       draw_each_monitor (bg, dest, screen, scale);
                }
        } else {
                draw_color (bg, dest);
@@ -1054,6 +1084,7 @@ gnome_bg_create_surface (GnomeBG      *bg,
                         int         height,
                         gboolean     root)
 {
+       gint scale;
        int pm_width, pm_height;
        cairo_surface_t *surface;
        GdkRGBA average;
@@ -1062,6 +1093,8 @@ gnome_bg_create_surface (GnomeBG      *bg,
        g_return_val_if_fail (bg != NULL, NULL);
        g_return_val_if_fail (window != NULL, NULL);
 
+       scale = gdk_window_get_scale_factor (window);
+
         if (bg->pixbuf_cache &&
             gdk_pixbuf_get_width (bg->pixbuf_cache) != width &&
             gdk_pixbuf_get_height (bg->pixbuf_cache) != height) {
@@ -1074,7 +1107,8 @@ gnome_bg_create_surface (GnomeBG      *bg,
        
        if (root) {
                surface = make_root_pixmap (gdk_window_get_screen (window),
-                                          pm_width, pm_height);
+                                           scale * pm_width,  scale * pm_height);
+               cairo_surface_set_device_scale (surface, scale, scale);
        }
        else {
                surface = gdk_window_create_similar_surface (window,
@@ -1092,12 +1126,17 @@ gnome_bg_create_surface (GnomeBG            *bg,
        }
        else {
                GdkPixbuf *pixbuf;
+               cairo_surface_t *pixbuf_surface;
                
                pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
-                                        width, height);
-               gnome_bg_draw (bg, pixbuf, gdk_window_get_screen (window), root);
-               gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+                                        scale * width, scale * height);
+               gnome_bg_draw_at_scale (bg, pixbuf, scale, gdk_window_get_screen (window), root);
                pixbuf_average_value (pixbuf, &average);
+
+               pixbuf_surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 0, window);
+               cairo_set_source_surface (cr, pixbuf_surface, 0, 0);
+
+               cairo_surface_destroy (pixbuf_surface);
                g_object_unref (pixbuf);
        }
 


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