Alexandre Julliard : gdi32: Don't hold the GDI lock when calling DC_InitDC.
Alexandre Julliard
julliard at winehq.org
Wed Feb 6 07:27:44 CST 2008
Module: wine
Branch: master
Commit: 630c976f8829a0a338373ca212f2e12de1c88f53
URL: http://source.winehq.org/git/wine.git/?a=commit;h=630c976f8829a0a338373ca212f2e12de1c88f53
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Feb 5 18:26:18 2008 +0100
gdi32: Don't hold the GDI lock when calling DC_InitDC.
---
dlls/gdi32/bitmap.c | 27 ++++++++++++++++-----------
1 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index de2fdae..a873457 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -576,13 +576,8 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
BITMAPOBJ *bitmap;
DC *dc;
- if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC ))) return 0;
+ if (!(dc = get_dc_ptr( hdc ))) return 0;
- if (!(dc = get_dc_ptr( hdc )))
- {
- GDI_ReleaseObj( handle );
- return 0;
- }
if (GetObjectType( hdc ) != OBJ_MEMDC)
{
ret = 0;
@@ -591,34 +586,44 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
ret = dc->hBitmap;
if (handle == dc->hBitmap) goto done; /* nothing to do */
+ if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC )))
+ {
+ ret = 0;
+ goto done;
+ }
+
if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP)))
{
WARN( "Bitmap already selected in another DC\n" );
+ GDI_ReleaseObj( handle );
ret = 0;
goto done;
}
if (!bitmap->funcs && !BITMAP_SetOwnerDC( handle, dc ))
{
+ GDI_ReleaseObj( handle );
ret = 0;
goto done;
}
- if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle );
-
- if (handle)
+ if (dc->funcs->pSelectBitmap && !dc->funcs->pSelectBitmap( dc->physDev, handle ))
+ {
+ GDI_ReleaseObj( handle );
+ ret = 0;
+ }
+ else
{
dc->hBitmap = handle;
GDI_inc_ref_count( handle );
dc->dirty = 0;
SetRectRgn( dc->hVisRgn, 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
+ GDI_ReleaseObj( handle );
DC_InitDC( dc );
GDI_dec_ref_count( ret );
}
- else ret = 0;
done:
- GDI_ReleaseObj( handle );
release_dc_ptr( dc );
return ret;
}
More information about the wine-cvs
mailing list