gdi32: Move the object refcount handling to the SelectObject backend functions.

oldstable
Alexandre Julliard 2007-09-27 20:57:02 +02:00
parent a1e31397e1
commit af6c0a09c5
6 changed files with 35 additions and 19 deletions

View File

@ -593,9 +593,11 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
if (handle)
{
dc->hBitmap = handle;
GDI_inc_ref_count( handle );
dc->dirty = 0;
SetRectRgn( dc->hVisRgn, 0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
DC_InitDC( dc );
GDI_dec_ref_count( ret );
}
else ret = 0;

View File

@ -381,10 +381,14 @@ static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, HDC hdc )
if (brush->logbrush.lbStyle == BS_PATTERN)
BITMAP_SetOwnerDC( (HBITMAP)brush->logbrush.lbHatch, dc );
ret = dc->hBrush;
if (dc->funcs->pSelectBrush) handle = dc->funcs->pSelectBrush( dc->physDev, handle );
if (handle) dc->hBrush = handle;
else ret = 0;
if (handle)
{
ret = dc->hBrush;
dc->hBrush = handle;
GDI_inc_ref_count( handle );
GDI_dec_ref_count( ret );
}
GDI_ReleaseObj( handle );
}
release_dc_ptr( dc );

View File

@ -608,6 +608,8 @@ static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc )
{
ret = dc->hFont;
dc->hFont = handle;
GDI_inc_ref_count( handle );
GDI_dec_ref_count( ret );
}
DC_ReleaseDCPtr( dc );
return ret;

View File

@ -456,6 +456,8 @@ extern BOOL GDI_FreeObject( HGDIOBJ, void *obj );
extern void *GDI_GetObjPtr( HGDIOBJ, WORD );
extern void GDI_ReleaseObj( HGDIOBJ );
extern void GDI_CheckNotLock(void);
extern BOOL GDI_inc_ref_count( HGDIOBJ handle );
extern BOOL GDI_dec_ref_count( HGDIOBJ handle );
extern BOOL GDI_hdc_using_object(HGDIOBJ obj, HDC hdc);
extern BOOL GDI_hdc_not_using_object(HGDIOBJ obj, HDC hdc);

View File

@ -524,22 +524,29 @@ static DWORD get_dpi( void )
/***********************************************************************
* inc_ref_count
* GDI_inc_ref_count
*
* Increment the reference count of a GDI object.
*/
static inline void inc_ref_count( GDIOBJHDR *header )
BOOL GDI_inc_ref_count( HGDIOBJ handle )
{
header->dwCount++;
GDIOBJHDR *header;
if ((header = GDI_GetObjPtr( handle, MAGIC_DONTCARE )))
{
header->dwCount++;
GDI_ReleaseObj( handle );
}
return header != NULL;
}
/***********************************************************************
* dec_ref_count
* GDI_dec_ref_count
*
* Decrement the reference count of a GDI object.
*/
static inline void dec_ref_count( HGDIOBJ handle )
BOOL GDI_dec_ref_count( HGDIOBJ handle )
{
GDIOBJHDR *header;
@ -556,6 +563,7 @@ static inline void dec_ref_count( HGDIOBJ handle )
DeleteObject( handle );
}
}
return header != NULL;
}
@ -1149,14 +1157,7 @@ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ hObj )
if (header)
{
if (header->funcs && header->funcs->pSelectObject)
{
ret = header->funcs->pSelectObject( hObj, hdc );
if (ret && ret != hObj && HandleToULong(ret) > COMPLEXREGION)
{
inc_ref_count( header );
dec_ref_count( ret );
}
}
GDI_ReleaseObj( hObj );
}
}

View File

@ -217,14 +217,19 @@ HPEN WINAPI ExtCreatePen( DWORD style, DWORD width,
*/
static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc )
{
HGDIOBJ ret;
HGDIOBJ ret = 0;
DC *dc = DC_GetDCPtr( hdc );
if (!dc) return 0;
ret = dc->hPen;
if (dc->funcs->pSelectPen) handle = dc->funcs->pSelectPen( dc->physDev, handle );
if (handle) dc->hPen = handle;
else ret = 0;
if (handle)
{
ret = dc->hPen;
dc->hPen = handle;
GDI_inc_ref_count( handle );
GDI_dec_ref_count( ret );
}
DC_ReleaseDCPtr( dc );
return ret;
}