From b0efe28f6c70d6ca07e4dbee57d96d30fd1c4e25 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Fri, 4 Aug 2000 04:18:04 +0000
Subject: [PATCH] Removed a few dependencies on GDI internals from USER dll.

---
 controls/combo.c               |  2 +-
 controls/menu.c                | 10 ++--
 dlls/ttydrv/ttydrv_main.c      |  2 +
 dlls/wineps/init.c             |  1 -
 dlls/x11drv/x11drv_main.c      |  2 +
 graphics/enhmetafiledrv/init.c |  1 -
 graphics/metafiledrv/init.c    |  1 -
 graphics/ttydrv/init.c         |  1 -
 graphics/ttydrv/oembitmap.c    | 20 ++++----
 graphics/win16drv/init.c       |  1 -
 graphics/x11drv/init.c         |  1 -
 include/gdi.h                  |  1 -
 include/ttydrv.h               |  7 +--
 include/user.h                 |  2 +
 include/win.h                  |  4 +-
 include/x11drv.h               |  6 +--
 objects/metafile.c             |  4 +-
 windows/caret.c                |  4 +-
 windows/clipboard.c            |  2 +-
 windows/cursoricon.c           | 67 +++++++++----------------
 windows/dce.c                  |  9 ++--
 windows/dialog.c               | 14 +++---
 windows/nonclient.c            |  4 +-
 windows/painting.c             | 92 ++++++++++++++++++++--------------
 windows/ttydrv/wnd.c           | 16 +++---
 windows/winpos.c               | 16 ++----
 windows/x11drv/wnd.c           | 19 +++++--
 27 files changed, 154 insertions(+), 155 deletions(-)

diff --git a/controls/combo.c b/controls/combo.c
index d1b126cfe87..805e3032484 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -82,7 +82,7 @@ static BOOL COMBO_Init()
 
       TRACE("combo bitmap [%i,%i]\n", CBitWidth, CBitHeight );
 
-      hPrevB = SelectObject16( hDC, hComboBmp);
+      hPrevB = SelectObject( hDC, hComboBmp);
       SetRect( &r, 0, 0, CBitWidth, CBitHeight );
       InvertRect( hDC, &r );
       SelectObject( hDC, hPrevB );
diff --git a/controls/menu.c b/controls/menu.c
index 9de5f114914..dd8ad998651 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -1137,7 +1137,7 @@ static void MENU_DrawMenuItem( HWND hwnd, HMENU hmenu, HWND hwndOwner, HDC hdc,
 	    else 
 	    {
 	        SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );
-	        MoveTo16( hdc, rect.left, 0 );
+	        MoveToEx( hdc, rect.left, 0, NULL );
 	        LineTo( hdc, rect.left, height );
 	    }
         }
@@ -1156,7 +1156,7 @@ static void MENU_DrawMenuItem( HWND hwnd, HMENU hmenu, HWND hwndOwner, HDC hdc,
 	    else 
 	    {
 	        SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );
-	        MoveTo16( hdc, rect.left, rect.top + SEPARATOR_HEIGHT/2 );
+	        MoveToEx( hdc, rect.left, rect.top + SEPARATOR_HEIGHT/2, NULL );
 	        LineTo( hdc, rect.right, rect.top + SEPARATOR_HEIGHT/2 );
 	    }
 	    return;
@@ -1185,7 +1185,7 @@ static void MENU_DrawMenuItem( HWND hwnd, HMENU hmenu, HWND hwndOwner, HDC hdc,
 	/* helper lines for debugging */
 /*	FrameRect(hdc, &rect, GetStockObject(BLACK_BRUSH));
 	SelectObject( hdc, GetSysColorPen(COLOR_WINDOWFRAME) );
-	MoveTo16( hdc, rect.left, (rect.top + rect.bottom)/2 );
+	MoveToEx( hdc, rect.left, (rect.top + rect.bottom)/2, NULL );
 	LineTo( hdc, rect.right, (rect.top + rect.bottom)/2 );
 */
 
@@ -1479,13 +1479,13 @@ UINT MENU_DrawMenuBar( HDC hDC, LPRECT lprect, HWND hwnd,
     if (TWEAK_WineLook == WIN31_LOOK) 
     {
 	SelectObject( hDC, GetSysColorPen(COLOR_WINDOWFRAME) );
-	MoveTo16( hDC, lprect->left, lprect->bottom );
+	MoveToEx( hDC, lprect->left, lprect->bottom, NULL );
 	LineTo( hDC, lprect->right, lprect->bottom );
     }
     else 
     {
 	SelectObject( hDC, GetSysColorPen(COLOR_3DFACE));
-	MoveTo16( hDC, lprect->left, lprect->bottom );
+	MoveToEx( hDC, lprect->left, lprect->bottom, NULL );
 	LineTo( hDC, lprect->right, lprect->bottom );
     }
 
diff --git a/dlls/ttydrv/ttydrv_main.c b/dlls/ttydrv/ttydrv_main.c
index de749ce6d5b..7b3b6ff78e3 100644
--- a/dlls/ttydrv/ttydrv_main.c
+++ b/dlls/ttydrv/ttydrv_main.c
@@ -46,6 +46,8 @@ static USER_DRIVER user_driver =
     TTYDRV_SetScreenSaveActive,
     TTYDRV_GetScreenSaveTimeout,
     TTYDRV_SetScreenSaveTimeout,
+    /* resource functions */
+    TTYDRV_LoadOEMResource,
     /* windowing functions */
     TTYDRV_IsSingleWindow
 };
diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c
index 6e9956a07e7..c85387041ca 100644
--- a/dlls/wineps/init.c
+++ b/dlls/wineps/init.c
@@ -65,7 +65,6 @@ static const DC_FUNCTIONS PSDRV_Funcs =
     NULL,                            /* pIntersectClipRect */
     NULL,                            /* pInvertRgn */
     PSDRV_LineTo,                    /* pLineTo */
-    NULL,                            /* pLoadOEMResource */
     NULL,                            /* pMoveToEx */
     NULL,                            /* pOffsetClipRgn */
     NULL,                            /* pOffsetViewportOrg (optional) */
diff --git a/dlls/x11drv/x11drv_main.c b/dlls/x11drv/x11drv_main.c
index 12801412dd9..03cfbf5dbca 100644
--- a/dlls/x11drv/x11drv_main.c
+++ b/dlls/x11drv/x11drv_main.c
@@ -59,6 +59,8 @@ static USER_DRIVER user_driver =
     X11DRV_SetScreenSaveActive,
     X11DRV_GetScreenSaveTimeout,
     X11DRV_SetScreenSaveTimeout,
+    /* resource functions */
+    X11DRV_LoadOEMResource,
     /* windowing functions */
     X11DRV_IsSingleWindow
 };
