Improved stability of fl_read_image (STR #2021)

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@6475 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher 2008-10-19 20:35:32 +00:00
parent c0a8bd653d
commit b1328f5fdd
2 changed files with 16 additions and 3 deletions

View File

@ -11,6 +11,7 @@ CHANGES IN FLTK 1.1.10
resizing their children (STR #2032)
- Fixed adding an idle handler during
a draw() call (STR #1950)
- Improved stability of fl_read_image (STR #2021)
CHANGES IN FLTK 1.1.9

View File

@ -77,6 +77,11 @@ fl_subimage_offsets(int a, int aw, int b, int bw, int &obw)
return off;
}
// this handler will catch and ignore exceptions during XGetImage
// to avoid an application crash
static int xgetimageerrhandler(Display *display, XErrorEvent *error) {
return 0;
}
//
// 'fl_read_image()' - Read an image from the current window.
@ -135,7 +140,11 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
}
if (!win || (dx >= sx && dy >= sy && dx + w <= sw && dy + h <= sh)) {
// the image is fully contained, we can use the traditional method
// however, if the window is obscured etc. the function will still fail. Make sure we
// catch the error and continue, otherwise an exception will be thrown.
XErrorHandler old_handler = XSetErrorHandler(xgetimageerrhandler);
image = XGetImage(fl_display, fl_window, X, Y, w, h, AllPlanes, ZPixmap);
XSetErrorHandler(old_handler);
} else {
// image is crossing borders, determine visible region
int nw, nh, noffx, noffy;
@ -151,10 +160,13 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
if (!image) {
if (buf) free(buf);
return 0;
}
}
if (!XGetSubImage(fl_display, fl_window, X + noffx, Y + noffy,
nw, nh, AllPlanes, ZPixmap, image, noffx, noffy)) {
XErrorHandler old_handler = XSetErrorHandler(xgetimageerrhandler);
XImage *subimg = XGetSubImage(fl_display, fl_window, X + noffx, Y + noffy,
nw, nh, AllPlanes, ZPixmap, image, noffx, noffy);
XSetErrorHandler(old_handler);
if (!subimg) {
XDestroyImage(image);
return 0;
}