gdi32: Add get_any_obj_ptr() to retrieve the ptr and type of a GDI handle.
This enables get_dc_obj() to check the type without calling GetObjectType() and thus it saves additional calls to Enter/LeaveCriticalSection(). Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
b0664560d4
commit
fc2d310949
|
@ -52,10 +52,11 @@ static const struct gdi_obj_funcs dc_funcs =
|
||||||
|
|
||||||
static inline DC *get_dc_obj( HDC hdc )
|
static inline DC *get_dc_obj( HDC hdc )
|
||||||
{
|
{
|
||||||
DC *dc = GDI_GetObjPtr( hdc, 0 );
|
WORD type;
|
||||||
|
DC *dc = get_any_obj_ptr( hdc, &type );
|
||||||
if (!dc) return NULL;
|
if (!dc) return NULL;
|
||||||
|
|
||||||
switch (GetObjectType( hdc ))
|
switch (type)
|
||||||
{
|
{
|
||||||
case OBJ_DC:
|
case OBJ_DC:
|
||||||
case OBJ_MEMDC:
|
case OBJ_MEMDC:
|
||||||
|
|
|
@ -299,6 +299,7 @@ extern HGDIOBJ alloc_gdi_handle( void *obj, WORD type, const struct gdi_obj_func
|
||||||
extern void *free_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
extern void *free_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
||||||
extern HGDIOBJ get_full_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
extern HGDIOBJ get_full_gdi_handle( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
||||||
extern void *GDI_GetObjPtr( HGDIOBJ, WORD ) DECLSPEC_HIDDEN;
|
extern void *GDI_GetObjPtr( HGDIOBJ, WORD ) DECLSPEC_HIDDEN;
|
||||||
|
extern void *get_any_obj_ptr( HGDIOBJ, WORD * ) DECLSPEC_HIDDEN;
|
||||||
extern void GDI_ReleaseObj( HGDIOBJ ) DECLSPEC_HIDDEN;
|
extern void GDI_ReleaseObj( HGDIOBJ ) DECLSPEC_HIDDEN;
|
||||||
extern void GDI_CheckNotLock(void) DECLSPEC_HIDDEN;
|
extern void GDI_CheckNotLock(void) DECLSPEC_HIDDEN;
|
||||||
extern UINT GDI_get_ref_count( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
extern UINT GDI_get_ref_count( HGDIOBJ handle ) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -829,13 +829,13 @@ HGDIOBJ get_full_gdi_handle( HGDIOBJ handle )
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GDI_GetObjPtr
|
* get_any_obj_ptr
|
||||||
*
|
*
|
||||||
* Return a pointer to the GDI object associated to the handle.
|
* Return a pointer to, and the type of, the GDI object
|
||||||
* Return NULL if the object has the wrong magic number.
|
* associated with the handle.
|
||||||
* The object must be released with GDI_ReleaseObj.
|
* The object must be released with GDI_ReleaseObj.
|
||||||
*/
|
*/
|
||||||
void *GDI_GetObjPtr( HGDIOBJ handle, WORD type )
|
void *get_any_obj_ptr( HGDIOBJ handle, WORD *type )
|
||||||
{
|
{
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
struct gdi_handle_entry *entry;
|
struct gdi_handle_entry *entry;
|
||||||
|
@ -844,13 +844,32 @@ void *GDI_GetObjPtr( HGDIOBJ handle, WORD type )
|
||||||
|
|
||||||
if ((entry = handle_entry( handle )))
|
if ((entry = handle_entry( handle )))
|
||||||
{
|
{
|
||||||
if (!type || entry->type == type) ptr = entry->obj;
|
ptr = entry->obj;
|
||||||
|
*type = entry->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ptr) LeaveCriticalSection( &gdi_section );
|
if (!ptr) LeaveCriticalSection( &gdi_section );
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GDI_GetObjPtr
|
||||||
|
*
|
||||||
|
* Return a pointer to the GDI object associated with the handle.
|
||||||
|
* Return NULL if the object has the wrong type.
|
||||||
|
* The object must be released with GDI_ReleaseObj.
|
||||||
|
*/
|
||||||
|
void *GDI_GetObjPtr( HGDIOBJ handle, WORD type )
|
||||||
|
{
|
||||||
|
WORD ret_type;
|
||||||
|
void *ptr = get_any_obj_ptr( handle, &ret_type );
|
||||||
|
if (ptr && ret_type != type)
|
||||||
|
{
|
||||||
|
GDI_ReleaseObj( handle );
|
||||||
|
ptr = NULL;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GDI_ReleaseObj
|
* GDI_ReleaseObj
|
||||||
|
|
|
@ -223,6 +223,7 @@ static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc )
|
||||||
PENOBJ *pen;
|
PENOBJ *pen;
|
||||||
HGDIOBJ ret = 0;
|
HGDIOBJ ret = 0;
|
||||||
DC *dc = get_dc_ptr( hdc );
|
DC *dc = get_dc_ptr( hdc );
|
||||||
|
WORD type;
|
||||||
|
|
||||||
if (!dc)
|
if (!dc)
|
||||||
{
|
{
|
||||||
|
@ -230,12 +231,12 @@ static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pen = GDI_GetObjPtr( handle, 0 )))
|
if ((pen = get_any_obj_ptr( handle, &type )))
|
||||||
{
|
{
|
||||||
struct brush_pattern *pattern;
|
struct brush_pattern *pattern;
|
||||||
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSelectPen );
|
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSelectPen );
|
||||||
|
|
||||||
switch (GetObjectType( handle ))
|
switch (type)
|
||||||
{
|
{
|
||||||
case OBJ_PEN:
|
case OBJ_PEN:
|
||||||
pattern = NULL;
|
pattern = NULL;
|
||||||
|
@ -287,12 +288,13 @@ static BOOL PEN_DeleteObject( HGDIOBJ handle )
|
||||||
*/
|
*/
|
||||||
static INT PEN_GetObject( HGDIOBJ handle, INT count, LPVOID buffer )
|
static INT PEN_GetObject( HGDIOBJ handle, INT count, LPVOID buffer )
|
||||||
{
|
{
|
||||||
PENOBJ *pen = GDI_GetObjPtr( handle, 0 );
|
WORD type;
|
||||||
|
PENOBJ *pen = get_any_obj_ptr( handle, &type );
|
||||||
INT ret = 0;
|
INT ret = 0;
|
||||||
|
|
||||||
if (!pen) return 0;
|
if (!pen) return 0;
|
||||||
|
|
||||||
switch (GetObjectType( handle ))
|
switch (type)
|
||||||
{
|
{
|
||||||
case OBJ_PEN:
|
case OBJ_PEN:
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue