[PATCH 2/5] user32: Provide some default window_surface lock/unlock functions.

Rémi Bernon rbernon at codeweavers.com
Mon May 10 02:55:10 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/gdi32/dibdrv/dc.c        |  6 ++---
 dlls/user32/painting.c        |  4 +--
 dlls/wineandroid.drv/window.c | 48 ++++++++++-------------------------
 dlls/winemac.drv/surface.c    | 12 ++++-----
 dlls/winemac.drv/window.c     | 12 ++++-----
 dlls/winex11.drv/bitblt.c     | 40 ++++++++---------------------
 dlls/winex11.drv/window.c     |  4 +--
 include/wine/gdi_driver.h     | 12 +++++++++
 8 files changed, 55 insertions(+), 83 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 7fd404fc2cb..f8b26dc2b8e 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -784,20 +784,20 @@ static inline struct windrv_physdev *get_windrv_physdev( PHYSDEV dev )
 static inline void lock_surface( struct windrv_physdev *dev )
 {
     GDI_CheckNotLock();
-    dev->surface->funcs->lock( dev->surface );
+    window_surface_lock( dev->surface );
     if (is_rect_empty( dev->dibdrv->bounds )) dev->start_ticks = GetTickCount();
 }
 
 static inline void unlock_surface( struct windrv_physdev *dev )
 {
-    dev->surface->funcs->unlock( dev->surface );
+    window_surface_unlock( dev->surface );
     if (GetTickCount() - dev->start_ticks > FLUSH_PERIOD) dev->surface->funcs->flush( dev->surface );
 }
 
 static void CDECL unlock_bits_surface( struct gdi_image_bits *bits )
 {
     struct window_surface *surface = bits->param;
-    surface->funcs->unlock( surface );
+    window_surface_unlock( surface );
 }
 
 void dibdrv_set_window_surface( DC *dc, struct window_surface *surface )
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index db244ff04a5..47ea45ee86d 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -777,12 +777,12 @@ static void copy_bits_from_surface( HWND hwnd, struct window_surface *surface,
     HDC hdc = GetDCEx( hwnd, rgn, DCX_CACHE | DCX_WINDOW | DCX_EXCLUDERGN );
 
     bits = surface->funcs->get_info( surface, info );
-    surface->funcs->lock( surface );
+    window_surface_lock( surface );
     SetDIBitsToDevice( hdc, dst->left, dst->top, dst->right - dst->left, dst->bottom - dst->top,
                        src->left - surface->rect.left, surface->rect.bottom - src->bottom,
                        0, surface->rect.bottom - surface->rect.top,
                        bits, info, DIB_RGB_COLORS );
-    surface->funcs->unlock( surface );
+    window_surface_unlock( surface );
     ReleaseDC( hwnd, hdc );
 }
 
diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
index 902f5980d13..53b0ef5a11e 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -652,26 +652,6 @@ static void apply_line_region( DWORD *dst, int width, int x, int y, const RECT *
     if (width > 0) memset( dst, 0, width * sizeof(*dst) );
 }
 
-/***********************************************************************
- *           android_surface_lock
- */
-static void CDECL android_surface_lock( struct window_surface *window_surface )
-{
-    struct android_window_surface *surface = get_android_surface( window_surface );
-
-    EnterCriticalSection( &surface->header.cs );
-}
-
-/***********************************************************************
- *           android_surface_unlock
- */
-static void CDECL android_surface_unlock( struct window_surface *window_surface )
-{
-    struct android_window_surface *surface = get_android_surface( window_surface );
-
-    LeaveCriticalSection( &surface->header.cs );
-}
-
 /***********************************************************************
  *           android_surface_get_bitmap_info
  */