diff --git a/graphics/enhmetafiledrv/init.c b/graphics/enhmetafiledrv/init.c
index 9a8e259b8a2..07f38bc4d8b 100644
--- a/graphics/enhmetafiledrv/init.c
+++ b/graphics/enhmetafiledrv/init.c
@@ -62,7 +62,6 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
     EMFDRV_IntersectClipRect,        /* pIntersectClipRect */
     EMFDRV_InvertRgn,                /* pInvertRgn */
     EMFDRV_LineTo,                   /* pLineTo */
-    NULL,                            /* pLoadOEMResource */
     EMFDRV_MoveToEx,                 /* pMoveToEx */
     EMFDRV_OffsetClipRgn,            /* pOffsetClipRgn */
     NULL,                            /* pOffsetViewportOrg */
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index c78b4e13457..b9c64ffe2fb 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -61,7 +61,6 @@ static const DC_FUNCTIONS MFDRV_Funcs =
     MFDRV_IntersectClipRect,         /* pIntersectClipRect */
     MFDRV_InvertRgn,                 /* pInvertRgn */
     MFDRV_LineTo,                    /* pLineTo */
-    NULL,                            /* pLoadOEMResource */
     MFDRV_MoveToEx,                  /* pMoveToEx */
     MFDRV_OffsetClipRgn,             /* pOffsetClipRgn */
     MFDRV_OffsetViewportOrg,         /* pOffsetViewportOrg */
diff --git a/graphics/ttydrv/init.c b/graphics/ttydrv/init.c
index c3150c38a5c..c0820369600 100644
--- a/graphics/ttydrv/init.c
+++ b/graphics/ttydrv/init.c
@@ -59,7 +59,6 @@ static const DC_FUNCTIONS TTYDRV_DC_Driver =
   NULL,                /* pIntersectClipRect */
   NULL,                /* pIntersectVisRect */
   TTYDRV_DC_LineTo,    /* pLineTo */
-  TTYDRV_DC_LoadOEMResource, /* pLoadOEMResource */
   NULL,                /* pMoveToEx */
   NULL,                /* pOffsetClipRgn */
   NULL,                /* pOffsetViewportOrg (optional) */
diff --git a/graphics/ttydrv/oembitmap.c b/graphics/ttydrv/oembitmap.c
index f67b04a587c..d4060b90aba 100644
--- a/graphics/ttydrv/oembitmap.c
+++ b/graphics/ttydrv/oembitmap.c
@@ -11,9 +11,9 @@
 DEFAULT_DEBUG_CHANNEL(ttydrv)
 
 /**********************************************************************
- *		TTYDRV_DC_LoadOEMBitmap
+ *		TTYDRV_LoadOEMBitmap
  */
-static HANDLE TTYDRV_DC_LoadOEMBitmap(WORD resid)
+static HANDLE TTYDRV_LoadOEMBitmap(WORD resid)
 {
   HBITMAP hbitmap;
 
@@ -26,31 +26,29 @@ static HANDLE TTYDRV_DC_LoadOEMBitmap(WORD resid)
 }
 
 /**********************************************************************
- *		TTYDRV_DC_LoadOEMCursorIcon
+ *		TTYDRV_LoadOEMCursorIcon
  */
-static HANDLE TTYDRV_DC_LoadOEMCursorIcon(WORD resid, BOOL bCursor)
+static HANDLE TTYDRV_LoadOEMCursorIcon(WORD resid, BOOL bCursor)
 {
   return (HANDLE) NULL;
 }
 
 /**********************************************************************
- *		TTYDRV_DC_LoadOEMResource
+ *		TTYDRV_LoadOEMResource
  */
-HANDLE TTYDRV_DC_LoadOEMResource(WORD resid, WORD type)
+HANDLE TTYDRV_LoadOEMResource(WORD resid, WORD type)
 {
   switch(type)
   {
     case OEM_BITMAP:
-      return TTYDRV_DC_LoadOEMBitmap(resid);
+      return TTYDRV_LoadOEMBitmap(resid);
     case OEM_CURSOR:
-      return TTYDRV_DC_LoadOEMCursorIcon(resid, TRUE);
+      return TTYDRV_LoadOEMCursorIcon(resid, TRUE);
     case OEM_ICON:
-      return TTYDRV_DC_LoadOEMCursorIcon(resid, FALSE);
+      return TTYDRV_LoadOEMCursorIcon(resid, FALSE);
     default:
       ERR("unknown type (%d)\n", type);
   }
 
   return (HANDLE) NULL;
 }
-
-
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index f3687572620..d09f25abefb 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -87,7 +87,6 @@ static const DC_FUNCTIONS WIN16DRV_Funcs =
     NULL,                            /* pIntersectClipRect */
     NULL,                            /* pInvertRgn */
     WIN16DRV_LineTo,                 /* pLineTo */
-    NULL,                            /* pLoadOEMResource */
     WIN16DRV_MoveToEx,               /* pMoveToEx */
     NULL,                            /* pOffsetClipRgn */
     NULL,                            /* pOffsetViewportOrgEx */
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index 521fff0c4d7..0fe27cadbf2 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -71,7 +71,6 @@ const DC_FUNCTIONS X11DRV_DC_Funcs =
     NULL,                            /* pIntersectClipRect */
     NULL,                            /* pInvertRgn */
     X11DRV_LineTo,                   /* pLineTo */
-    X11DRV_LoadOEMResource,          /* pLoadOEMResource */
     NULL,                            /* pMoveToEx */
     NULL,                            /* pOffsetClipRgn */
     NULL,                            /* pOffsetViewportOrg (optional) */
diff --git a/include/gdi.h b/include/gdi.h
index b970a4d211c..6cd7a95651f 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -214,7 +214,6 @@ typedef struct tagDC_FUNCS
     INT      (*pIntersectClipRect)(DC*,INT,INT,INT,INT);
     BOOL     (*pInvertRgn)(DC*,HRGN);    
     BOOL     (*pLineTo)(DC*,INT,INT);
-    HANDLE   (*pLoadOEMResource)(WORD,WORD);
     BOOL     (*pMoveToEx)(DC*,INT,INT,LPPOINT);
     INT      (*pOffsetClipRgn)(DC*,INT,INT);
     BOOL     (*pOffsetViewportOrg)(DC*,INT,INT);
diff --git a/include/ttydrv.h b/include/ttydrv.h
index c993cb2d51c..81aba654734 100644
--- a/include/ttydrv.h
+++ b/include/ttydrv.h
@@ -88,7 +88,6 @@ extern COLORREF TTYDRV_DC_GetPixel(struct tagDC *dc, INT x, INT y);
 extern BOOL TTYDRV_DC_GetTextExtentPoint(struct tagDC *dc, LPCWSTR str, INT count, LPSIZE size);
 extern BOOL TTYDRV_DC_GetTextMetrics(struct tagDC *dc, TEXTMETRICA *metrics);
 extern BOOL TTYDRV_DC_LineTo(struct tagDC *dc, INT x, INT y);
-extern HANDLE TTYDRV_DC_LoadOEMResource(WORD resid, WORD type);
 extern BOOL TTYDRV_DC_PaintRgn(struct tagDC *dc, HRGN hrgn);
 extern BOOL TTYDRV_DC_PatBlt(struct tagDC *dc, INT left, INT top, INT width, INT height, DWORD rop);
 extern BOOL TTYDRV_DC_Pie(struct tagDC *dc, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend);
