Changed the GDI driver interface to pass an opaque PHYSDEV pointer
instead of a DC structure.
Removed some direct accesses to the DC structure from the drivers.
Got rid the bitmap driver.

diff --git a/include/bitmap.h b/include/bitmap.h
index f068365..5eb5355 100644
--- a/include/bitmap.h
+++ b/include/bitmap.h
@@ -23,8 +23,6 @@
 
 #include "gdi.h"
 
-struct tagGDI_BITMAP_DRIVER;
-
 /* Flags used for BitmapBits. We only use the first two at the moment */
 
 #define DDB_SET			1
@@ -48,19 +46,6 @@
     SEGPTR      segptr_bits;  /* segptr to DIB bits */
 } BITMAPOBJ;
 
-typedef struct tagBITMAP_DRIVER
-{
-  INT  (*pSetDIBits)(struct tagBITMAPOBJ *,struct tagDC *,UINT,UINT,LPCVOID,const BITMAPINFO *,UINT,HBITMAP);
-  INT  (*pGetDIBits)(struct tagBITMAPOBJ *,struct tagDC *,UINT,UINT,LPVOID,BITMAPINFO *,UINT,HBITMAP);
-  VOID (*pDeleteDIBSection)(struct tagBITMAPOBJ *);
-  UINT (*pSetDIBColorTable)(struct tagBITMAPOBJ *,struct tagDC *,UINT,UINT,const RGBQUAD *);
-  UINT (*pGetDIBColorTable)(struct tagBITMAPOBJ *,struct tagDC *,UINT,UINT,RGBQUAD *);
-  INT  (*pLockDIB)(struct tagBITMAPOBJ *,INT,BOOL);
-  VOID (*pUnlockDIB)(struct tagBITMAPOBJ *,BOOL);
-} BITMAP_DRIVER;
-
-extern BITMAP_DRIVER *BITMAP_Driver;
-
   /* objects/bitmap.c */
 extern INT16   BITMAP_GetObject16( BITMAPOBJ * bmp, INT16 count, LPVOID buffer );
 extern INT   BITMAP_GetObject( BITMAPOBJ * bmp, INT count, LPVOID buffer );
@@ -77,7 +62,6 @@
 extern HBITMAP DIB_CreateDIBSection( HDC hdc, BITMAPINFO *bmi, UINT usage, LPVOID *bits,
                                      HANDLE section, DWORD offset, DWORD ovr_pitch );
 extern void DIB_UpdateDIBSection( DC *dc, BOOL toDIB );
-extern void DIB_DeleteDIBSection( BITMAPOBJ *bmp );
 extern void DIB_SelectDIBSection( DC *dc, BITMAPOBJ *bmp );
 extern HGLOBAL DIB_CreateDIBFromBitmap(HDC hdc, HBITMAP hBmp);
 
diff --git a/include/gdi.h b/include/gdi.h
index 4ae8289..6982061 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -62,12 +62,14 @@
 
 typedef struct tagGdiFont *GdiFont;
 
