From: Rémi Bernon rbernon@codeweavers.com
Cropping and rounding it similarly to non-layered window surfaces. --- dlls/win32u/driver.c | 6 +++--- dlls/win32u/window.c | 3 ++- dlls/wineandroid.drv/android.h | 2 +- dlls/wineandroid.drv/window.c | 10 +++------- dlls/winemac.drv/surface.c | 10 +++------- dlls/winex11.drv/bitblt.c | 10 +++------- dlls/winex11.drv/x11drv.h | 2 +- 7 files changed, 16 insertions(+), 27 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 7918945b625..4bc49619970 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -867,7 +867,7 @@ static LRESULT nulldrv_SysCommand( HWND hwnd, WPARAM wparam, LPARAM lparam ) return -1; }
-static BOOL nulldrv_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +static BOOL nulldrv_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **surface ) { *surface = NULL; @@ -1217,10 +1217,10 @@ static void loaderdrv_SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) load_driver()->pSetWindowRgn( hwnd, hrgn, redraw ); }
-static BOOL loaderdrv_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +static BOOL loaderdrv_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **surface ) { - return load_driver()->pCreateLayeredWindow( hwnd, window_rect, color_key, surface ); + return load_driver()->pCreateLayeredWindow( hwnd, surface_rect, color_key, surface ); }
static void loaderdrv_UpdateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 2b65bb635c9..b63392b1f2d 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -2202,7 +2202,7 @@ BOOL WINAPI NtUserUpdateLayeredWindow( HWND hwnd, HDC hdc_dst, const POINT *pts_ if (surface) window_surface_release( surface );
if (!(flags & ULW_COLORKEY)) key = CLR_INVALID; - if (!(user_driver->pCreateLayeredWindow( hwnd, &window_rect, key, &surface )) || !surface) return FALSE; + if (!(user_driver->pCreateLayeredWindow( hwnd, &surface_rect, key, &surface )) || !surface) return FALSE;
if (!hdc_src) ret = TRUE; else @@ -2213,6 +2213,7 @@ BOOL WINAPI NtUserUpdateLayeredWindow( HWND hwnd, HDC hdc_dst, const POINT *pts_ HDC hdc = NULL;
OffsetRect( &rect, -rect.left, -rect.top ); + intersect_rect( &rect, &rect, &surface_rect );
if (!(hdc = NtGdiCreateCompatibleDC( 0 ))) goto done; window_surface_lock( surface ); diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index c92240c40bc..3f0329bac10 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -98,7 +98,7 @@ extern void ANDROID_SetParent( HWND hwnd, HWND parent, HWND old_parent ); extern void ANDROID_SetCapture( HWND hwnd, UINT flags ); extern void ANDROID_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ); extern UINT ANDROID_ShowWindow( HWND hwnd, INT cmd, RECT *rect, UINT swp ); -extern BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +extern BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **surface ); extern LRESULT ANDROID_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ); extern BOOL ANDROID_WindowPosChanging( HWND hwnd, UINT swp_flags, const RECT *window_rect, const RECT *client_rect, RECT *visible_rect ); diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index 1ee542455a3..73f2c0b9897 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -1305,18 +1305,14 @@ void ANDROID_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, DW /***************************************************************************** * ANDROID_CreateLayeredWindow */ -BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **window_surface ) { struct window_surface *surface; struct android_win_data *data; - RECT rect;
if (!(data = get_win_data( hwnd ))) return FALSE;
- rect = *window_rect; - OffsetRect( &rect, -window_rect->left, -window_rect->top ); - surface = data->surface; if (!is_argb_surface( surface )) { @@ -1324,9 +1320,9 @@ BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF c surface = NULL; }
- if (!surface || !EqualRect( &surface->rect, &rect )) + if (!surface || !EqualRect( &surface->rect, surface_rect )) { - data->surface = create_surface( data->hwnd, &rect, 255, color_key, TRUE ); + data->surface = create_surface( data->hwnd, surface_rect, 255, color_key, TRUE ); if (surface) window_surface_release( surface ); surface = data->surface; } diff --git a/dlls/winemac.drv/surface.c b/dlls/winemac.drv/surface.c index e4f140a898e..d8a49674a5b 100644 --- a/dlls/winemac.drv/surface.c +++ b/dlls/winemac.drv/surface.c @@ -226,25 +226,21 @@ done: /*********************************************************************** * CreateLayeredWindow (MACDRV.@) */ -BOOL macdrv_CreateLayeredWindow(HWND hwnd, const RECT *window_rect, COLORREF color_key, +BOOL macdrv_CreateLayeredWindow(HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **window_surface) { struct window_surface *surface; struct macdrv_win_data *data; - RECT rect;
if (!(data = get_win_data(hwnd))) return FALSE;
data->layered = TRUE; data->ulw_layered = TRUE;
- rect = *window_rect; - OffsetRect(&rect, -window_rect->left, -window_rect->top); - surface = data->surface; - if (!surface || !EqualRect(&surface->rect, &rect)) + if (!surface || !EqualRect(&surface->rect, surface_rect)) { - data->surface = create_surface(data->hwnd, data->cocoa_window, &rect, NULL, TRUE); + data->surface = create_surface(data->hwnd, data->cocoa_window, surface_rect, NULL, TRUE); if (surface) window_surface_release(surface); surface = data->surface; if (data->unminimized_surface) diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index c28a4d2d9a3..28723425029 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -2172,25 +2172,21 @@ done: /***************************************************************************** * CreateLayeredWindow (X11DRV.@) */ -BOOL X11DRV_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +BOOL X11DRV_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **window_surface ) { struct window_surface *surface; struct x11drv_win_data *data; - RECT rect;
if (!(data = get_win_data( hwnd ))) return FALSE;
data->layered = TRUE; if (!data->embedded && argb_visual.visualid) set_window_visual( data, &argb_visual, TRUE );
- rect = *window_rect; - OffsetRect( &rect, -window_rect->left, -window_rect->top ); - surface = data->surface; - if (!surface || !EqualRect( &surface->rect, &rect )) + if (!surface || !EqualRect( &surface->rect, surface_rect )) { - data->surface = create_surface( data->hwnd, data->whole_window, &data->vis, &rect, + data->surface = create_surface( data->hwnd, data->whole_window, &data->vis, surface_rect, color_key, data->use_alpha ); if (surface) window_surface_release( surface ); surface = data->surface; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 49e4f039b18..1078270eefe 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -240,7 +240,7 @@ extern UINT X11DRV_ShowWindow( HWND hwnd, INT cmd, RECT *rect, UINT swp ); extern LRESULT X11DRV_SysCommand( HWND hwnd, WPARAM wparam, LPARAM lparam ); extern LRESULT X11DRV_ClipboardWindowProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ); extern void X11DRV_UpdateClipboard(void); -extern BOOL X11DRV_CreateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, +extern BOOL X11DRV_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF color_key, struct window_surface **surface ); extern void X11DRV_UpdateLayeredWindow( HWND hwnd, const RECT *window_rect, COLORREF color_key, BYTE alpha, UINT flags );