Module: wine Branch: master Commit: ac63239cc01769bad31603798bea59dfbd46392a URL: https://gitlab.winehq.org/wine/wine/-/commit/ac63239cc01769bad31603798bea59d...
Author: Rémi Bernon rbernon@codeweavers.com Date: Tue May 28 09:39:28 2024 +0200
win32u: Introduce a new window_surface_init helper.
---
dlls/win32u/dce.c | 25 +++++++++++++++++++++---- dlls/wineandroid.drv/window.c | 5 ++--- dlls/winemac.drv/surface.c | 4 +--- dlls/winewayland.drv/window_surface.c | 5 ++--- dlls/winex11.drv/bitblt.c | 5 ++--- include/wine/gdi_driver.h | 14 +++----------- 6 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index 491c21f0ff5..f8e9b0bbe6e 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -219,10 +219,7 @@ void create_offscreen_window_surface( const RECT *visible_rect, struct window_su *surface = NULL; size = surface_rect.right * surface_rect.bottom * 4; if (!(impl = calloc(1, offsetof( struct offscreen_window_surface, info.bmiColors[0] ) + size))) return; - - impl->header.funcs = &offscreen_window_surface_funcs; - impl->header.ref = 1; - impl->header.rect = surface_rect; + window_surface_init( &impl->header, &offscreen_window_surface_funcs, &surface_rect );
pthread_mutex_init( &impl->mutex, NULL );
@@ -242,6 +239,26 @@ void create_offscreen_window_surface( const RECT *visible_rect, struct window_su *surface = &impl->header; }
+/* window surface common helpers */ + +W32KAPI void window_surface_init( struct window_surface *surface, const struct window_surface_funcs *funcs, const RECT *rect ) +{ + surface->funcs = funcs; + surface->ref = 1; + surface->rect = *rect; +} + +W32KAPI void window_surface_add_ref( struct window_surface *surface ) +{ + InterlockedIncrement( &surface->ref ); +} + +W32KAPI void window_surface_release( struct window_surface *surface ) +{ + ULONG ret = InterlockedDecrement( &surface->ref ); + if (!ret) surface->funcs->destroy( surface ); +} + /******************************************************************* * register_window_surface * diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index 0ba9123c1ba..7397e1758f4 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -905,6 +905,8 @@ static struct window_surface *create_surface( HWND hwnd, const RECT *rect,
surface = calloc( 1, FIELD_OFFSET( struct android_window_surface, info.bmiColors[3] )); if (!surface) return NULL; + window_surface_init( &surface->header, &android_surface_funcs, rect ); + set_color_info( &surface->info, src_alpha ); surface->info.bmiHeader.biWidth = width; surface->info.bmiHeader.biHeight = -height; /* top-down */ @@ -913,9 +915,6 @@ static struct window_surface *create_surface( HWND hwnd, const RECT *rect,
pthread_mutex_init( &surface->mutex, NULL );
- surface->header.funcs = &android_surface_funcs; - surface->header.rect = *rect; - surface->header.ref = 1; surface->hwnd = hwnd; surface->window = get_ioctl_window( hwnd ); surface->alpha = alpha; diff --git a/dlls/winemac.drv/surface.c b/dlls/winemac.drv/surface.c index 65da12912c2..5ec83dd9ebb 100644 --- a/dlls/winemac.drv/surface.c +++ b/dlls/winemac.drv/surface.c @@ -251,6 +251,7 @@ struct window_surface *create_surface(macdrv_window window, const RECT *rect,
surface = calloc(1, FIELD_OFFSET(struct macdrv_window_surface, info.bmiColors[3])); if (!surface) return NULL; + window_surface_init(&surface->header, &macdrv_surface_funcs, rect);
if ((err = pthread_mutex_init(&surface->mutex, NULL))) { @@ -272,9 +273,6 @@ struct window_surface *create_surface(macdrv_window window, const RECT *rect, colors[1] = 0x0000ff00; colors[2] = 0x000000ff;
- surface->header.funcs = &macdrv_surface_funcs; - surface->header.rect = *rect; - surface->header.ref = 1; surface->window = window; reset_bounds(&surface->bounds); if (old_mac_surface && old_mac_surface->drawn) diff --git a/dlls/winewayland.drv/window_surface.c b/dlls/winewayland.drv/window_surface.c index cb5e1539072..37858c825ca 100644 --- a/dlls/winewayland.drv/window_surface.c +++ b/dlls/winewayland.drv/window_surface.c @@ -512,6 +512,8 @@ struct window_surface *wayland_window_surface_create(HWND hwnd, const RECT *rect
wws = calloc(1, sizeof(*wws)); if (!wws) return NULL; + window_surface_init(&wws->header, &wayland_window_surface_funcs, rect); + wws->info.bmiHeader.biSize = sizeof(wws->info.bmiHeader); wws->info.bmiHeader.biClrUsed = 0; wws->info.bmiHeader.biBitCount = 32; @@ -523,9 +525,6 @@ struct window_surface *wayland_window_surface_create(HWND hwnd, const RECT *rect
pthread_mutex_init(&wws->mutex, NULL);
- wws->header.funcs = &wayland_window_surface_funcs; - wws->header.rect = *rect; - wws->header.ref = 1; wws->hwnd = hwnd; reset_bounds(&wws->bounds);
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index 5eccc4a2eb7..a814fdb94b0 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -2021,6 +2021,8 @@ struct window_surface *create_surface( Window window, const XVisualInfo *vis, co
surface = calloc( 1, FIELD_OFFSET( struct x11drv_window_surface, info.bmiColors[colors] )); if (!surface) return NULL; + window_surface_init( &surface->header, &x11drv_surface_funcs, rect ); + surface->info.bmiHeader.biSize = sizeof(surface->info.bmiHeader); surface->info.bmiHeader.biWidth = width; surface->info.bmiHeader.biHeight = -height; /* top-down */ @@ -2031,9 +2033,6 @@ struct window_surface *create_surface( Window window, const XVisualInfo *vis, co
pthread_mutex_init( &surface->mutex, NULL );
- surface->header.funcs = &x11drv_surface_funcs; - surface->header.rect = *rect; - surface->header.ref = 1; surface->window = window; surface->is_argb = (use_alpha && vis->depth == 32 && surface->info.bmiHeader.biCompression == BI_RGB); set_color_key( surface, color_key ); diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 4639a409dab..e1a7f2bbffc 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -223,17 +223,9 @@ struct window_surface /* driver-specific fields here */ };
-static inline ULONG window_surface_add_ref( struct window_surface *surface ) -{ - return InterlockedIncrement( &surface->ref ); -} - -static inline ULONG window_surface_release( struct window_surface *surface ) -{ - ULONG ret = InterlockedDecrement( &surface->ref ); - if (!ret) surface->funcs->destroy( surface ); - return ret; -} +W32KAPI void window_surface_init( struct window_surface *surface, const struct window_surface_funcs *funcs, const RECT *rect ); +W32KAPI void window_surface_add_ref( struct window_surface *surface ); +W32KAPI void window_surface_release( struct window_surface *surface );
/* display manager interface, used to initialize display device registry data */