@@ -184,6 +183,8 @@ typedef struct tagTTYDRV_WND_DATA {
 
 WINDOW *TTYDRV_WND_GetCursesWindow(struct tagWND *wndPtr);
 
+extern HANDLE TTYDRV_LoadOEMResource(WORD resid, WORD type);
+
 extern void TTYDRV_WND_Initialize(struct tagWND *wndPtr);
 extern void TTYDRV_WND_Finalize(struct tagWND *wndPtr);
 extern BOOL TTYDRV_WND_CreateDesktopWindow(struct tagWND *wndPtr, struct tagCLASS *classPtr, BOOL bUnicode);
@@ -196,8 +197,8 @@ extern void TTYDRV_WND_SetText(struct tagWND *wndPtr, LPCWSTR text);
 extern void TTYDRV_WND_SetFocus(struct tagWND *wndPtr);
 extern void TTYDRV_WND_PreSizeMove(struct tagWND *wndPtr);
 extern void TTYDRV_WND_PostSizeMove(struct tagWND *wndPtr);
-extern void TTYDRV_WND_ScrollWindow(struct tagWND *wndPtr, struct tagDC *dcPtr, INT dx, INT dy, const RECT *clipRect, BOOL bUpdate);
-extern void TTYDRV_WND_SetDrawable(struct tagWND *wndPtr, struct tagDC *dc, WORD flags, BOOL bSetClipOrigin);
+extern void TTYDRV_WND_ScrollWindow(struct tagWND *wndPtr, HDC hdc, INT dx, INT dy, const RECT *clipRect, BOOL bUpdate);
+extern void TTYDRV_WND_SetDrawable(struct tagWND *wndPtr, HDC hdc, WORD flags, BOOL bSetClipOrigin);
 extern BOOL TTYDRV_WND_SetHostAttr(struct tagWND *wndPtr, INT haKey, INT value);
 extern BOOL TTYDRV_WND_IsSelfClipping(struct tagWND *wndPtr);
 extern void TTYDRV_WND_SetWindowRgn(struct tagWND *wndPtr, HRGN hrgnWnd);
diff --git a/include/user.h b/include/user.h
index a2fe5ccde12..a91da001fc2 100644
--- a/include/user.h
+++ b/include/user.h
@@ -66,6 +66,8 @@ typedef struct tagUSER_DRIVER {
     void   (*pSetScreenSaveActive)(BOOL);
     int    (*pGetScreenSaveTimeout)(void);
     void   (*pSetScreenSaveTimeout)(int);
+    /* resource functions */
+    HANDLE   (*pLoadOEMResource)(WORD,WORD);
     /* windowing functions */
     BOOL   (*pIsSingleWindow)(void);
 } USER_DRIVER;
diff --git a/include/win.h b/include/win.h
index b02c9eeace9..2de24715385 100644
--- a/include/win.h
+++ b/include/win.h
@@ -128,8 +128,8 @@ typedef struct tagWND_DRIVER
     void   (*pSetFocus)(WND *);
     void   (*pPreSizeMove)(WND *);
     void   (*pPostSizeMove)(WND *);
-    void   (*pSurfaceCopy)(WND *, struct tagDC *, INT, INT, const RECT *, BOOL);
-    void   (*pSetDrawable)(WND *, struct tagDC *, WORD, BOOL);
+    void   (*pSurfaceCopy)(WND *, HDC, INT, INT, const RECT *, BOOL);
+    void   (*pSetDrawable)(WND *, HDC, WORD, BOOL);
     BOOL   (*pSetHostAttr)(WND *, INT haKey, INT value);
     BOOL (*pIsSelfClipping)(WND *);
     void   (*pSetWindowRgn)(WND *, const HRGN);
diff --git a/include/x11drv.h b/include/x11drv.h
index 501bba36529..7887971ff9e 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -156,7 +156,6 @@ extern INT X11DRV_DeviceBitmapBits( struct tagDC *dc, HBITMAP hbitmap,
 				      WORD fGet, UINT startscan,
 				      UINT lines, LPSTR bits,
 				      LPBITMAPINFO info, UINT coloruse );
-extern HANDLE X11DRV_LoadOEMResource( WORD id, WORD type );
 
 /* OpenGL / X11 driver functions */
 extern int X11DRV_ChoosePixelFormat(DC *dc, const PIXELFORMATDESCRIPTOR *pppfd) ;
@@ -336,6 +335,7 @@ extern BOOL X11DRV_GetScreenSaveActive(void);
 extern void X11DRV_SetScreenSaveActive(BOOL bActivate);
 extern int X11DRV_GetScreenSaveTimeout(void);
 extern void X11DRV_SetScreenSaveTimeout(int nTimeout);
+extern HANDLE X11DRV_LoadOEMResource( WORD id, WORD type );
 extern BOOL X11DRV_IsSingleWindow(void);
 
 /* X11 clipboard driver */
@@ -429,8 +429,8 @@ extern void X11DRV_WND_SetText(struct tagWND *wndPtr, LPCWSTR text);
 extern void X11DRV_WND_SetFocus(struct tagWND *wndPtr);
 extern void X11DRV_WND_PreSizeMove(struct tagWND *wndPtr);
 extern void X11DRV_WND_PostSizeMove(struct tagWND *wndPtr);
-extern void X11DRV_WND_SurfaceCopy(struct tagWND *wndPtr, struct tagDC *dcPtr, INT dx, INT dy, const RECT *clipRect, BOOL bUpdate);
-extern void X11DRV_WND_SetDrawable(struct tagWND *wndPtr, struct tagDC *dc, WORD flags, BOOL bSetClipOrigin);
+extern void X11DRV_WND_SurfaceCopy(struct tagWND *wndPtr, HDC hdc, INT dx, INT dy, const RECT *clipRect, BOOL bUpdate);
+extern void X11DRV_WND_SetDrawable(struct tagWND *wndPtr, HDC hdc, WORD flags, BOOL bSetClipOrigin);
 extern BOOL X11DRV_WND_SetHostAttr(struct tagWND *wndPtr, INT haKey, INT value);
 extern BOOL X11DRV_WND_IsSelfClipping(struct tagWND *wndPtr);
 extern void X11DRV_WND_DockWindow(struct tagWND *wndPtr);
diff --git a/objects/metafile.c b/objects/metafile.c
index 6c52e5736ac..00bca812c85 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -988,7 +988,7 @@ void WINAPI PlayMetaFileRecord16(
 	break;
 
     case META_SELECTPALETTE:
-	SelectPalette16(hdc, *(ht->objectHandle + *(mr->rdParm+1)),
+	SelectPalette(hdc, *(ht->objectHandle + *(mr->rdParm+1)),
 			*(mr->rdParm));
 	break;
 
@@ -997,7 +997,7 @@ void WINAPI PlayMetaFileRecord16(
 	break;
 
     case META_REALIZEPALETTE:
-	RealizePalette16(hdc);
+	RealizePalette(hdc);
 	break;
 
     case META_ESCAPE:
diff --git a/windows/caret.c b/windows/caret.c
index 7b9cc75b403..843de0a69d9 100644
--- a/windows/caret.c
+++ b/windows/caret.c
@@ -152,8 +152,8 @@ BOOL WINAPI CreateCaret( HWND hwnd, HBITMAP bitmap,
 
     if (bitmap && (bitmap != 1))
     {
-        BITMAP16 bmp;
-        if (!GetObject16( bitmap, sizeof(bmp), &bmp )) return FALSE;
+        BITMAP bmp;
+        if (!GetObjectA( bitmap, sizeof(bmp), &bmp )) return FALSE;
         Caret.width = bmp.bmWidth;
         Caret.height = bmp.bmHeight;
         /* FIXME: we should make a copy of the bitmap instead of a brush */
diff --git a/windows/clipboard.c b/windows/clipboard.c
index 62411b40e63..0977a87209f 100644
--- a/windows/clipboard.c
+++ b/windows/clipboard.c
@@ -189,7 +189,7 @@ void CLIPBOARD_DeleteRecord(LPWINE_CLIPFORMAT lpFormat, BOOL bChange)
       if (lpFormat->hData32)
 	DeleteObject(lpFormat->hData32);
       if (lpFormat->hData16)
-	DeleteObject16(lpFormat->hData16);
+	DeleteObject(lpFormat->hData16);
     }
     else if( lpFormat->wFormatID == CF_METAFILEPICT )
     {
diff --git a/windows/cursoricon.c b/windows/cursoricon.c
index e7b2374eb30..0293578a231 100644
--- a/windows/cursoricon.c
+++ b/windows/cursoricon.c
@@ -40,8 +40,6 @@
 #include "color.h"
 #include "bitmap.h"
 #include "cursoricon.h"
-#include "dc.h"
-#include "gdi.h"
 #include "global.h"
 #include "module.h"
 #include "debugtools.h"
@@ -429,7 +427,7 @@ static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16
 {
     int sizeAnd, sizeXor;
     HBITMAP hAndBits = 0, hXorBits = 0; /* error condition for later */
-    BITMAPOBJ *bmpXor, *bmpAnd;
+    BITMAP bmpXor, bmpAnd;
     POINT16 hotspot;
     BITMAPINFO *bmi;
     HDC hdc;
@@ -583,10 +581,10 @@ static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16
     }
 
     /* Now create the CURSORICONINFO structure */
-    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( hXorBits, BITMAP_MAGIC );
-    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( hAndBits, BITMAP_MAGIC );
-    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
-    sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
+    GetObjectA( hXorBits, sizeof(bmpXor), &bmpXor );
+    GetObjectA( hAndBits, sizeof(bmpAnd), &bmpAnd );
+    sizeXor = bmpXor.bmHeight * bmpXor.bmWidthBytes;
+    sizeAnd = bmpAnd.bmHeight * bmpAnd.bmWidthBytes;
 
     if (hObj) hObj = GlobalReAlloc16( hObj, 
 		     sizeof(CURSORICONINFO) + sizeXor + sizeAnd, GMEM_MOVEABLE );
@@ -602,11 +600,11 @@ static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16
 	info = (CURSORICONINFO *)GlobalLock16( hObj );
 	info->ptHotSpot.x   = hotspot.x;
 	info->ptHotSpot.y   = hotspot.y;
-	info->nWidth        = bmpXor->bitmap.bmWidth;
-	info->nHeight       = bmpXor->bitmap.bmHeight;
-	info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
-	info->bPlanes       = bmpXor->bitmap.bmPlanes;
-	info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
+	info->nWidth        = bmpXor.bmWidth;
+	info->nHeight       = bmpXor.bmHeight;
+	info->nWidthBytes   = bmpXor.bmWidthBytes;
+	info->bPlanes       = bmpXor.bmPlanes;
+	info->bBitsPerPixel = bmpXor.bmBitsPixel;
 
 	/* Transfer the bitmap bits to the CURSORICONINFO structure */
 
@@ -693,7 +691,6 @@ HGLOBAL CURSORICON_Load( HINSTANCE hInstance, LPCWSTR name,
     else if ( !hInstance )  /* Load OEM cursor/icon */
     {
         WORD resid;
-        HDC hdc;
 
         if ( HIWORD(name) )
         {
@@ -710,14 +707,7 @@ HGLOBAL CURSORICON_Load( HINSTANCE hInstance, LPCWSTR name,
             }
         }
         else resid = LOWORD(name);
-	hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
-	if (hdc) {
-	    DC *dc = DC_GetDCPtr( hdc );
-	    if (dc->funcs->pLoadOEMResource)
-	        h = dc->funcs->pLoadOEMResource( resid, fCursor ? OEM_CURSOR : OEM_ICON );
-	    GDI_HEAP_UNLOCK( hdc );
-	    DeleteDC(  hdc );
-	}
+        h = USER_Driver->pLoadOEMResource( resid, fCursor ? OEM_CURSOR : OEM_ICON );
     }
 
     else  /* Load from resource */
@@ -1819,16 +1809,17 @@ BOOL WINAPI GetIconInfo(HICON hIcon,LPICONINFO iconinfo) {
 /**********************************************************************
  *          CreateIconIndirect		(USER32.78)
  */
-HICON WINAPI CreateIconIndirect(LPICONINFO iconinfo) {
-    BITMAPOBJ *bmpXor,*bmpAnd;
+HICON WINAPI CreateIconIndirect(LPICONINFO iconinfo)
+{
+    BITMAP bmpXor,bmpAnd;
     HICON hObj;
     int	sizeXor,sizeAnd;
 
-    bmpXor = (BITMAPOBJ *) GDI_GetObjPtr( iconinfo->hbmColor, BITMAP_MAGIC );
-    bmpAnd = (BITMAPOBJ *) GDI_GetObjPtr( iconinfo->hbmMask, BITMAP_MAGIC );
+    GetObjectA( iconinfo->hbmColor, sizeof(bmpXor), &bmpXor );
+    GetObjectA( iconinfo->hbmMask, sizeof(bmpAnd), &bmpAnd );
 
-    sizeXor = bmpXor->bitmap.bmHeight * bmpXor->bitmap.bmWidthBytes;
-    sizeAnd = bmpAnd->bitmap.bmHeight * bmpAnd->bitmap.bmWidthBytes;
+    sizeXor = bmpXor.bmHeight * bmpXor.bmWidthBytes;
+    sizeAnd = bmpAnd.bmHeight * bmpAnd.bmWidthBytes;
 
     hObj = GlobalAlloc16( GMEM_MOVEABLE, 
 		     sizeof(CURSORICONINFO) + sizeXor + sizeAnd );
@@ -1850,11 +1841,11 @@ HICON WINAPI CreateIconIndirect(LPICONINFO iconinfo) {
 	  info->ptHotSpot.y   = iconinfo->yHotspot;
 	}
 
-	info->nWidth        = bmpXor->bitmap.bmWidth;
-	info->nHeight       = bmpXor->bitmap.bmHeight;
-	info->nWidthBytes   = bmpXor->bitmap.bmWidthBytes;
-	info->bPlanes       = bmpXor->bitmap.bmPlanes;
-	info->bBitsPerPixel = bmpXor->bitmap.bmBitsPixel;
+	info->nWidth        = bmpXor.bmWidth;
+	info->nHeight       = bmpXor.bmHeight;
+	info->nWidthBytes   = bmpXor.bmWidthBytes;
+	info->bPlanes       = bmpXor.bmPlanes;
+	info->bBitsPerPixel = bmpXor.bmBitsPixel;
 
 	/* Transfer the bitmap bits to the CURSORICONINFO structure */
 
@@ -2104,18 +2095,8 @@ static HBITMAP BITMAP_Load( HINSTANCE instance,LPCWSTR name, UINT loadflags )
     if (!(loadflags & LR_LOADFROMFILE)) {
       if (!instance)  /* OEM bitmap */
       {
-          HDC hdc;
-	  DC *dc;
-
 	  if (HIWORD((int)name)) return 0;
-	  hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
-	  dc = DC_GetDCPtr( hdc );
-	  if(dc->funcs->pLoadOEMResource)
-	      hbitmap = dc->funcs->pLoadOEMResource( LOWORD((int)name), 
-						     OEM_BITMAP );
-	  GDI_HEAP_UNLOCK( hdc );
-	  DeleteDC( hdc );
-	  return hbitmap;
+          return USER_Driver->pLoadOEMResource( LOWORD((int)name), OEM_BITMAP );
       }
 
       if (!(hRsrc = FindResourceW( instance, name, RT_BITMAPW ))) return 0;
diff --git a/windows/dce.c b/windows/dce.c
index 0ab4c73b22e..c19f8b01520 100644
--- a/windows/dce.c
+++ b/windows/dce.c
@@ -80,7 +80,7 @@ DCE *DCE_AllocDCE( HWND hWnd, DCE_TYPE type )
     WND* wnd;
     
     if (!(dce = HeapAlloc( SystemHeap, 0, sizeof(DCE) ))) return NULL;
-    if (!(dce->hDC = CreateDC16( "DISPLAY", NULL, NULL, NULL )))
+    if (!(dce->hDC = CreateDCA( "DISPLAY", NULL, NULL, NULL )))
     {
         HeapFree( SystemHeap, 0, dce );
 	return 0;
@@ -806,7 +806,7 @@ HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
     bUpdateVisRgn = bUpdateVisRgn || (dc->w.flags & DC_DIRTY);
 
     /* recompute visible region */
-    wndPtr->pDriver->pSetDrawable( wndPtr, dc, flags, bUpdateClipOrigin );
+    wndPtr->pDriver->pSetDrawable( wndPtr, hdc, flags, bUpdateClipOrigin );
 
     if( bUpdateVisRgn )
     {
@@ -975,7 +975,6 @@ BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
     BOOL retv = TRUE;
     HRGN hVisRgn;
     DCE *dce = (DCE *)data;
-    DC  *dc;
     WND *wndPtr;
 
     TRACE("hDC = %04x, %i\n", hDC, code);
@@ -1000,9 +999,7 @@ BOOL16 WINAPI DCHook16( HDC16 hDC, WORD code, DWORD data, LPARAM lParam )
 
                /* Update stale DC in DCX */
                wndPtr = WIN_FindWndPtr( dce->hwndCurrent);
-	       dc = (DC *) GDI_GetObjPtr( dce->hDC, DC_MAGIC);
-	       if( dc && wndPtr)
-		 wndPtr->pDriver->pSetDrawable( wndPtr, dc,dce->DCXflags,TRUE);
+	       if (wndPtr) wndPtr->pDriver->pSetDrawable( wndPtr, hDC, dce->DCXflags, TRUE);
 
 	       SetHookFlags16(hDC, DCHF_VALIDATEVISRGN);
 	       hVisRgn = DCE_GetVisRgn(dce->hwndCurrent, dce->DCXflags, 0, 0);
diff --git a/windows/dialog.c b/windows/dialog.c
index a35001bd637..c047e502714 100644
--- a/windows/dialog.c
+++ b/windows/dialog.c
@@ -161,12 +161,12 @@ static BOOL DIALOG_GetCharSize( HFONT hFont, SIZE * pSize )
  */
 BOOL DIALOG_Init(void)
 {
-    HDC16 hdc;
+    HDC hdc;
     SIZE size;
 
       /* Calculate the dialog base units */
 
-    if (!(hdc = CreateDC16( "DISPLAY", NULL, NULL, NULL ))) return FALSE;
+    if (!(hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL ))) return FALSE;
     if (!DIALOG_GetCharSizeFromDC( hdc, 0, &size )) return FALSE;
     DeleteDC( hdc );
     xBaseUnit = size.cx;
@@ -681,11 +681,11 @@ HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCSTR dlgTemplate,
 				 PROOF_QUALITY, FF_DONTCARE,
 				 (LPCWSTR)template.faceName );
 	else
-	    hFont = CreateFont16( -pixels, 0, 0, 0, FW_DONTCARE,
-				  FALSE, FALSE, FALSE,
-				  DEFAULT_CHARSET, 0, 0,
-				  PROOF_QUALITY, FF_DONTCARE,
-				  template.faceName );
+	    hFont = CreateFontA( -pixels, 0, 0, 0, FW_DONTCARE,
+                                 FALSE, FALSE, FALSE,
+                                 DEFAULT_CHARSET, 0, 0,
+                                 PROOF_QUALITY, FF_DONTCARE,
+                                 template.faceName );
         if (hFont)
         {
             SIZE charSize;
diff --git a/windows/nonclient.c b/windows/nonclient.c
index 5bf6daaa8ac..f3f8461ed8e 100644
--- a/windows/nonclient.c
+++ b/windows/nonclient.c
@@ -1489,14 +1489,14 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd,
 	SelectObject( hdc, hbrushOld );
     }
     WIN_ReleaseWndPtr(wndPtr);
-    MoveTo16( hdc, r.left, r.bottom );
+    MoveToEx( hdc, r.left, r.bottom, NULL );
     LineTo( hdc, r.right, r.bottom );
 
     if (style & WS_SYSMENU)
     {
 	NC_DrawSysButton( hwnd, hdc, FALSE );
 	r.left += GetSystemMetrics(SM_CXSIZE) + 1;
-	MoveTo16( hdc, r.left - 1, r.top );
+	MoveToEx( hdc, r.left - 1, r.top, NULL );
 	LineTo( hdc, r.left - 1, r.bottom );
     }
     if (style & WS_MAXIMIZEBOX)
diff --git a/windows/painting.c b/windows/painting.c
index dc1bf70a18d..7bc2e102ae2 100644
--- a/windows/painting.c
+++ b/windows/painting.c
@@ -267,10 +267,30 @@ copyrgn:
  *           BeginPaint16    (USER.39)
  */
 HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps ) 
+{
+    PAINTSTRUCT ps;
+
+    BeginPaint( hwnd, &ps );
+    lps->hdc            = ps.hdc;
+    lps->fErase         = ps.fErase;
+    lps->rcPaint.top    = ps.rcPaint.top;
+    lps->rcPaint.left   = ps.rcPaint.left;
+    lps->rcPaint.right  = ps.rcPaint.right;
+    lps->rcPaint.bottom = ps.rcPaint.bottom;
+    lps->fRestore       = ps.fRestore;
+    lps->fIncUpdate     = ps.fIncUpdate;
+    return lps->hdc;
+}
+
+
+/***********************************************************************
+ *           BeginPaint    (USER32.10)
+ */
+HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT *lps )
 {
     BOOL bIcon;
     HRGN hrgnUpdate;
-    RECT16 clipRect, clientRect;
+    RECT clipRect, clientRect;
     WND *wndPtr = WIN_FindWndPtr( hwnd );
     if (!wndPtr) return 0;
 
@@ -306,7 +326,7 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
         /* Don't clip the output to the update region for CS_PARENTDC window */
 	if( hrgnUpdate ) 
 	    DeleteObject(hrgnUpdate);
-        lps->hdc = GetDCEx16( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
+        lps->hdc = GetDCEx( hwnd, 0, DCX_WINDOWPAINT | DCX_USESTYLE |
                               (bIcon ? DCX_WINDOW : 0) );
     }
     else
@@ -314,7 +334,7 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
 	if( hrgnUpdate ) /* convert to client coordinates */
 	    OffsetRgn( hrgnUpdate, wndPtr->rectWindow.left - wndPtr->rectClient.left,
 			           wndPtr->rectWindow.top - wndPtr->rectClient.top );
-        lps->hdc = GetDCEx16(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
+        lps->hdc = GetDCEx(hwnd, hrgnUpdate, DCX_INTERSECTRGN |
                              DCX_WINDOWPAINT | DCX_USESTYLE | (bIcon ? DCX_WINDOW : 0) );
 	/* ReleaseDC() in EndPaint() will delete the region */
     }
@@ -333,13 +353,13 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
        than the window itself, so we need to intersect the cliprect with
        the window  */
     
-    GetClipBox16( lps->hdc, &clipRect );
-    GetClientRect16( hwnd, &clientRect );
+    GetClipBox( lps->hdc, &clipRect );
+    GetClientRect( hwnd, &clientRect );
 
     /* The rect obtained by GetClipBox is in logical, so make the client in logical to*/
-    DPtoLP16(lps->hdc, (LPPOINT16) &clientRect, 2);    
+    DPtoLP(lps->hdc, (LPPOINT)&clientRect, 2);    
 
-    IntersectRect16(&lps->rcPaint, &clientRect, &clipRect);
+    IntersectRect(&lps->rcPaint, &clientRect, &clipRect);
 
     TRACE("box = (%i,%i - %i,%i)\n", lps->rcPaint.left, lps->rcPaint.top,
 		    lps->rcPaint.right, lps->rcPaint.bottom );
@@ -347,9 +367,8 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
     if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
     {
         wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
-        lps->fErase = !SendMessage16(hwnd, (bIcon) ? WM_ICONERASEBKGND
-                                                   : WM_ERASEBKGND,
-                                     (WPARAM16)lps->hdc, 0 );
+        lps->fErase = !SendMessageA(hwnd, (bIcon) ? WM_ICONERASEBKGND : WM_ERASEBKGND,
+                                    (WPARAM16)lps->hdc, 0 );
     }
     else lps->fErase = TRUE;
 
@@ -358,26 +377,6 @@ HDC16 WINAPI BeginPaint16( HWND16 hwnd, LPPAINTSTRUCT16 lps )
 }
 
 
-/***********************************************************************
- *           BeginPaint    (USER32.10)
- */
-HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT *lps )
-{
-    PAINTSTRUCT16 ps;
-
-    BeginPaint16( hwnd, &ps );
-    lps->hdc            = (HDC)ps.hdc;
-    lps->fErase         = ps.fErase;
-    lps->rcPaint.top    = ps.rcPaint.top;
-    lps->rcPaint.left   = ps.rcPaint.left;
-    lps->rcPaint.right  = ps.rcPaint.right;
-    lps->rcPaint.bottom = ps.rcPaint.bottom;
-    lps->fRestore       = ps.fRestore;
-    lps->fIncUpdate     = ps.fIncUpdate;
-    return lps->hdc;
-}
-
-
 /***********************************************************************
  *           EndPaint16    (USER.40)
  */
@@ -405,10 +404,12 @@ BOOL WINAPI EndPaint( HWND hwnd, const PAINTSTRUCT *lps )
  */
 void WINAPI FillWindow16( HWND16 hwndParent, HWND16 hwnd, HDC16 hdc, HBRUSH16 hbrush )
 {
-    RECT16 rect;
-    GetClientRect16( hwnd, &rect );
-    DPtoLP16( hdc, (LPPOINT16)&rect, 2 );
-    PaintRect16( hwndParent, hwnd, hdc, hbrush, &rect );
+    RECT rect;
+    RECT16 rc16;
+    GetClientRect( hwnd, &rect );
+    DPtoLP( hdc, (LPPOINT)&rect, 2 );
+    CONV_RECT32TO16( &rect, &rc16 );
+    PaintRect16( hwndParent, hwnd, hdc, hbrush, &rc16 );
 }
 
 
@@ -1240,16 +1241,16 @@ INT WINAPI ExcludeUpdateRgn( HDC hdc, HWND hwnd )
  */
 INT16 WINAPI FillRect16( HDC16 hdc, const RECT16 *rect, HBRUSH16 hbrush )
 {
-    HBRUSH16 prevBrush;
+    HBRUSH prevBrush;
 
     /* coordinates are logical so we cannot fast-check 'rect',
      * it will be done later in the PatBlt().
      */
 
-    if (!(prevBrush = SelectObject16( hdc, hbrush ))) return 0;
+    if (!(prevBrush = SelectObject( hdc, hbrush ))) return 0;
     PatBlt( hdc, rect->left, rect->top,
               rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
-    SelectObject16( hdc, prevBrush );
+    SelectObject( hdc, prevBrush );
     return 1;
 }
 
@@ -1641,3 +1642,20 @@ BOOL16 WINAPI DrawState16(HDC16 hdc, HBRUSH16 hbr,
 }
 
 
+/***********************************************************************
+ *           SelectPalette16    (USER.282)
+ */
+HPALETTE16 WINAPI SelectPalette16( HDC16 hDC, HPALETTE16 hPal,
+                                   BOOL16 bForceBackground )
+{
+    return SelectPalette( hDC, hPal, bForceBackground );
+}
+
+
+/***********************************************************************
+ *           RealizePalette16    (USER.283)
+ */
+UINT16 WINAPI RealizePalette16( HDC16 hDC )
+{
+    return RealizePalette( hDC );
+}
diff --git a/windows/ttydrv/wnd.c b/windows/ttydrv/wnd.c
index 696185ec582..df64709d093 100644
--- a/windows/ttydrv/wnd.c
+++ b/windows/ttydrv/wnd.c
@@ -192,20 +192,21 @@ void TTYDRV_WND_PostSizeMove(WND *wndPtr)
 /*****************************************************************
  *		 TTYDRV_WND_ScrollWindow
  */
-void TTYDRV_WND_ScrollWindow(
-  WND *wndPtr, DC *dcPtr, INT dx, INT dy, 
-  const RECT *clipRect, BOOL bUpdate)
+void TTYDRV_WND_ScrollWindow( WND *wndPtr, HDC hdc, INT dx, INT dy, 
+                              const RECT *clipRect, BOOL bUpdate)
 {
-  FIXME("(%p, %p, %d, %d, %p, %d): stub\n", 
-	wndPtr, dcPtr, dx, dy, clipRect, bUpdate);
+  FIXME("(%p, %x, %d, %d, %p, %d): stub\n", 
+	wndPtr, hdc, dx, dy, clipRect, bUpdate);
 }
 
 /***********************************************************************
  *		TTYDRV_WND_SetDrawable
  */
-void TTYDRV_WND_SetDrawable(WND *wndPtr, DC *dc, WORD flags, BOOL bSetClipOrigin)
+void TTYDRV_WND_SetDrawable(WND *wndPtr, HDC hdc, WORD flags, BOOL bSetClipOrigin)
 {
-  TRACE("(%p, %p, %d, %d)\n", wndPtr, dc, flags, bSetClipOrigin);
+    DC *dc = DC_GetDCPtr( hdc );
+    if (!dc) return;
+    TRACE("(%p, %p, %d, %d)\n", wndPtr, dc, flags, bSetClipOrigin);
 
   /* FIXME: Should be done in the common code instead */
   if(!wndPtr)  {
@@ -220,6 +221,7 @@ void TTYDRV_WND_SetDrawable(WND *wndPtr, DC *dc, WORD flags, BOOL bSetClipOrigin
       dc->w.DCOrgY = wndPtr->rectClient.top;
     }
   }
+  GDI_HEAP_UNLOCK( hdc );
 }
 
 /***********************************************************************
diff --git a/windows/winpos.c b/windows/winpos.c
index 9b4b36ccbe6..dedcb6c1d89 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -2319,7 +2319,6 @@ nocopy:
      {
 	 RECT rClip;
 	 HDC hDC;
-	 DC* dc;
 
 	 /* get DC and clip rect with drawable rect to avoid superfluous expose events
 	    from copying clipped areas */
@@ -2339,14 +2338,12 @@ nocopy:
 	 }
 	 rClip.left = rClip.top = 0;    
 
-	 if( (dc = (DC *)GDI_GetObjPtr(hDC, DC_MAGIC)) )
-	 {
-	    if( oh > nh ) r.bottom = r.top  + nh;
-	    if( ow < nw ) r.right = r.left  + nw;
+         if( oh > nh ) r.bottom = r.top  + nh;
+         if( ow < nw ) r.right = r.left  + nw;
 
-	    if( IntersectRect( &r, &r, &rClip ) )
-            {
-	        Wnd->pDriver->pSurfaceCopy( Wnd->parent, dc, dx, dy, &r, TRUE );
+         if( IntersectRect( &r, &r, &rClip ) )
+         {
+	        Wnd->pDriver->pSurfaceCopy( Wnd->parent, hDC, dx, dy, &r, TRUE );
 
                  /* When you copy the bits without repainting, parent doesn't
                     get validated appropriately. Therefore, we have to validate
@@ -2358,9 +2355,6 @@ nocopy:
                   OffsetRect(&r, dx, dy);
                   ValidateRect(Wnd->parent->hwndSelf, &r);
                 }
-            }
-
-	    GDI_HEAP_UNLOCK( hDC );
 	 }
          ReleaseDC( (uFlags & SWP_EX_PAINTSELF) ? 
 		     Wnd->hwndSelf :  Wnd->parent->hwndSelf, hDC); 
diff --git a/windows/x11drv/wnd.c b/windows/x11drv/wnd.c
index 75bc5648478..a47f0887623 100644
--- a/windows/x11drv/wnd.c
+++ b/windows/x11drv/wnd.c
@@ -21,6 +21,7 @@
 #include "color.h"
 #include "debugtools.h"
 #include "dce.h"
+#include "dc.h"
 #include "options.h"
 #include "message.h"
 #include "heap.h"
@@ -755,12 +756,15 @@ void X11DRV_WND_PostSizeMove(WND *wndPtr)
  *
  * Copies rect to (rect.left + dx, rect.top + dy). 
  */
-void X11DRV_WND_SurfaceCopy(WND* wndPtr, DC *dcPtr, INT dx, INT dy, 
+void X11DRV_WND_SurfaceCopy(WND* wndPtr, HDC hdc, INT dx, INT dy, 
 			    const RECT *rect, BOOL bUpdate)
 {
-    X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dcPtr->physDev;
+    X11DRV_PDEVICE *physDev;
     POINT dst, src;
-  
+    DC *dcPtr = DC_GetDCPtr( hdc );
+
+    if (!dcPtr) return;
+    physDev = (X11DRV_PDEVICE *)dcPtr->physDev;
     dst.x = (src.x = dcPtr->w.DCOrgX + rect->left) + dx;
     dst.y = (src.y = dcPtr->w.DCOrgY + rect->top) + dy;
   
@@ -777,6 +781,7 @@ void X11DRV_WND_SurfaceCopy(WND* wndPtr, DC *dcPtr, INT dx, INT dy,
 
     if (bUpdate) /* Make sure exposure events have been processed */
 	EVENT_Synchronize();
+    GDI_HEAP_UNLOCK( hdc );
 }
 
 /***********************************************************************
@@ -785,12 +790,15 @@ void X11DRV_WND_SurfaceCopy(WND* wndPtr, DC *dcPtr, INT dx, INT dy,
  * Set the drawable, origin and dimensions for the DC associated to
  * a given window.
  */
-void X11DRV_WND_SetDrawable(WND *wndPtr, DC *dc, WORD flags, BOOL bSetClipOrigin)
+void X11DRV_WND_SetDrawable(WND *wndPtr, HDC hdc, WORD flags, BOOL bSetClipOrigin)
 {
-    X11DRV_PDEVICE *physDev = (X11DRV_PDEVICE *)dc->physDev;
+    DC *dc = DC_GetDCPtr( hdc );
+    X11DRV_PDEVICE *physDev;
     INT dcOrgXCopy = 0, dcOrgYCopy = 0;
     BOOL offsetClipRgn = FALSE;
 
+    if (!dc) return;
+    physDev = (X11DRV_PDEVICE *)dc->physDev;
     if (!wndPtr)  /* Get a DC for the whole screen */
     {
         dc->w.DCOrgX = 0;
@@ -855,6 +863,7 @@ void X11DRV_WND_SetDrawable(WND *wndPtr, DC *dc, WORD flags, BOOL bSetClipOrigin
 	    TSXSetClipOrigin( display, physDev->gc, dc->w.DCOrgX, dc->w.DCOrgY );
 #endif
     }
+    GDI_HEAP_UNLOCK( hdc );
 }
 
 /***********************************************************************
-- 
GitLab