Module: wine Branch: master Commit: 8e6548573233ecdb85a01ac8f6f48456fd259147 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8e6548573233ecdb85a01ac8f6...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Dec 3 15:27:04 2012 +0100
winex11: Fall back to normal expose processing for areas outside of the surface region.
---
dlls/winex11.drv/bitblt.c | 23 +++++++++++++++++++++++ dlls/winex11.drv/event.c | 23 +++++++++++++---------- dlls/winex11.drv/x11drv.h | 1 + 3 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index c5a6bd0..161fa73 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -2062,3 +2062,26 @@ void set_surface_color_key( struct window_surface *window_surface, COLORREF colo if (surface->color_key != prev) update_surface_region( surface ); window_surface->funcs->unlock( window_surface ); } + +/*********************************************************************** + * expose_surface + */ +HRGN expose_surface( struct window_surface *window_surface, const RECT *rect ) +{ + struct x11drv_window_surface *surface = get_x11_surface( window_surface ); + HRGN region = 0; + + window_surface->funcs->lock( window_surface ); + add_bounds_rect( &surface->bounds, rect ); + if (surface->region) + { + region = CreateRectRgnIndirect( rect ); + if (CombineRgn( region, region, surface->region, RGN_DIFF ) <= NULLREGION) + { + DeleteObject( region ); + region = 0; + } + } + window_surface->funcs->unlock( window_surface ); + return region; +} diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index f908413..90b2068 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -816,7 +816,8 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev ) XExposeEvent *event = &xev->xexpose; RECT rect; struct x11drv_win_data *data; - int flags = RDW_INVALIDATE | RDW_ERASE | RDW_FRAME; + HRGN surface_region = 0; + UINT flags = RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN;
TRACE( "win %p (%lx) %d,%d %dx%d\n", hwnd, event->window, event->x, event->y, event->width, event->height ); @@ -830,9 +831,8 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
if (data->surface) { - data->surface->funcs->lock( data->surface ); - add_bounds_rect( data->surface->funcs->get_bounds( data->surface ), &rect ); - data->surface->funcs->unlock( data->surface ); + surface_region = expose_surface( data->surface, &rect ); + if (!surface_region) flags = 0; if (data->vis.visualid != default_visual.visualid) data->surface->funcs->flush( data->surface ); } @@ -841,6 +841,8 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev ) { OffsetRect( &rect, data->whole_rect.left - data->client_rect.left, data->whole_rect.top - data->client_rect.top ); + if (surface_region) OffsetRgn( surface_region, data->whole_rect.left - data->client_rect.left, + data->whole_rect.top - data->client_rect.top );
if (GetWindowLongW( data->hwnd, GWL_EXSTYLE ) & WS_EX_LAYOUTRTL) mirror_rect( &data->client_rect, &rect ); @@ -855,15 +857,16 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev ) wine_server_call( req ); } SERVER_END_REQ; - - flags |= RDW_ALLCHILDREN; } - else OffsetRect( &rect, virtual_screen_rect.left, virtual_screen_rect.top ); - - if (data->surface) flags = 0; + else + { + OffsetRect( &rect, virtual_screen_rect.left, virtual_screen_rect.top ); + flags &= ~RDW_ALLCHILDREN; + } release_win_data( data );
- if (flags) RedrawWindow( hwnd, &rect, 0, flags ); + if (flags) RedrawWindow( hwnd, &rect, surface_region, flags ); + if (surface_region) DeleteObject( surface_region ); }
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 314a438..0c462d6 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -200,6 +200,7 @@ extern DWORD get_pixmap_image( Pixmap pixmap, int width, int height, const XVisu extern struct window_surface *create_surface( Window window, const XVisualInfo *vis, const RECT *rect, COLORREF color_key, BOOL use_alpha ) DECLSPEC_HIDDEN; extern void set_surface_color_key( struct window_surface *window_surface, COLORREF color_key ) DECLSPEC_HIDDEN; +extern HRGN expose_surface( struct window_surface *window_surface, const RECT *rect ) DECLSPEC_HIDDEN;
extern RGNDATA *X11DRV_GetRegionData( HRGN hrgn, HDC hdc_lptodp ) DECLSPEC_HIDDEN; extern BOOL add_extra_clipping_region( X11DRV_PDEVICE *dev, HRGN rgn ) DECLSPEC_HIDDEN;