Jacek Caban : gdi32: Use NtGdiDeleteObjectApp for DeleteDC.
Alexandre Julliard
julliard at winehq.org
Mon Aug 23 16:24:14 CDT 2021
Module: wine
Branch: master
Commit: 9a53f3ae11a17dd218e69a51c9b5000071f084a3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9a53f3ae11a17dd218e69a51c9b5000071f084a3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Aug 23 13:51:01 2021 +0200
gdi32: Use NtGdiDeleteObjectApp for DeleteDC.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/bitblt.c | 8 +++---
dlls/gdi32/dc.c | 73 ++++++++++++++++++++++------------------------------
dlls/gdi32/dib.c | 4 +--
dlls/gdi32/gdidc.c | 9 +++++++
dlls/gdi32/objects.c | 9 ++++++-
5 files changed, 54 insertions(+), 49 deletions(-)
diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index 09bb7a4c683..54c923236ee 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -827,8 +827,8 @@ BOOL WINAPI MaskBlt(HDC hdcDest, INT nXDest, INT nYDest,
DeleteObject(hBitmap2);
DeleteObject(hbrMask);
- DeleteDC(hDC1);
- DeleteDC(hDC2);
+ NtGdiDeleteObjectApp( hDC1 );
+ NtGdiDeleteObjectApp( hDC2 );
return TRUE;
}
@@ -923,12 +923,12 @@ error:
SetTextColor(hdcDest, oldForeground);
if(hdcWork) {
NtGdiSelectBitmap(hdcWork, oldWork);
- DeleteDC(hdcWork);
+ NtGdiDeleteObjectApp( hdcWork );
}
if(bmpWork) DeleteObject(bmpWork);
if(hdcMask) {
NtGdiSelectBitmap(hdcMask, oldMask);
- DeleteDC(hdcMask);
+ NtGdiDeleteObjectApp( hdcMask );
}
if(bmpMask) DeleteObject(bmpMask);
return ret;
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index fa15b43fc8b..2414c41d785 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -256,15 +256,6 @@ void update_dc( DC *dc )
}
-/***********************************************************************
- * DC_DeleteObject
- */
-static BOOL DC_DeleteObject( HGDIOBJ handle )
-{
- return DeleteDC( handle );
-}
-
-
static void set_bk_color( DC *dc, COLORREF color )
{
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetBkColor );
@@ -431,6 +422,37 @@ static BOOL reset_dc_state( HDC hdc )
}
+/***********************************************************************
+ * DC_DeleteObject
+ */
+static BOOL DC_DeleteObject( HGDIOBJ handle )
+{
+ DC *dc;
+
+ TRACE( "%p\n", handle );
+
+ GDI_CheckNotLock();
+
+ if (!(dc = get_dc_ptr( handle ))) return FALSE;
+ if (dc->refcount != 1)
+ {
+ FIXME( "not deleting busy DC %p refcount %u\n", dc->hSelf, dc->refcount );
+ release_dc_ptr( dc );
+ return FALSE;
+ }
+
+ /* Call hook procedure to check whether is it OK to delete this DC */
+ if (dc->hookProc && !dc->hookProc( dc->hSelf, DCHC_DELETEDC, dc->dwHookData, 0 ))
+ {
+ release_dc_ptr( dc );
+ return TRUE;
+ }
+ reset_dc_state( handle );
+ free_dc_ptr( dc );
+ return TRUE;
+}
+
+
/***********************************************************************
* NtGdiSaveDC (win32u.@)
*/
@@ -736,39 +758,6 @@ HDC WINAPI NtGdiCreateCompatibleDC( HDC hdc )
}
-/***********************************************************************
- * DeleteDC (GDI32.@)
- */
-BOOL WINAPI DeleteDC( HDC hdc )
-{
- DC * dc;
-
- TRACE("%p\n", hdc );
-
- if (is_meta_dc( hdc )) return METADC_DeleteDC( hdc );
-
- GDI_CheckNotLock();
-
- if (!(dc = get_dc_ptr( hdc ))) return FALSE;
- if (dc->refcount != 1)
- {
- FIXME( "not deleting busy DC %p refcount %u\n", dc->hSelf, dc->refcount );
- release_dc_ptr( dc );
- return FALSE;
- }
-
- /* Call hook procedure to check whether is it OK to delete this DC */
- if (dc->hookProc && !dc->hookProc( dc->hSelf, DCHC_DELETEDC, dc->dwHookData, 0 ))
- {
- release_dc_ptr( dc );
- return TRUE;
- }
- reset_dc_state( hdc );
- free_dc_ptr( dc );
- return TRUE;
-}
-
-
/***********************************************************************
* NtGdiResetDC (win32u.@)
*/
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 7da248079b2..de1942894de 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -1687,7 +1687,7 @@ NTSTATUS WINAPI D3DKMTCreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc )
error:
if (bmp) HeapFree( GetProcessHeap(), 0, bmp->color_table );
HeapFree( GetProcessHeap(), 0, bmp );
- DeleteDC( dc );
+ NtGdiDeleteObjectApp( dc );
return STATUS_INVALID_PARAMETER;
}
@@ -1704,7 +1704,7 @@ NTSTATUS WINAPI D3DKMTDestroyDCFromMemory( const D3DKMT_DESTROYDCFROMMEMORY *des
if (GetObjectType( desc->hDc ) != OBJ_MEMDC ||
GetObjectType( desc->hBitmap ) != OBJ_BITMAP) return STATUS_INVALID_PARAMETER;
DeleteObject( desc->hBitmap );
- DeleteDC( desc->hDc );
+ NtGdiDeleteObjectApp( desc->hDc );
return STATUS_SUCCESS;
}
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 0b005944f93..af529fdb8e9 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -95,6 +95,15 @@ HDC WINAPI CreateICW( const WCHAR *driver, const WCHAR *device, const WCHAR *out
return CreateDCW( driver, device, output, init_data );
}
+/***********************************************************************
+ * DeleteDC (GDI32.@)
+ */
+BOOL WINAPI DeleteDC( HDC hdc )
+{
+ if (is_meta_dc( hdc )) return METADC_DeleteDC( hdc );
+ return NtGdiDeleteObjectApp( hdc );
+}
+
/***********************************************************************
* ResetDCA (GDI32.@)
*/
diff --git a/dlls/gdi32/objects.c b/dlls/gdi32/objects.c
index 3ae836612c4..3acafbc9331 100644
--- a/dlls/gdi32/objects.c
+++ b/dlls/gdi32/objects.c
@@ -153,7 +153,14 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
struct hdc_list *hdc_list = NULL;
struct wine_rb_entry *entry;
- if (is_meta_dc( obj )) return METADC_DeleteDC( obj );
+ switch (gdi_handle_type( obj ))
+ {
+ case NTGDI_OBJ_DC:
+ case NTGDI_OBJ_MEMDC:
+ case NTGDI_OBJ_ENHMETADC:
+ case NTGDI_OBJ_METADC:
+ return DeleteDC( obj );
+ }
EnterCriticalSection( &obj_map_cs );
More information about the wine-cvs
mailing list