]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash when using XRender and restoring image from X (bug#44930)
authorAlan Third <alan@idiocy.org>
Sat, 5 Dec 2020 19:40:08 +0000 (19:40 +0000)
committerAlan Third <alan@idiocy.org>
Sat, 12 Dec 2020 10:30:39 +0000 (10:30 +0000)
* 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.

src/dispextern.h
src/image.c

index 6b72e68d315bf1208fff2ff950925b4463245622..44556276ff50dfa098c8f268597ad399e292e390 100644 (file)
@@ -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
index 956fb1325ed8ef00d157f84798a2d04e936c9bf8..7beb135f65c5eef7c06ce0c7767acc33ade477db 100644 (file)
@@ -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);