gdi32: Don't pass an object pointer to the SelectObject backend functions.

oldstable
Alexandre Julliard 2007-09-27 20:14:13 +02:00
parent e36ed76139
commit a1e31397e1
7 changed files with 43 additions and 32 deletions

View File

@ -33,7 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(bitmap); WINE_DEFAULT_DEBUG_CHANNEL(bitmap);
static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc );
static INT BITMAP_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT BITMAP_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static INT BITMAP_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT BITMAP_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static BOOL BITMAP_DeleteObject( HGDIOBJ handle, void *obj ); static BOOL BITMAP_DeleteObject( HGDIOBJ handle, void *obj );
@ -554,17 +554,23 @@ BOOL BITMAP_SetOwnerDC( HBITMAP hbitmap, DC *dc )
/*********************************************************************** /***********************************************************************
* BITMAP_SelectObject * BITMAP_SelectObject
*/ */
static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
{ {
HGDIOBJ ret; HGDIOBJ ret;
BITMAPOBJ *bitmap = obj; BITMAPOBJ *bitmap;
DC *dc = DC_GetDCPtr( hdc ); DC *dc;
if (!dc) return 0; if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC ))) return 0;
if (!(dc = get_dc_ptr( hdc )))
{
GDI_ReleaseObj( handle );
return 0;
}
if (GetObjectType( hdc ) != OBJ_MEMDC) if (GetObjectType( hdc ) != OBJ_MEMDC)
{ {
DC_ReleaseDCPtr( dc ); ret = 0;
return 0; goto done;
} }
ret = dc->hBitmap; ret = dc->hBitmap;
if (handle == dc->hBitmap) goto done; /* nothing to do */ if (handle == dc->hBitmap) goto done; /* nothing to do */
@ -572,14 +578,14 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP))) if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP)))
{ {
WARN( "Bitmap already selected in another DC\n" ); WARN( "Bitmap already selected in another DC\n" );
DC_ReleaseDCPtr( dc ); ret = 0;
return 0; goto done;
} }
if (!bitmap->funcs && !BITMAP_SetOwnerDC( handle, dc )) if (!bitmap->funcs && !BITMAP_SetOwnerDC( handle, dc ))
{ {
DC_ReleaseDCPtr( dc ); ret = 0;
return 0; goto done;
} }
if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle ); if (dc->funcs->pSelectBitmap) handle = dc->funcs->pSelectBitmap( dc->physDev, handle );
@ -594,7 +600,8 @@ static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
else ret = 0; else ret = 0;
done: done:
DC_ReleaseDCPtr( dc ); GDI_ReleaseObj( handle );
release_dc_ptr( dc );
return ret; return ret;
} }

View File

@ -42,7 +42,7 @@ typedef struct
#define NB_HATCH_STYLES 6 #define NB_HATCH_STYLES 6
static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, HDC hdc );
static INT BRUSH_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT BRUSH_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static INT BRUSH_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT BRUSH_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static BOOL BRUSH_DeleteObject( HGDIOBJ handle, void *obj ); static BOOL BRUSH_DeleteObject( HGDIOBJ handle, void *obj );
@ -368,22 +368,26 @@ BOOL WINAPI FixBrushOrgEx( HDC hdc, INT x, INT y, LPPOINT oldorg )
/*********************************************************************** /***********************************************************************
* BRUSH_SelectObject * BRUSH_SelectObject
*/ */
static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, HDC hdc )
{ {
BRUSHOBJ *brush = obj; BRUSHOBJ *brush;
HGDIOBJ ret; HGDIOBJ ret = 0;
DC *dc = DC_GetDCPtr( hdc ); DC *dc = get_dc_ptr( hdc );
if (!dc) return 0; if (!dc) return 0;
if (brush->logbrush.lbStyle == BS_PATTERN) if ((brush = GDI_GetObjPtr( handle, BRUSH_MAGIC )))
BITMAP_SetOwnerDC( (HBITMAP)brush->logbrush.lbHatch, dc ); {
if (brush->logbrush.lbStyle == BS_PATTERN)
BITMAP_SetOwnerDC( (HBITMAP)brush->logbrush.lbHatch, dc );
ret = dc->hBrush; ret = dc->hBrush;
if (dc->funcs->pSelectBrush) handle = dc->funcs->pSelectBrush( dc->physDev, handle ); if (dc->funcs->pSelectBrush) handle = dc->funcs->pSelectBrush( dc->physDev, handle );
if (handle) dc->hBrush = handle; if (handle) dc->hBrush = handle;
else ret = 0; else ret = 0;
DC_ReleaseDCPtr( dc ); GDI_ReleaseObj( handle );
}
release_dc_ptr( dc );
return ret; return ret;
} }

