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

Alexandre Julliard julliard at winehq.org
Thu Sep 27 14:48:51 CDT 2007


Module: wine
Branch: master
Commit: a1e31397e17685b4b994158a89ca2b90e41cfe74
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a1e31397e17685b4b994158a89ca2b90e41cfe74

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 27 20:14:13 2007 +0200

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

---

 dlls/gdi32/bitmap.c      |   31 +++++++++++++++++++------------
 dlls/gdi32/brush.c       |   30 +++++++++++++++++-------------
 dlls/gdi32/font.c        |    4 ++--
 dlls/gdi32/gdi_private.h |    2 +-
 dlls/gdi32/gdiobj.c      |    2 +-
 dlls/gdi32/pen.c         |    4 ++--
 dlls/gdi32/region.c      |    4 ++--
 7 files changed, 44 insertions(+), 33 deletions(-)

diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index c1d0859..0aa7dd5 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -33,7 +33,7 @@
 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_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
 static BOOL BITMAP_DeleteObject( HGDIOBJ handle, void *obj );
@@ -554,32 +554,38 @@ BOOL BITMAP_SetOwnerDC( HBITMAP hbitmap, DC *dc )
 /***********************************************************************
  *           BITMAP_SelectObject
  */
-static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
+static HGDIOBJ BITMAP_SelectObject( HGDIOBJ handle, HDC hdc )
 {
     HGDIOBJ ret;
-    BITMAPOBJ *bitmap = obj;
-    DC *dc = DC_GetDCPtr( hdc );
+    BITMAPOBJ *bitmap;
+    DC *dc;
 
-    if (!dc) return 0;
-    if (GetObjectType( hdc ) != OBJ_MEMDC)
+    if (!(bitmap = GDI_GetObjPtr( handle, BITMAP_MAGIC ))) return 0;
+
+    if (!(dc = get_dc_ptr( hdc )))
     {
-        DC_ReleaseDCPtr( dc );
+        GDI_ReleaseObj( handle );
         return 0;
     }
+    if (GetObjectType( hdc ) != OBJ_MEMDC)
+    {
+        ret = 0;
+        goto done;
+    }
     ret = dc->hBitmap;
     if (handle == dc->hBitmap) goto done;  /* nothing to do */
 
     if (bitmap->header.dwCount && (handle != GetStockObject(DEFAULT_BITMAP)))
     {
         WARN( "Bitmap already selected in another DC\n" );
-        DC_ReleaseDCPtr( dc );
-        return 0;
+        ret = 0;
+        goto done;
     }
 
     if (!bitmap->funcs && !BITMAP_SetOwnerDC( handle, dc ))
     {
-        DC_ReleaseDCPtr( dc );
-        return 0;
+        ret = 0;
+        goto done;
     }
 
     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;
 
  done:
-    DC_ReleaseDCPtr( dc );
+    GDI_ReleaseObj( handle );
+    release_dc_ptr( dc );
     return ret;
 }
 
diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c
index 67d6e08..4b13bc0 100644
--- a/dlls/gdi32/brush.c
+++ b/dlls/gdi32/brush.c
@@ -42,7 +42,7 @@ typedef struct
 
 #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_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
 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
  */
-static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
+static HGDIOBJ BRUSH_SelectObject( HGDIOBJ handle, HDC hdc )
 {
-    BRUSHOBJ *brush = obj;
-    HGDIOBJ ret;
-    DC *dc = DC_GetDCPtr( hdc );
+    BRUSHOBJ *brush;
+    HGDIOBJ ret = 0;
+    DC *dc = get_dc_ptr( hdc );
 
     if (!dc) return 0;
 
-    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;
-    DC_ReleaseDCPtr( dc );
+    if ((brush = GDI_GetObjPtr( handle, BRUSH_MAGIC )))
+    {
+        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;
+        GDI_ReleaseObj( handle );
+    }
+    release_dc_ptr( dc );
     return ret;
 }
 
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 4265ec9..f76af22 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -86,7 +86,7 @@ static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
     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_GetObjectA( 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
  * font.
  */
-static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
+static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc )
 {
     HGDIOBJ ret = 0;
     DC *dc = DC_GetDCPtr( hdc );
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 08ba02b..6ef0b66 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -71,7 +71,7 @@ typedef struct {
 
 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     (*pGetObjectA)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
     INT     (*pGetObjectW)( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 0388c71..25f072c 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -1150,7 +1150,7 @@ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ hObj )
         {
             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)
                 {
                     inc_ref_count( header );
diff --git a/dlls/gdi32/pen.c b/dlls/gdi32/pen.c
index cc48e4d..1c4381e 100644
--- a/dlls/gdi32/pen.c
+++ b/dlls/gdi32/pen.c
@@ -42,7 +42,7 @@ typedef struct
 } 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_GetObject( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
 
@@ -215,7 +215,7 @@ HPEN WINAPI ExtCreatePen( DWORD style, DWORD width,
 /***********************************************************************
  *           PEN_SelectObject
  */
-static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, void *obj, HDC hdc )
+static HGDIOBJ PEN_SelectObject( HGDIOBJ handle, HDC hdc )
 {
     HGDIOBJ ret;
     DC *dc = DC_GetDCPtr( hdc );
diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c
index b746447..3627ccb 100644
--- a/dlls/gdi32/region.c
+++ b/dlls/gdi32/region.c
@@ -120,7 +120,7 @@ typedef struct
 } 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 const struct gdi_obj_funcs region_funcs =
@@ -549,7 +549,7 @@ static BOOL REGION_DeleteObject( HGDIOBJ handle, void *obj )
 /***********************************************************************
  *           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 ));
 }




More information about the wine-cvs mailing list