Improved stability of fl_read_image (STR #2021)
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6476 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
0490b30383
commit
b989051bd6
5
CHANGES
5
CHANGES
@ -1,5 +1,6 @@
|
||||
CHANGES IN FLTK 1.3.0
|
||||
|
||||
- Improved stability of fl_read_image (STR #2021)
|
||||
- Fixed adding an idle handler during
|
||||
a draw() call (STR #1950)
|
||||
- Fl_Group::clip_children() is now public (STR #2017)
|
||||
@ -25,7 +26,9 @@ CHANGES IN FLTK 1.3.0
|
||||
Fl_Value_Input, and Fl_Text_Display derived
|
||||
widgets (STR #1770)
|
||||
- Initial setup (STR #1904)
|
||||
- winsock dll is dynamically loaded and by default ws2_32.dll, use of winsock1 is still possible by defining USE_WSOCK1 at compile time.
|
||||
- winsock dll is dynamically loaded and by default
|
||||
ws2_32.dll, use of winsock1 is still possible by defining
|
||||
USE_WSOCK1 at compile time.
|
||||
- Cairo support: added --enable-cairo and --enable-cairoext
|
||||
configure options.
|
||||
- Now vc2005 devenv in ide subdirectory
|
||||
|
@ -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,12 +160,15 @@ 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)) {
|
||||
XDestroyImage(image);
|
||||
return 0;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user