+typedef struct { int opaque; } *PHYSDEV;  /* PHYSDEV is an opaque pointer */
+
 typedef struct tagDC
 {
     GDIOBJHDR    header;
     HDC          hSelf;            /* Handle to this DC */
     const struct tagDC_FUNCS *funcs; /* DC function table */
-    void         *physDev;         /* Physical device (driver-specific) */
+    PHYSDEV      physDev;         /* Physical device (driver-specific) */
     INT          saveLevel;
     DWORD        dwHookData;
     FARPROC16    hookProc;         /* the original SEGPTR ... */
@@ -138,108 +140,113 @@
 
 typedef struct tagDC_FUNCS
 {
-    INT      (*pAbortDoc)(DC*);
-    BOOL     (*pAbortPath)(DC*);
-    BOOL     (*pAngleArc)(DC*,INT,INT,DWORD,FLOAT,FLOAT);
-    BOOL     (*pArc)(DC*,INT,INT,INT,INT,INT,INT,INT,INT);
-    BOOL     (*pArcTo)(DC*,INT,INT,INT,INT,INT,INT,INT,INT);    
-    BOOL     (*pBeginPath)(DC*);
-    BOOL     (*pBitBlt)(DC*,INT,INT,INT,INT,DC*,INT,INT,DWORD);
+    INT      (*pAbortDoc)(PHYSDEV);
+    BOOL     (*pAbortPath)(PHYSDEV);
+    BOOL     (*pAngleArc)(PHYSDEV,INT,INT,DWORD,FLOAT,FLOAT);
+    BOOL     (*pArc)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
+    BOOL     (*pArcTo)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
+    BOOL     (*pBeginPath)(PHYSDEV);
+    BOOL     (*pBitBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,DWORD);
     LONG     (*pBitmapBits)(HBITMAP,void*,LONG,WORD);
-    INT      (*pChoosePixelFormat)(DC*,const PIXELFORMATDESCRIPTOR *);
-    BOOL     (*pChord)(DC*,INT,INT,INT,INT,INT,INT,INT,INT);
-    BOOL     (*pCloseFigure)(DC*);
-    BOOL     (*pCreateBitmap)(HBITMAP); 
-    BOOL     (*pCreateDC)(DC*,LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*);
-    HBITMAP  (*pCreateDIBSection)(DC *,BITMAPINFO *,UINT,LPVOID *,HANDLE,
-				  DWORD,DWORD);
-    BOOL     (*pDeleteDC)(DC*);
+    INT      (*pChoosePixelFormat)(PHYSDEV,const PIXELFORMATDESCRIPTOR *);
+    BOOL     (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
+    BOOL     (*pCloseFigure)(PHYSDEV);
+    BOOL     (*pCreateBitmap)(HBITMAP);
+    BOOL     (*pCreateDC)(DC *,LPCSTR,LPCSTR,LPCSTR,const DEVMODEA*);
+    HBITMAP  (*pCreateDIBSection)(PHYSDEV,BITMAPINFO *,UINT,LPVOID *,HANDLE,DWORD,DWORD);
+    BOOL     (*pDeleteDC)(PHYSDEV);
     BOOL     (*pDeleteObject)(HGDIOBJ);
-    INT      (*pDescribePixelFormat)(DC *,INT,UINT,PIXELFORMATDESCRIPTOR *);
+    INT      (*pDescribePixelFormat)(PHYSDEV,INT,UINT,PIXELFORMATDESCRIPTOR *);
     DWORD    (*pDeviceCapabilities)(LPSTR,LPCSTR,LPCSTR,WORD,LPSTR,LPDEVMODEA);
-    BOOL     (*pEllipse)(DC*,INT,INT,INT,INT);
-    INT      (*pEndDoc)(DC*);
-    INT      (*pEndPage)(DC*);
-    BOOL     (*pEndPath)(DC*);
+    BOOL     (*pEllipse)(PHYSDEV,INT,INT,INT,INT);
+    INT      (*pEndDoc)(PHYSDEV);
+    INT      (*pEndPage)(PHYSDEV);
+    BOOL     (*pEndPath)(PHYSDEV);
     BOOL     (*pEnumDeviceFonts)(HDC,LPLOGFONTW,DEVICEFONTENUMPROC,LPARAM);
-    INT      (*pExcludeClipRect)(DC*,INT,INT,INT,INT);
+    INT      (*pExcludeClipRect)(PHYSDEV,INT,INT,INT,INT);
     INT      (*pExtDeviceMode)(LPSTR,HWND,LPDEVMODEA,LPSTR,LPSTR,LPDEVMODEA,LPSTR,DWORD);
-    INT      (*pExtEscape)(DC*,INT,INT,LPCVOID,INT,LPVOID);
-    BOOL     (*pExtFloodFill)(DC*,INT,INT,COLORREF,UINT);
-    BOOL     (*pExtTextOut)(DC*,INT,INT,UINT,const RECT*,LPCWSTR,UINT,
-			    const INT*);
-    BOOL     (*pFillPath)(DC*);
-    BOOL     (*pFillRgn)(DC*,HRGN,HBRUSH);
-    BOOL     (*pFlattenPath)(DC*);
-    BOOL     (*pFrameRgn)(DC*,HRGN,HBRUSH,INT,INT);
-    BOOL     (*pGetCharWidth)(DC*,UINT,UINT,LPINT);
-    BOOL     (*pGetDCOrgEx)(DC*,LPPOINT);
-    INT      (*pGetDeviceCaps)(DC*,INT);
-    BOOL     (*pGetDeviceGammaRamp)(DC*,LPVOID);
-    COLORREF (*pGetPixel)(DC*,INT,INT);
-    INT      (*pGetPixelFormat)(DC*);
-    BOOL     (*pGetTextExtentPoint)(DC*,LPCWSTR,INT,LPSIZE);
-    BOOL     (*pGetTextMetrics)(DC*,TEXTMETRICW*);
-    INT      (*pIntersectClipRect)(DC*,INT,INT,INT,INT);
-    BOOL     (*pInvertRgn)(DC*,HRGN);    
-    BOOL     (*pLineTo)(DC*,INT,INT);
-    BOOL     (*pMoveTo)(DC*,INT,INT);
-    INT      (*pOffsetClipRgn)(DC*,INT,INT);
-    BOOL     (*pOffsetViewportOrg)(DC*,INT,INT);
-    BOOL     (*pOffsetWindowOrg)(DC*,INT,INT);
-    BOOL     (*pPaintRgn)(DC*,HRGN);
-    BOOL     (*pPatBlt)(DC*,INT,INT,INT,INT,DWORD);
-    BOOL     (*pPie)(DC*,INT,INT,INT,INT,INT,INT,INT,INT);
-    BOOL     (*pPolyBezier)(DC*,const POINT*,DWORD);
-    BOOL     (*pPolyBezierTo)(DC*,const POINT*,DWORD);
-    BOOL     (*pPolyDraw)(DC*,const POINT*,const BYTE *,DWORD);
-    BOOL     (*pPolyPolygon)(DC*,const POINT*,const INT*,UINT);
-    BOOL     (*pPolyPolyline)(DC*,const POINT*,const DWORD*,DWORD);
-    BOOL     (*pPolygon)(DC*,const POINT*,INT);
-    BOOL     (*pPolyline)(DC*,const POINT*,INT);
-    BOOL     (*pPolylineTo)(DC*,const POINT*,INT);
-    UINT     (*pRealizePalette)(DC*);
-    BOOL     (*pRectangle)(DC*,INT,INT,INT,INT);
-    BOOL     (*pRestoreDC)(DC*,INT);
-    BOOL     (*pRoundRect)(DC*,INT,INT,INT,INT,INT,INT);
-    INT      (*pSaveDC)(DC*);
-    BOOL     (*pScaleViewportExt)(DC*,INT,INT,INT,INT);
-    BOOL     (*pScaleWindowExt)(DC*,INT,INT,INT,INT);
-    BOOL     (*pSelectClipPath)(DC*,INT);
-    INT      (*pSelectClipRgn)(DC*,HRGN);
-    HANDLE   (*pSelectObject)(DC*,HANDLE);
-    HPALETTE (*pSelectPalette)(DC*,HPALETTE,BOOL);
-    COLORREF (*pSetBkColor)(DC*,COLORREF);
-    INT      (*pSetBkMode)(DC*,INT);
-    VOID     (*pSetDeviceClipping)(DC*);
-    BOOL     (*pSetDeviceGammaRamp)(DC*,LPVOID);
-    INT      (*pSetDIBitsToDevice)(DC*,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,
-				   LPCVOID,const BITMAPINFO*,UINT);
-    INT      (*pSetMapMode)(DC*,INT);
-    DWORD    (*pSetMapperFlags)(DC*,DWORD);
-    COLORREF (*pSetPixel)(DC*,INT,INT,COLORREF);
-    BOOL     (*pSetPixelFormat)(DC*,INT,const PIXELFORMATDESCRIPTOR *);
-    INT      (*pSetPolyFillMode)(DC*,INT);
-    INT      (*pSetROP2)(DC*,INT);
-    INT      (*pSetRelAbs)(DC*,INT);
-    INT      (*pSetStretchBltMode)(DC*,INT);
-    UINT     (*pSetTextAlign)(DC*,UINT);
-    INT      (*pSetTextCharacterExtra)(DC*,INT);
-    DWORD    (*pSetTextColor)(DC*,DWORD);
-    INT      (*pSetTextJustification)(DC*,INT,INT);
-    BOOL     (*pSetViewportExt)(DC*,INT,INT);
-    BOOL     (*pSetViewportOrg)(DC*,INT,INT);
-    BOOL     (*pSetWindowExt)(DC*,INT,INT);
-    BOOL     (*pSetWindowOrg)(DC*,INT,INT);
-    INT      (*pStartDoc)(DC*,const DOCINFOA*);
-    INT      (*pStartPage)(DC*);
-    BOOL     (*pStretchBlt)(DC*,INT,INT,INT,INT,DC*,INT,INT,INT,INT,DWORD);
-    INT      (*pStretchDIBits)(DC*,INT,INT,INT,INT,INT,INT,INT,INT,
-			       const void *,const BITMAPINFO *,UINT,DWORD);
-    BOOL     (*pStrokeAndFillPath)(DC*);
-    BOOL     (*pStrokePath)(DC*);
-    BOOL     (*pSwapBuffers)(DC*);
-    BOOL     (*pWidenPath)(DC*);
+    INT      (*pExtEscape)(PHYSDEV,INT,INT,LPCVOID,INT,LPVOID);
+    BOOL     (*pExtFloodFill)(PHYSDEV,INT,INT,COLORREF,UINT);
+    BOOL     (*pExtTextOut)(PHYSDEV,INT,INT,UINT,const RECT*,LPCWSTR,UINT,const INT*);
+    BOOL     (*pFillPath)(PHYSDEV);
+    BOOL     (*pFillRgn)(PHYSDEV,HRGN,HBRUSH);
+    BOOL     (*pFlattenPath)(PHYSDEV);
+    BOOL     (*pFrameRgn)(PHYSDEV,HRGN,HBRUSH,INT,INT);
+    BOOL     (*pGetCharWidth)(PHYSDEV,UINT,UINT,LPINT);
+    BOOL     (*pGetDCOrgEx)(PHYSDEV,LPPOINT);
+    UINT     (*pGetDIBColorTable)(PHYSDEV,UINT,UINT,RGBQUAD*);
+    INT      (*pGetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPVOID,BITMAPINFO*,UINT);
+    INT      (*pGetDeviceCaps)(PHYSDEV,INT);
+    BOOL     (*pGetDeviceGammaRamp)(PHYSDEV,LPVOID);
+    COLORREF (*pGetPixel)(PHYSDEV,INT,INT);
+    INT      (*pGetPixelFormat)(PHYSDEV);
+    BOOL     (*pGetTextExtentPoint)(PHYSDEV,LPCWSTR,INT,LPSIZE);
+    BOOL     (*pGetTextMetrics)(PHYSDEV,TEXTMETRICW*);
+    INT      (*pIntersectClipRect)(PHYSDEV,INT,INT,INT,INT);
+    BOOL     (*pInvertRgn)(PHYSDEV,HRGN);
+    BOOL     (*pLineTo)(PHYSDEV,INT,INT);
+    BOOL     (*pMoveTo)(PHYSDEV,INT,INT);
+    INT      (*pOffsetClipRgn)(PHYSDEV,INT,INT);
+    BOOL     (*pOffsetViewportOrg)(PHYSDEV,INT,INT);
+    BOOL     (*pOffsetWindowOrg)(PHYSDEV,INT,INT);
+    BOOL     (*pPaintRgn)(PHYSDEV,HRGN);
+    BOOL     (*pPatBlt)(PHYSDEV,INT,INT,INT,INT,DWORD);
+    BOOL     (*pPie)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
+    BOOL     (*pPolyBezier)(PHYSDEV,const POINT*,DWORD);
+    BOOL     (*pPolyBezierTo)(PHYSDEV,const POINT*,DWORD);
+    BOOL     (*pPolyDraw)(PHYSDEV,const POINT*,const BYTE *,DWORD);
+    BOOL     (*pPolyPolygon)(PHYSDEV,const POINT*,const INT*,UINT);
+    BOOL     (*pPolyPolyline)(PHYSDEV,const POINT*,const DWORD*,DWORD);
+    BOOL     (*pPolygon)(PHYSDEV,const POINT*,INT);
+    BOOL     (*pPolyline)(PHYSDEV,const POINT*,INT);
+    BOOL     (*pPolylineTo)(PHYSDEV,const POINT*,INT);
+    UINT     (*pRealizePalette)(PHYSDEV);
+    BOOL     (*pRectangle)(PHYSDEV,INT,INT,INT,INT);
+    BOOL     (*pRestoreDC)(PHYSDEV,INT);
+    BOOL     (*pRoundRect)(PHYSDEV,INT,INT,INT,INT,INT,INT);
+    INT      (*pSaveDC)(PHYSDEV);
+    BOOL     (*pScaleViewportExt)(PHYSDEV,INT,INT,INT,INT);
+    BOOL     (*pScaleWindowExt)(PHYSDEV,INT,INT,INT,INT);
+    HBITMAP  (*pSelectBitmap)(PHYSDEV,HBITMAP);
+    HBRUSH   (*pSelectBrush)(PHYSDEV,HBRUSH);
+    BOOL     (*pSelectClipPath)(PHYSDEV,INT);
+    INT      (*pSelectClipRgn)(PHYSDEV,HRGN);
+    HFONT    (*pSelectFont)(PHYSDEV,HFONT);
+    HPALETTE (*pSelectPalette)(PHYSDEV,HPALETTE,BOOL);
+    HPEN     (*pSelectPen)(PHYSDEV,HPEN);
+    COLORREF (*pSetBkColor)(PHYSDEV,COLORREF);
+    INT      (*pSetBkMode)(PHYSDEV,INT);
+    UINT     (*pSetDIBColorTable)(PHYSDEV,UINT,UINT,const RGBQUAD*);
+    INT      (*pSetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT);
+    INT      (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,
+                                   const BITMAPINFO*,UINT);
+    VOID     (*pSetDeviceClipping)(PHYSDEV);
+    BOOL     (*pSetDeviceGammaRamp)(PHYSDEV,LPVOID);
+    INT      (*pSetMapMode)(PHYSDEV,INT);
+    DWORD    (*pSetMapperFlags)(PHYSDEV,DWORD);
+    COLORREF (*pSetPixel)(PHYSDEV,INT,INT,COLORREF);
+    BOOL     (*pSetPixelFormat)(PHYSDEV,INT,const PIXELFORMATDESCRIPTOR *);
+    INT      (*pSetPolyFillMode)(PHYSDEV,INT);
+    INT      (*pSetROP2)(PHYSDEV,INT);
+    INT      (*pSetRelAbs)(PHYSDEV,INT);
+    INT      (*pSetStretchBltMode)(PHYSDEV,INT);
+    UINT     (*pSetTextAlign)(PHYSDEV,UINT);
+    INT      (*pSetTextCharacterExtra)(PHYSDEV,INT);
+    DWORD    (*pSetTextColor)(PHYSDEV,DWORD);
+    INT      (*pSetTextJustification)(PHYSDEV,INT,INT);
+    BOOL     (*pSetViewportExt)(PHYSDEV,INT,INT);
+    BOOL     (*pSetViewportOrg)(PHYSDEV,INT,INT);
+    BOOL     (*pSetWindowExt)(PHYSDEV,INT,INT);
+    BOOL     (*pSetWindowOrg)(PHYSDEV,INT,INT);
+    INT      (*pStartDoc)(PHYSDEV,const DOCINFOA*);
+    INT      (*pStartPage)(PHYSDEV);
+    BOOL     (*pStretchBlt)(PHYSDEV,INT,INT,INT,INT,PHYSDEV,INT,INT,INT,INT,DWORD);
+    INT      (*pStretchDIBits)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT,const void *,
+                               const BITMAPINFO*,UINT,DWORD);
+    BOOL     (*pStrokeAndFillPath)(PHYSDEV);
+    BOOL     (*pStrokePath)(PHYSDEV);
+    BOOL     (*pSwapBuffers)(PHYSDEV);
+    BOOL     (*pWidenPath)(PHYSDEV);
 } DC_FUNCTIONS;
 
   /* DC hook codes */
diff --git a/include/x11drv.h b/include/x11drv.h
index d5fa2a3..41ae701 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -45,8 +45,6 @@
 
 struct tagBITMAPOBJ;
 struct tagCURSORICONINFO;
-struct tagDC;
-struct tagDeviceCaps;
 struct tagPALETTEOBJ;
 struct tagWINDOWPOS;
 
@@ -80,6 +78,8 @@
   /* X physical device */
 typedef struct
 {
+    HDC           hdc;
+    DC           *dc;          /* direct pointer to DC, should go away */
     GC            gc;          /* X Window GC */
     Drawable      drawable;
     X_PHYSFONT    font;
@@ -105,77 +105,75 @@
 
 /* Wine driver X11 functions */
 
-extern BOOL X11DRV_BitBlt( struct tagDC *dcDst, INT xDst, INT yDst,
-                             INT width, INT height, struct tagDC *dcSrc,
+extern BOOL X11DRV_BitBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
+                             INT width, INT height, X11DRV_PDEVICE *physDevSrc,
                              INT xSrc, INT ySrc, DWORD rop );
 extern BOOL X11DRV_EnumDeviceFonts( HDC hdc, LPLOGFONTW plf,
 				    DEVICEFONTENUMPROC dfeproc, LPARAM lp );
-extern BOOL X11DRV_GetCharWidth( struct tagDC *dc, UINT firstChar,
+extern BOOL X11DRV_GetCharWidth( X11DRV_PDEVICE *physDev, UINT firstChar,
                                    UINT lastChar, LPINT buffer );
-extern BOOL X11DRV_GetDCOrgEx( struct tagDC *dc, LPPOINT lpp );
-extern BOOL X11DRV_GetTextExtentPoint( struct tagDC *dc, LPCWSTR str,
+extern BOOL X11DRV_GetDCOrgEx( X11DRV_PDEVICE *physDev, LPPOINT lpp );
+extern BOOL X11DRV_GetTextExtentPoint( X11DRV_PDEVICE *physDev, LPCWSTR str,
                                          INT count, LPSIZE size );
-extern BOOL X11DRV_GetTextMetrics(struct tagDC *dc, TEXTMETRICW *metrics);
-extern BOOL X11DRV_PatBlt( struct tagDC *dc, INT left, INT top,
+extern BOOL X11DRV_GetTextMetrics(X11DRV_PDEVICE *physDev, TEXTMETRICW *metrics);
+extern BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top,
                              INT width, INT height, DWORD rop );
-extern VOID   X11DRV_SetDeviceClipping(struct tagDC *dc);
-extern BOOL X11DRV_StretchBlt( struct tagDC *dcDst, INT xDst, INT yDst,
+extern VOID   X11DRV_SetDeviceClipping(X11DRV_PDEVICE *physDev);
+extern BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
                                  INT widthDst, INT heightDst,
-                                 struct tagDC *dcSrc, INT xSrc, INT ySrc,
+                                 X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
                                  INT widthSrc, INT heightSrc, DWORD rop );
-extern BOOL X11DRV_LineTo( struct tagDC *dc, INT x, INT y);
-extern BOOL X11DRV_Arc( struct tagDC *dc, INT left, INT top, INT right,
+extern BOOL X11DRV_LineTo( X11DRV_PDEVICE *physDev, INT x, INT y);
+extern BOOL X11DRV_Arc( X11DRV_PDEVICE *physDev, INT left, INT top, INT right,
 			  INT bottom, INT xstart, INT ystart, INT xend,
 			  INT yend );
-extern BOOL X11DRV_Pie( struct tagDC *dc, INT left, INT top, INT right,
+extern BOOL X11DRV_Pie( X11DRV_PDEVICE *physDev, INT left, INT top, INT right,
 			  INT bottom, INT xstart, INT ystart, INT xend,
 			  INT yend );
-extern BOOL X11DRV_Chord( struct tagDC *dc, INT left, INT top,
+extern BOOL X11DRV_Chord( X11DRV_PDEVICE *physDev, INT left, INT top,
 			    INT right, INT bottom, INT xstart,
 			    INT ystart, INT xend, INT yend );
-extern BOOL X11DRV_Ellipse( struct tagDC *dc, INT left, INT top,
+extern BOOL X11DRV_Ellipse( X11DRV_PDEVICE *physDev, INT left, INT top,
 			      INT right, INT bottom );
-extern BOOL X11DRV_Rectangle(struct tagDC *dc, INT left, INT top,
+extern BOOL X11DRV_Rectangle(X11DRV_PDEVICE *physDev, INT left, INT top,
 			      INT right, INT bottom);
-extern BOOL X11DRV_RoundRect( struct tagDC *dc, INT left, INT top,
+extern BOOL X11DRV_RoundRect( X11DRV_PDEVICE *physDev, INT left, INT top,
 				INT right, INT bottom, INT ell_width,
 				INT ell_height );
-extern COLORREF X11DRV_SetPixel( struct tagDC *dc, INT x, INT y,
+extern COLORREF X11DRV_SetPixel( X11DRV_PDEVICE *physDev, INT x, INT y,
 				 COLORREF color );
-extern COLORREF X11DRV_GetPixel( struct tagDC *dc, INT x, INT y);
-extern BOOL X11DRV_PaintRgn( struct tagDC *dc, HRGN hrgn );
-extern BOOL X11DRV_Polyline( struct tagDC *dc,const POINT* pt,INT count);
-extern BOOL X11DRV_Polygon( struct tagDC *dc, const POINT* pt, INT count );
-extern BOOL X11DRV_PolyPolygon( struct tagDC *dc, const POINT* pt, 
+extern COLORREF X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y);
+extern BOOL X11DRV_PaintRgn( X11DRV_PDEVICE *physDev, HRGN hrgn );
+extern BOOL X11DRV_Polyline( X11DRV_PDEVICE *physDev,const POINT* pt,INT count);
+extern BOOL X11DRV_Polygon( X11DRV_PDEVICE *physDev, const POINT* pt, INT count );
+extern BOOL X11DRV_PolyPolygon( X11DRV_PDEVICE *physDev, const POINT* pt, 
 				  const INT* counts, UINT polygons);
-extern BOOL X11DRV_PolyPolyline( struct tagDC *dc, const POINT* pt, 
+extern BOOL X11DRV_PolyPolyline( X11DRV_PDEVICE *physDev, const POINT* pt, 
 				  const DWORD* counts, DWORD polylines);
 
-extern HGDIOBJ X11DRV_SelectObject( struct tagDC *dc, HGDIOBJ handle );
-
-extern COLORREF X11DRV_SetBkColor( struct tagDC *dc, COLORREF color );
-extern COLORREF X11DRV_SetTextColor( struct tagDC *dc, COLORREF color );
-extern BOOL X11DRV_ExtFloodFill( struct tagDC *dc, INT x, INT y,
+extern COLORREF X11DRV_SetBkColor( X11DRV_PDEVICE *physDev, COLORREF color );
+extern COLORREF X11DRV_SetTextColor( X11DRV_PDEVICE *physDev, COLORREF color );
+extern BOOL X11DRV_ExtFloodFill( X11DRV_PDEVICE *physDev, INT x, INT y,
 				   COLORREF color, UINT fillType );
-extern BOOL X11DRV_ExtTextOut( struct tagDC *dc, INT x, INT y,
+extern BOOL X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y,
 				 UINT flags, const RECT *lprect,
 				 LPCWSTR str, UINT count, const INT *lpDx );
 extern BOOL X11DRV_CreateBitmap( HBITMAP hbitmap );
 extern BOOL X11DRV_DeleteObject( HGDIOBJ handle );
 extern LONG X11DRV_BitmapBits( HBITMAP hbitmap, void *bits, LONG count,
 			       WORD flags );
-extern INT X11DRV_SetDIBitsToDevice( struct tagDC *dc, INT xDest,
+extern INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest,
 				       INT yDest, DWORD cx, DWORD cy,
 				       INT xSrc, INT ySrc,
 				       UINT startscan, UINT lines,
 				       LPCVOID bits, const BITMAPINFO *info,
 				       UINT coloruse );
-extern INT X11DRV_DeviceBitmapBits( struct tagDC *dc, HBITMAP hbitmap,
+extern INT X11DRV_DeviceBitmapBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap,
 				      WORD fGet, UINT startscan,
 				      UINT lines, LPSTR bits,
 				      LPBITMAPINFO info, UINT coloruse );
-extern BOOL X11DRV_GetDeviceGammaRamp( struct tagDC *dc, LPVOID ramp );
-extern BOOL X11DRV_SetDeviceGammaRamp( struct tagDC *dc, LPVOID ramp );
+extern BOOL X11DRV_GetDeviceGammaRamp( X11DRV_PDEVICE *physDev, LPVOID ramp );
+extern BOOL X11DRV_SetDeviceGammaRamp( X11DRV_PDEVICE *physDev, LPVOID ramp );
 
 /* OpenGL / X11 driver functions */
 extern int X11DRV_ChoosePixelFormat(DC *dc, const PIXELFORMATDESCRIPTOR *pppfd) ;
@@ -188,10 +186,6 @@
 
 extern BOOL X11DRV_BITMAP_Init(void);
 extern int X11DRV_FONT_Init( int *log_pixels_x, int *log_pixels_y );
-extern HBRUSH X11DRV_BRUSH_SelectObject( DC * dc, HBRUSH hbrush );
-extern HFONT X11DRV_FONT_SelectObject( DC * dc, HFONT hfont );
-extern HPEN X11DRV_PEN_SelectObject( DC * dc, HPEN hpen );
-extern HBITMAP X11DRV_BITMAP_SelectObject( DC * dc, HBITMAP hbitmap );
 extern BOOL X11DRV_BITMAP_DeleteObject( HBITMAP hbitmap );
 
 struct tagBITMAPOBJ;
@@ -207,10 +201,10 @@
 extern void X11DRV_StartGraphicsExposures( HDC hdc );
 extern void X11DRV_EndGraphicsExposures( HDC hdc, HRGN hrgn );
 
-extern BOOL X11DRV_SetupGCForPatBlt( struct tagDC *dc, GC gc, BOOL fMapColors );
-extern BOOL X11DRV_SetupGCForBrush( struct tagDC *dc );
-extern BOOL X11DRV_SetupGCForPen( struct tagDC *dc );
-extern BOOL X11DRV_SetupGCForText( struct tagDC *dc );
+extern BOOL X11DRV_SetupGCForPatBlt( X11DRV_PDEVICE *physDev, GC gc, BOOL fMapColors );
+extern BOOL X11DRV_SetupGCForBrush( X11DRV_PDEVICE *physDev );
+extern BOOL X11DRV_SetupGCForPen( X11DRV_PDEVICE *physDev );
+extern BOOL X11DRV_SetupGCForText( X11DRV_PDEVICE *physDev );
 
 extern const int X11DRV_XROPfunction[];
 
@@ -219,12 +213,12 @@
 extern BOOL X11DRV_XRender_Installed;
 extern void X11DRV_XRender_Init(void);
 extern void X11DRV_XRender_Finalize(void);
-extern BOOL X11DRV_XRender_SelectFont(struct tagDC*, HFONT);
-extern void X11DRV_XRender_DeleteDC(struct tagDC*);
-extern BOOL X11DRV_XRender_ExtTextOut(DC *dc, INT x, INT y, UINT flags,
+extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT);
+extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*);
+extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
 				      const RECT *lprect, LPCWSTR wstr,
 				      UINT count, const INT *lpDx);
-extern void X11DRV_XRender_UpdateDrawable(DC *dc);
+extern void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev);
 
 /* exported dib functions for now */
 
@@ -258,37 +252,25 @@
 
 } X11DRV_DIBSECTION;
 
-extern int *X11DRV_DIB_BuildColorMap( struct tagDC *dc, WORD coloruse,
+extern int *X11DRV_DIB_BuildColorMap( X11DRV_PDEVICE *physDev, WORD coloruse,
 				      WORD depth, const BITMAPINFO *info,
 				      int *nColors );
-extern INT X11DRV_CoerceDIBSection(struct tagDC *dc,INT,BOOL);
-extern INT X11DRV_LockDIBSection(struct tagDC *dc,INT,BOOL);
-extern void X11DRV_UnlockDIBSection(struct tagDC *dc,BOOL);
+extern INT X11DRV_CoerceDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
+extern INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL);
+extern void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev,BOOL);
 extern INT X11DRV_CoerceDIBSection2(HBITMAP bmp,INT,BOOL);
 extern INT X11DRV_LockDIBSection2(HBITMAP bmp,INT,BOOL);
 extern void X11DRV_UnlockDIBSection2(HBITMAP bmp,BOOL);
 
-extern HBITMAP X11DRV_DIB_CreateDIBSection(struct tagDC *dc, BITMAPINFO *bmi, UINT usage,
+extern HBITMAP X11DRV_DIB_CreateDIBSection(X11DRV_PDEVICE *physDev, BITMAPINFO *bmi, UINT usage,
 					   LPVOID *bits, HANDLE section, DWORD offset, DWORD ovr_pitch);
-
-extern struct tagBITMAP_DRIVER X11DRV_BITMAP_Driver;
-
-extern INT X11DRV_DIB_SetDIBits(struct tagBITMAPOBJ *bmp, struct tagDC *dc, UINT startscan,
-				UINT lines, LPCVOID bits, const BITMAPINFO *info,
-				UINT coloruse, HBITMAP hbitmap);
-extern INT X11DRV_DIB_GetDIBits(struct tagBITMAPOBJ *bmp, struct tagDC *dc, UINT startscan,
-				UINT lines, LPVOID bits, BITMAPINFO *info,
-				UINT coloruse, HBITMAP hbitmap);
 extern void X11DRV_DIB_DeleteDIBSection(struct tagBITMAPOBJ *bmp);
-extern UINT X11DRV_DIB_SetDIBColorTable(struct tagBITMAPOBJ *,struct tagDC*,UINT,UINT,const RGBQUAD *);
-extern UINT X11DRV_DIB_GetDIBColorTable(struct tagBITMAPOBJ *,struct tagDC*,UINT,UINT,RGBQUAD *);
 extern INT X11DRV_DIB_Coerce(struct tagBITMAPOBJ *,INT,BOOL);
 extern INT X11DRV_DIB_Lock(struct tagBITMAPOBJ *,INT,BOOL);
 extern void X11DRV_DIB_Unlock(struct tagBITMAPOBJ *,BOOL);
-void X11DRV_DIB_CopyDIBSection(DC *dcSrc, DC *dcDst,     
-			       DWORD xSrc, DWORD ySrc,   
-			       DWORD xDest, DWORD yDest, 
-			       DWORD width, DWORD height);
+void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
+                               DWORD xSrc, DWORD ySrc, DWORD xDest, DWORD yDest,
+                               DWORD width, DWORD height);
 struct _DCICMD;
 extern INT X11DRV_DCICommand(INT cbInput, const struct _DCICMD *lpCmd, LPVOID lpOutData);
 
@@ -321,7 +303,7 @@
 extern void X11DRV_PALETTE_Cleanup(void);
 
 extern COLORREF X11DRV_PALETTE_ToLogical(int pixel);
-extern int X11DRV_PALETTE_ToPhysical(struct tagDC *dc, COLORREF color);
+extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);
 
 extern struct tagPALETTE_DRIVER X11DRV_PALETTE_Driver;