@@ -702,7 +682,7 @@ static void CDECL android_surface_set_region( struct window_surface *window_surf
 
     TRACE( "updating surface %p hwnd %p with %p\n", surface, surface->hwnd, region );
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     if (!region)
     {
         if (surface->region) DeleteObject( surface->region );
@@ -713,7 +693,7 @@ static void CDECL android_surface_set_region( struct window_surface *window_surf
         if (!surface->region) surface->region = CreateRectRgn( 0, 0, 0, 0 );
         CombineRgn( surface->region, region, 0, RGN_COPY );
     }
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
     set_surface_region( &surface->header, (HRGN)1 );
 }
 
@@ -728,12 +708,12 @@ static void CDECL android_surface_flush( struct window_surface *window_surface )
     RECT rect;
     BOOL needs_flush;
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     SetRect( &rect, 0, 0, surface->header.rect.right - surface->header.rect.left,
              surface->header.rect.bottom - surface->header.rect.top );
     needs_flush = IntersectRect( &rect, &rect, &surface->bounds );
     reset_bounds( &surface->bounds );
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
     if (!needs_flush) return;
 
     TRACE( "flushing %p hwnd %p surface %s rect %s bits %p alpha %02x key %08x region %u rects\n",
@@ -820,8 +800,8 @@ static void CDECL android_surface_destroy( struct window_surface *window_surface
 
 static const struct window_surface_funcs android_surface_funcs =
 {
-    android_surface_lock,
-    android_surface_unlock,
+    NULL,
+    NULL,
     android_surface_get_bitmap_info,
     android_surface_get_bounds,
     android_surface_set_region,
@@ -893,11 +873,11 @@ static void set_surface_region( struct window_surface *window_surface, HRGN win_
     }
 
 done:
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     HeapFree( GetProcessHeap(), 0, surface->region_data );
     surface->region_data = data;
     *window_surface->funcs->get_bounds( window_surface ) = surface->header.rect;
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
     if (region != win_region) DeleteObject( region );
 }
 
@@ -956,14 +936,14 @@ static void set_surface_layered( struct window_surface *window_surface, BYTE alp
 
     if (window_surface->funcs != &android_surface_funcs) return;  /* we may get the null surface */
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     prev_key = surface->color_key;
     prev_alpha = surface->alpha;
     surface->alpha = alpha;
     set_color_key( surface, color_key );
     if (alpha != prev_alpha || surface->color_key != prev_key)  /* refresh */
         *window_surface->funcs->get_bounds( window_surface ) = surface->header.rect;
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
 }
 
 /***********************************************************************
@@ -1582,7 +1562,7 @@ BOOL CDECL ANDROID_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
 
     SelectObject( hdc, dib );
 
-    surface->funcs->lock( surface );
+    window_surface_lock( surface );
 
     if (info->prcDirty)
     {
@@ -1604,7 +1584,7 @@ BOOL CDECL ANDROID_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
         add_bounds_rect( surface->funcs->get_bounds( surface ), &rect );
     }
 
-    surface->funcs->unlock( surface );
+    window_surface_unlock( surface );
     surface->funcs->flush( surface );
 
 done:
@@ -1634,9 +1614,9 @@ LRESULT CDECL ANDROID_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
             struct window_surface *surface = data->surface;
             if (surface)
             {
-                surface->funcs->lock( surface );
+                window_surface_lock( surface );
                 *surface->funcs->get_bounds( surface ) = surface->rect;
-                surface->funcs->unlock( surface );
+                window_surface_unlock( surface );
                 if (is_argb_surface( surface )) surface->funcs->flush( surface );
             }
             release_win_data( data );
diff --git a/dlls/winemac.drv/surface.c b/dlls/winemac.drv/surface.c
index 7be1b6850e0..65bbe31b89d 100644
--- a/dlls/winemac.drv/surface.c
+++ b/dlls/winemac.drv/surface.c
@@ -144,7 +144,7 @@ static void CDECL macdrv_surface_set_region(struct window_surface *window_surfac
 
     TRACE("updating surface %p with %p\n", surface, region);
 
-    window_surface->funcs->lock(window_surface);
+    window_surface_lock(window_surface);
 
     if (region)
     {
@@ -158,7 +158,7 @@ static void CDECL macdrv_surface_set_region(struct window_surface *window_surfac
     }
     update_blit_data(surface);
 
-    window_surface->funcs->unlock(window_surface);
+    window_surface_unlock(window_surface);
 }
 
 /***********************************************************************
@@ -170,7 +170,7 @@ static void CDECL macdrv_surface_flush(struct window_surface *window_surface)
     CGRect rect;
     HRGN region;
 
-    window_surface->funcs->lock(window_surface);
+    window_surface_lock(window_surface);
 
     TRACE("flushing %p %s bounds %s bits %p\n", surface, wine_dbgstr_rect(&surface->header.rect),
           wine_dbgstr_rect(&surface->bounds), surface->bits);
@@ -191,7 +191,7 @@ static void CDECL macdrv_surface_flush(struct window_surface *window_surface)
     update_blit_data(surface);
     reset_bounds(&surface->bounds);
 
-    window_surface->funcs->unlock(window_surface);
+    window_surface_unlock(window_surface);
 
     if (!CGRectIsEmpty(rect))
         macdrv_window_needs_display(surface->window, rect);
@@ -428,7 +428,7 @@ void surface_clip_to_visible_rect(struct window_surface *window_surface, const R
     struct macdrv_window_surface *surface = get_mac_surface(window_surface);
 
     if (!surface) return;
-    window_surface->funcs->lock(window_surface);
+    window_surface_lock(window_surface);
 
     if (surface->drawn)
     {
@@ -447,5 +447,5 @@ void surface_clip_to_visible_rect(struct window_surface *window_surface, const R
         }
     }
 
-    window_surface->funcs->unlock(window_surface);
+    window_surface_unlock(window_surface);
 }
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index e7f5327fcdc..f2f53520e31 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -507,10 +507,10 @@ static void sync_window_opacity(struct macdrv_win_data *data, COLORREF key, BYTE
 
         rect = data->whole_rect;
         OffsetRect(&rect, -data->whole_rect.left, -data->whole_rect.top);
-        data->surface->funcs->lock(data->surface);
+        window_surface_lock(data->surface);
         bounds = data->surface->funcs->get_bounds(data->surface);
         add_bounds_rect(bounds, &rect);
-        data->surface->funcs->unlock(data->surface);
+        window_surface_unlock(data->surface);
     }
 }
 
@@ -1938,9 +1938,9 @@ BOOL CDECL macdrv_UpdateLayeredWindow(HWND hwnd, const UPDATELAYEREDWINDOWINFO *
     if (info->prcDirty)
     {
         IntersectRect(&rect, &rect, info->prcDirty);
-        surface->funcs->lock(surface);
+        window_surface_lock(surface);
         memcpy(src_bits, dst_bits, bmi->bmiHeader.biSizeImage);
-        surface->funcs->unlock(surface);
+        window_surface_unlock(surface);
         PatBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, BLACKNESS);
     }
     src_rect = rect;
@@ -1957,10 +1957,10 @@ BOOL CDECL macdrv_UpdateLayeredWindow(HWND hwnd, const UPDATELAYEREDWINDOWINFO *
     {
         if (surface == data->surface)
         {
-            surface->funcs->lock(surface);
+            window_surface_lock(surface);
             memcpy(dst_bits, src_bits, bmi->bmiHeader.biSizeImage);
             add_bounds_rect(surface->funcs->get_bounds(surface), &rect);
-            surface->funcs->unlock(surface);
+            window_surface_unlock(surface);
             surface->funcs->flush(surface);
         }
 
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index b931fd88da3..731be11a181 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -1813,26 +1813,6 @@ failed:
 }
 #endif /* HAVE_LIBXXSHM */
 
-/***********************************************************************
- *           x11drv_surface_lock
- */
-static void CDECL x11drv_surface_lock( struct window_surface *window_surface )
-{
-    struct x11drv_window_surface *surface = get_x11_surface( window_surface );
-
-    EnterCriticalSection( &surface->header.cs );
-}
-
-/***********************************************************************
- *           x11drv_surface_unlock
- */
-static void CDECL x11drv_surface_unlock( struct window_surface *window_surface )
-{
-    struct x11drv_window_surface *surface = get_x11_surface( window_surface );
-
-    LeaveCriticalSection( &surface->header.cs );
-}
-
 /***********************************************************************
  *           x11drv_surface_get_bitmap_info
  */
@@ -1864,7 +1844,7 @@ static void CDECL x11drv_surface_set_region( struct window_surface *window_surfa
 
     TRACE( "updating surface %p with %p\n", surface, region );
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     if (!region)
     {
         if (surface->region) DeleteObject( surface->region );
@@ -1882,7 +1862,7 @@ static void CDECL x11drv_surface_set_region( struct window_surface *window_surfa
             HeapFree( GetProcessHeap(), 0, data );
         }
     }
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
 }
 
 /***********************************************************************
@@ -1895,7 +1875,7 @@ static void CDECL x11drv_surface_flush( struct window_surface *window_surface )
     unsigned char *dst = (unsigned char *)surface->image->data;
     struct bitblt_coords coords;
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     coords.x = 0;
     coords.y = 0;
     coords.width  = surface->header.rect.right - surface->header.rect.left;
@@ -1949,7 +1929,7 @@ static void CDECL x11drv_surface_flush( struct window_surface *window_surface )
         XFlush( gdi_display );
     }
     reset_bounds( &surface->bounds );
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
 }
 
 /***********************************************************************
@@ -1984,8 +1964,8 @@ static void CDECL x11drv_surface_destroy( struct window_surface *window_surface
 
 static const struct window_surface_funcs x11drv_surface_funcs =
 {
-    x11drv_surface_lock,
-    x11drv_surface_unlock,
+    NULL,
+    NULL,
     x11drv_surface_get_bitmap_info,
     x11drv_surface_get_bounds,
     x11drv_surface_set_region,
@@ -2075,11 +2055,11 @@ void set_surface_color_key( struct window_surface *window_surface, COLORREF colo
 
     if (window_surface->funcs != &x11drv_surface_funcs) return;  /* we may get the null surface */
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     prev = surface->color_key;
     set_color_key( surface, color_key );
     if (surface->color_key != prev) update_surface_region( surface );
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
 }
 
 /***********************************************************************
@@ -2093,7 +2073,7 @@ HRGN expose_surface( struct window_surface *window_surface, const RECT *rect )
 
     if (window_surface->funcs != &x11drv_surface_funcs) return 0;  /* we may get the null surface */
 
-    window_surface->funcs->lock( window_surface );
+    window_surface_lock( window_surface );
     OffsetRect( &rc, -window_surface->rect.left, -window_surface->rect.top );
     add_bounds_rect( &surface->bounds, &rc );
     if (surface->region)
@@ -2105,6 +2085,6 @@ HRGN expose_surface( struct window_surface *window_surface, const RECT *rect )
             region = 0;
         }
     }