View File

@ -86,7 +86,7 @@ static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
return pt[1].y - pt[0].y; return pt[1].y - pt[0].y;
} }
static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc );
static INT FONT_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT FONT_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static INT FONT_GetObjectA( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT FONT_GetObjectA( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static INT FONT_GetObjectW( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT FONT_GetObjectW( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
@ -585,7 +585,7 @@ HFONT WINAPI CreateFontW( INT height, INT width, INT esc,
* drivers that don't support vector fonts they must supply their own * drivers that don't support vector fonts they must supply their own
* font. * font.
*/ */
static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc )
{ {
HGDIOBJ ret = 0; HGDIOBJ ret = 0;
DC *dc = DC_GetDCPtr( hdc ); DC *dc = DC_GetDCPtr( hdc );

View File

@ -71,7 +71,7 @@ typedef struct {
struct gdi_obj_funcs struct gdi_obj_funcs
{ {
HGDIOBJ (*pSelectObject)( HGDIOBJ handle, void *obj, HDC hdc ); HGDIOBJ (*pSelectObject)( HGDIOBJ handle, HDC hdc );
INT (*pGetObject16)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); INT (*pGetObject16)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
INT (*pGetObjectA)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); INT (*pGetObjectA)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
INT (*pGetObjectW)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); INT (*pGetObjectW)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );

View File

@ -1150,7 +1150,7 @@ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ hObj )
{ {
if (header->funcs && header->funcs->pSelectObject) if (header->funcs && header->funcs->pSelectObject)
{ {
ret = header->funcs->pSelectObject( hObj, header, hdc ); ret = header->funcs->pSelectObject( hObj, hdc );
if (ret && ret != hObj && HandleToULong(ret) > COMPLEXREGION) if (ret && ret != hObj && HandleToULong(ret) > COMPLEXREGION)
{ {
inc_ref_count( header ); inc_ref_count( header );

View File

@ -42,7 +42,7 @@ typedef struct
} PENOBJ; } PENOBJ;
static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc );
static INT PEN_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT PEN_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
static INT PEN_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer ); static INT PEN_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
@ -215,7 +215,7 @@ HPEN WINAPI ExtCreatePen( DWORD style, DWORD width,
/*********************************************************************** /***********************************************************************
* PEN_SelectObject * PEN_SelectObject
*/ */
static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc )
{ {
HGDIOBJ ret; HGDIOBJ ret;
DC *dc = DC_GetDCPtr( hdc ); DC *dc = DC_GetDCPtr( hdc );

View File

@ -120,7 +120,7 @@ typedef struct
} RGNOBJ; } RGNOBJ;
static HGDIOBJ REGION_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ); static HGDIOBJ REGION_SelectObject( HGDIOBJ handle, HDC hdc );
static BOOL REGION_DeleteObject( HGDIOBJ handle, void *obj ); static BOOL REGION_DeleteObject( HGDIOBJ handle, void *obj );
static const struct gdi_obj_funcs region_funcs = static const struct gdi_obj_funcs region_funcs =
@ -549,7 +549,7 @@ static BOOL REGION_DeleteObject( HGDIOBJ handle, void *obj )
/*********************************************************************** /***********************************************************************
* REGION_SelectObject * REGION_SelectObject
*/ */
static HGDIOBJ REGION_SelectObject( HGDIOBJ handle, void *obj, HDC hdc ) static HGDIOBJ REGION_SelectObject( HGDIOBJ handle, HDC hdc )
{ {
return ULongToHandle(SelectClipRgn( hdc, handle )); return ULongToHandle(SelectClipRgn( hdc, handle ));
} }