summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Third <alan@idiocy.org>2020-12-05 19:40:08 +0000
committerAlan Third <alan@idiocy.org>2020-12-12 10:30:39 +0000
commit62a6934af9c110c28fc1f69f4bb1b79ce9d0c43d (patch)
treecaf81eb7b88cd154cf0d203beced8b4879f955e5
parentde032d41c6c9dc143a5d2ddcacdccd20567aee8c (diff)
downloademacs-62a6934af9c110c28fc1f69f4bb1b79ce9d0c43d.tar.gz
Fix crash when using XRender and restoring image from X (bug#44930)
* src/dispextern.h (struct image): Add original dimension elements. * src/image.c (image_set_transform): Store the original dimensions. (image_get_x_image): If we're using transforms use the original dimensions with XGetImage.
-rw-r--r--src/dispextern.h4
-rw-r--r--src/image.c9
2 files changed, 13 insertions, 0 deletions
diff --git a/src/dispextern.h b/src/dispextern.h
index 6b72e68d315..44556276ff5 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3047,6 +3047,10 @@ struct image
# if !defined USE_CAIRO && defined HAVE_XRENDER
/* Picture versions of pixmap and mask for compositing. */
Picture picture, mask_picture;
+
+ /* We need to store the original image dimensions in case we have to
+ call XGetImage. */
+ int original_width, original_height;
# endif
#endif /* HAVE_X_WINDOWS */
#ifdef HAVE_NTGUI
diff --git a/src/image.c b/src/image.c
index 956fb1325ed..7beb135f65c 100644
--- a/src/image.c
+++ b/src/image.c
@@ -2103,6 +2103,10 @@ image_set_transform (struct frame *f, struct image *img)
# if !defined USE_CAIRO && defined HAVE_XRENDER
if (!img->picture)
return;
+
+ /* Store the original dimensions as we'll overwrite them later. */
+ img->original_width = img->width;
+ img->original_height = img->height;
# endif
/* Determine size. */
@@ -2930,6 +2934,11 @@ image_get_x_image (struct frame *f, struct image *img, bool mask_p)
if (ximg_in_img)
return ximg_in_img;
+#ifdef HAVE_XRENDER
+ else if (img->picture)
+ return XGetImage (FRAME_X_DISPLAY (f), !mask_p ? img->pixmap : img->mask,
+ 0, 0, img->original_width, img->original_height, ~0, ZPixmap);
+#endif
else
return XGetImage (FRAME_X_DISPLAY (f), !mask_p ? img->pixmap : img->mask,
0, 0, img->width, img->height, ~0, ZPixmap);