< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c

Print this page

        

@@ -322,10 +322,12 @@
         fp_g_strfreev = dl_symbol("g_strfreev");
 
         /* GDK */
         fp_gdk_get_default_root_window =
             dl_symbol("gdk_get_default_root_window");
+        fp_gdk_window_get_scale_factor =
+                    dl_symbol("gdk_window_get_scale_factor");
 
         /* Pixbuf */
         fp_gdk_pixbuf_new = dl_symbol("gdk_pixbuf_new");
         fp_gdk_pixbuf_new_from_file =
                 dl_symbol("gdk_pixbuf_new_from_file");

@@ -2886,11 +2888,14 @@
                                                                    jint scale) {
     GdkPixbuf *pixbuf;
     jint *ary;
 
     GdkWindow *root = (*fp_gdk_get_default_root_window)();
-    pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(root, x, y, width, height);
+    int win_scale = (*fp_gdk_window_get_scale_factor)(root);
+    pixbuf = (*fp_gdk_pixbuf_get_from_drawable)(
+        root, x, y, (int)(width / (float)win_scale + 0.5), (int)(height / (float)win_scale + 0.5));
+
     if (pixbuf && scale != 1) {
         GdkPixbuf *scaledPixbuf;
         x /= scale;
         y /= scale;
         width /= scale;

@@ -2904,12 +2909,12 @@
     }
 
     if (pixbuf) {
         int nchan = (*fp_gdk_pixbuf_get_n_channels)(pixbuf);
         int stride = (*fp_gdk_pixbuf_get_rowstride)(pixbuf);
-        if ((*fp_gdk_pixbuf_get_width)(pixbuf) == width
-                && (*fp_gdk_pixbuf_get_height)(pixbuf) == height
+        if ((*fp_gdk_pixbuf_get_width)(pixbuf) >= width
+                && (*fp_gdk_pixbuf_get_height)(pixbuf) >= height
                 && (*fp_gdk_pixbuf_get_bits_per_sample)(pixbuf) == 8
                 && (*fp_gdk_pixbuf_get_colorspace)(pixbuf) == GDK_COLORSPACE_RGB
                 && nchan >= 3
                 ) {
             guchar *p, *pix = (*fp_gdk_pixbuf_get_pixels)(pixbuf);
< prev index next >