-    window_surface->funcs->unlock( window_surface );
+    window_surface_unlock( window_surface );
     return region;
 }
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index b3ae5c54408..c79305963b9 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2742,7 +2742,7 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
 
     SelectObject( hdc, dib );
 
-    surface->funcs->lock( surface );
+    window_surface_lock( surface );
 
     if (info->prcDirty)
     {
@@ -2764,7 +2764,7 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
         add_bounds_rect( surface->funcs->get_bounds( surface ), &rect );
     }
 
-    surface->funcs->unlock( surface );
+    window_surface_unlock( surface );
     surface->funcs->flush( surface );
 
 done:
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 6c700664eb5..0667b3758a3 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -268,6 +268,18 @@ static inline ULONG window_surface_release( struct window_surface *surface )
     return ret;
 }
 
+static inline void window_surface_lock( struct window_surface *surface )
+{
+    if (surface->funcs->lock) surface->funcs->lock( surface );
+    else EnterCriticalSection( &surface->cs );
+}
+
+static inline void window_surface_unlock( struct window_surface *surface )
+{
+    if (surface->funcs->unlock) surface->funcs->unlock( surface );
+    else LeaveCriticalSection( &surface->cs );
+}
+
 /* the DC hook support is only exported on Win16, the 32-bit version is a Wine extension */
 
 #define DCHC_INVALIDVISRGN      0x0001
-- 
2.31.0




More information about the wine-devel mailing list