Release 961013

Sun Oct 13 15:32:32 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [Make.rules.in] [*/Makefile.in]
	Made it possible to compile from a directory other than the source
	directory.

	* [graphics/metafiledrv/init.c] [include/metafiledrv.h]
	  [objects/metafile.c] [objects/dc.c]
	New graphics driver for metafiles.

	* [if1632/thunk.c]
	Added thunks for SetWindowsHook and SetDCHook.

	* [windows/dialog.c]
	Fixed GetNextDlgGroupItem and GetNextDlgTabItem to skip disabled
	items.

	* [*/*]
	Removed non Win32-clean types HANDLE, HBITMAP, HBRUSH, HFONT,
 	HINSTANCE, HMENU, HRGN and HTASK.

Wed Oct  9 14:59:45 1996  Frans van Dorsselaer  <dorssel@rulhm1.LeidenUniv.nl>

	* [controls/edit.c]
	Fixed EditWndProc() to fall back to DefWndProc() when the
	edit state structure is not available.

Wed Oct  2 14:00:34 1996  Huw D. M. Davies  <h.davies1@physics.oxford.ac.uk>

	* [windows/nonclient.c] [windows/mdi.c]
	AdjustWindowRectEx16() should only take notice of the styles
 	WS_DLGFRAME, WS_BORDER, WS_THICKFRAME and
 	WS_EX_DLGMODALFRAME. Thanks to Alex Korobka.

	* [controls/scroll.c]
	Fixed typo in ShowScrollBar32().

Sun Aug 25 20:18:56 1996  Jukka Iivonen <iivonen@cc.helsinki.fi>

	* [if1632/user32.spec] [if1632/winmm.spec]
	Added SetParent and sndPlaySoundA.
diff --git a/objects/Makefile.in b/objects/Makefile.in
index 0829312..56b3307 100644
--- a/objects/Makefile.in
+++ b/objects/Makefile.in
@@ -1,6 +1,9 @@
-DEFS   = -D__WINE__
-TOPSRC = @top_srcdir@
-MODULE = objects
+DEFS      = -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = objects
 
 C_SRCS = \
 	bitblt.c \
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 53237a8..926f176 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -124,7 +124,7 @@
  */
 HBITMAP16 CreateCompatibleBitmap( HDC32 hdc, INT32 width, INT32 height )
 {
-    HBITMAP hbmpRet = 0;
+    HBITMAP16 hbmpRet = 0;
     DC *dc;
 
     dprintf_gdi( stddeb, "CreateCompatibleBitmap(%04x,%d,%d) = \n", 
@@ -421,8 +421,8 @@
 HBITMAP16 BITMAP_SelectObject( DC * dc, HBITMAP16 hbitmap,
                                BITMAPOBJ * bmp )
 {
-    HRGN hrgn;
-    HBITMAP prevHandle = dc->w.hBitmap;
+    HRGN32 hrgn;
+    HBITMAP16 prevHandle = dc->w.hBitmap;
     
     if (!(dc->w.flags & DC_MEMORY)) return 0;
 
diff --git a/objects/brush.c b/objects/brush.c
index 27c847f..3816170 100644
--- a/objects/brush.c
+++ b/objects/brush.c
@@ -141,10 +141,10 @@
 /***********************************************************************
  *           CreateBrushIndirect    (GDI.50)
  */
-HBRUSH CreateBrushIndirect( const LOGBRUSH16 * brush )
+HBRUSH16 CreateBrushIndirect( const LOGBRUSH16 * brush )
 {
     BRUSHOBJ * brushPtr;
-    HBRUSH hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
+    HBRUSH16 hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC );
     if (!hbrush) return 0;
     brushPtr = (BRUSHOBJ *) GDI_HEAP_LIN_ADDR( hbrush );
     memcpy( &brushPtr->logbrush, brush, sizeof(*brush) );
@@ -155,7 +155,7 @@
 /***********************************************************************
  *           CreateHatchBrush    (GDI.58)
  */
-HBRUSH CreateHatchBrush( INT style, COLORREF color )
+HBRUSH16 CreateHatchBrush( INT style, COLORREF color )
 {
     LOGBRUSH16 logbrush = { BS_HATCHED, color, style };
     dprintf_gdi(stddeb, "CreateHatchBrush: %d %06lx\n", style, color );
@@ -167,7 +167,7 @@
 /***********************************************************************
  *           CreatePatternBrush    (GDI.60)
  */
-HBRUSH CreatePatternBrush( HBITMAP hbitmap )
+HBRUSH16 CreatePatternBrush( HBITMAP16 hbitmap )
 {
     LOGBRUSH16 logbrush = { BS_PATTERN, 0, 0 };
     BITMAPOBJ *bmp, *newbmp;
@@ -179,7 +179,7 @@
     if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
 	return 0;
     logbrush.lbHatch = (INT16)CreateBitmapIndirect16( &bmp->bitmap );
-    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HANDLE)logbrush.lbHatch, BITMAP_MAGIC );
+    newbmp = (BITMAPOBJ *) GDI_GetObjPtr( (HGDIOBJ16)logbrush.lbHatch, BITMAP_MAGIC );
     if (!newbmp) return 0;
     XCopyArea( display, bmp->pixmap, newbmp->pixmap, BITMAP_GC(bmp),
 	       0, 0, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, 0, 0 );
@@ -190,7 +190,7 @@
 /***********************************************************************
  *           CreateDIBPatternBrush    (GDI.445)
  */
-HBRUSH CreateDIBPatternBrush( HGLOBAL16 hbitmap, UINT coloruse )
+HBRUSH16 CreateDIBPatternBrush( HGLOBAL16 hbitmap, UINT coloruse )
 {
     LOGBRUSH16 logbrush = { BS_DIBPATTERN, coloruse, 0 };
     BITMAPINFO *info, *newInfo;
@@ -214,9 +214,9 @@
 	GlobalUnlock16( hbitmap );
 	return 0;
     }
-    newInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)logbrush.lbHatch );
+    newInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)logbrush.lbHatch );
     memcpy( newInfo, info, size );
-    GlobalUnlock16( (HANDLE)logbrush.lbHatch );
+    GlobalUnlock16( (HGLOBAL16)logbrush.lbHatch );
     GlobalUnlock16( hbitmap );
     return CreateBrushIndirect( &logbrush );
 }
@@ -225,7 +225,7 @@
 /***********************************************************************
  *           CreateSolidBrush    (GDI.66)
  */
-HBRUSH CreateSolidBrush( COLORREF color )
+HBRUSH16 CreateSolidBrush( COLORREF color )
 {
     LOGBRUSH16 logbrush = { BS_SOLID, color, 0 };
     dprintf_gdi(stddeb, "CreateSolidBrush: %06lx\n", color );
@@ -270,7 +270,7 @@
 /***********************************************************************
  *           GetSysColorBrush    (USER.281)
  */
-HBRUSH GetSysColorBrush(WORD x)
+HBRUSH16 GetSysColorBrush(WORD x)
 {
     fprintf( stderr, "Unimplemented stub: GetSysColorBrush(%d)\n", x );
     return GetStockObject(LTGRAY_BRUSH);
@@ -280,15 +280,15 @@
 /***********************************************************************
  *           BRUSH_DeleteObject
  */
-BOOL BRUSH_DeleteObject( HBRUSH hbrush, BRUSHOBJ * brush )
+BOOL32 BRUSH_DeleteObject( HBRUSH16 hbrush, BRUSHOBJ * brush )
 {
     switch(brush->logbrush.lbStyle)
     {
       case BS_PATTERN:
-	  DeleteObject( (HANDLE)brush->logbrush.lbHatch );
+	  DeleteObject( (HGDIOBJ16)brush->logbrush.lbHatch );
 	  break;
       case BS_DIBPATTERN:
-	  GlobalFree16( (HANDLE)brush->logbrush.lbHatch );
+	  GlobalFree16( (HGLOBAL16)brush->logbrush.lbHatch );
 	  break;
     }
     return GDI_FreeObject( hbrush );
@@ -330,7 +330,7 @@
 /***********************************************************************
  *           BRUSH_SelectPatternBrush
  */
-static BOOL BRUSH_SelectPatternBrush( DC * dc, HBITMAP hbitmap )
+static BOOL BRUSH_SelectPatternBrush( DC * dc, HBITMAP16 hbitmap )
 {
     BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
     if (!bmp) return FALSE;
@@ -357,11 +357,11 @@
 /***********************************************************************
  *           BRUSH_SelectObject
  */
-HBRUSH BRUSH_SelectObject( DC * dc, HBRUSH hbrush, BRUSHOBJ * brush )
+HBRUSH16 BRUSH_SelectObject( DC * dc, HBRUSH16 hbrush, BRUSHOBJ * brush )
 {
-    HBITMAP hBitmap;
+    HBITMAP16 hBitmap;
     BITMAPINFO * bmpInfo;
-    HBRUSH prevHandle = dc->w.hBrush;
+    HBRUSH16 prevHandle = dc->w.hBrush;
 
     dprintf_gdi(stddeb, "Brush_SelectObject: hdc=%04x hbrush=%04x\n",
                 dc->hSelf,hbrush);
@@ -373,16 +373,16 @@
 	case BS_HATCHED:
 	case BS_HOLLOW:
 	    if (!MF_CreateBrushIndirect(dc, hbrush, &(brush->logbrush)))
-		return (HBRUSH)0;
+		return (HBRUSH16)0;
 	    break;
 
 	case BS_PATTERN:
 	case BS_DIBPATTERN:
 	    if (!MF_CreatePatternBrush(dc, hbrush, &(brush->logbrush)))
-		return (HBRUSH)0;
+		return (HBRUSH16)0;
 	    break;
 	}
-	return (HBRUSH)1;
+	return (HBRUSH16)1;
     }
     
     dc->w.hBrush = hbrush;
@@ -415,12 +415,12 @@
 	
       case BS_PATTERN:
 	dprintf_gdi( stddeb, "BS_PATTERN\n");
-	BRUSH_SelectPatternBrush( dc, (HBRUSH)brush->logbrush.lbHatch );
+	BRUSH_SelectPatternBrush( dc, (HBRUSH16)brush->logbrush.lbHatch );
 	break;
 
       case BS_DIBPATTERN:
 	dprintf_gdi( stddeb, "BS_DIBPATTERN\n");
-	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HANDLE)brush->logbrush.lbHatch )))
+	if ((bmpInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)brush->logbrush.lbHatch )))
 	{
 	    int size = DIB_BitmapInfoSize( bmpInfo, brush->logbrush.lbColor );
 	    hBitmap = CreateDIBitmap( dc->hSelf, &bmpInfo->bmiHeader, CBM_INIT,
@@ -428,7 +428,7 @@
 				      (WORD) brush->logbrush.lbColor );
 	    BRUSH_SelectPatternBrush( dc, hBitmap );
 	    DeleteObject( hBitmap );
-	    GlobalUnlock16( (HANDLE)brush->logbrush.lbHatch );	    
+	    GlobalUnlock16( (HGLOBAL16)brush->logbrush.lbHatch );	    
 	}
 	
 	break;
diff --git a/objects/clipping.c b/objects/clipping.c
index 29a5cb4..eae9dbc 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -12,7 +12,11 @@
 /* #define DEBUG_CLIPPING */
 #include "debug.h"
 
-#define UpdateDirtyDC(dc) DC_CallHookProc( dc, DCHC_INVALIDVISRGN, 0 )
+#define UPDATE_DIRTY_DC(dc) \
+ do { \
+   if ((dc)->hookProc && !((dc)->w.flags & (DC_SAVED | DC_MEMORY))) \
+     (dc)->hookProc( (dc)->hSelf, DCHC_INVALIDVISRGN, (dc)->dwHookData, 0 ); \
+ } while(0)
 
 /***********************************************************************
  *           CLIPPING_SetDeviceClipping
@@ -56,7 +60,7 @@
 
     if (dc->w.flags & DC_DIRTY)
     {
-        UpdateDirtyDC(dc);
+        UPDATE_DIRTY_DC(dc);
         dc->w.flags &= ~DC_DIRTY;
     }
 
@@ -71,7 +75,7 @@
 /***********************************************************************
  *           SelectClipRgn    (GDI.44)
  */
-int SelectClipRgn( HDC hdc, HRGN hrgn )
+int SelectClipRgn( HDC hdc, HRGN32 hrgn )
 {
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -99,7 +103,7 @@
 /***********************************************************************
  *           SelectVisRgn    (GDI.105)
  */
-int SelectVisRgn( HDC hdc, HRGN hrgn )
+int SelectVisRgn( HDC hdc, HRGN32 hrgn )
 {
     int retval;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
@@ -166,7 +170,7 @@
 int CLIPPING_IntersectClipRect( DC * dc, short left, short top,
                                          short right, short bottom, UINT16 flags)
 {
-    HRGN	newRgn;
+    HRGN32 newRgn;
     int 	ret;
 
     if ( !(newRgn = CreateRectRgn( left, top, right, bottom )) ) return ERROR;
@@ -253,7 +257,7 @@
 static int CLIPPING_IntersectVisRect( DC * dc, short left, short top,
                                       short right, short bottom, BOOL exclude )
 {
-    HRGN tempRgn, newRgn;
+    HRGN32 tempRgn, newRgn;
     int ret;
 
     left   = XLPTODP( dc, left );
@@ -325,7 +329,7 @@
     dprintf_clipping(stddeb, "PtVisible: %04x %d,%d\n", hdc, x, y );
     if (!dc->w.hGCClipRgn) return FALSE;
 
-    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc);
     dc->w.flags &= ~DC_DIRTY;
 
     return PtInRegion( dc->w.hGCClipRgn, XLPTODP(dc,x), YLPTODP(dc,y) );
@@ -392,9 +396,9 @@
 /***********************************************************************
  *           SaveVisRgn    (GDI.129)
  */
-HRGN SaveVisRgn( HDC hdc )
+HRGN32 SaveVisRgn( HDC hdc )
 {
-    HRGN copy;
+    HRGN32 copy;
     RGNOBJ *obj, *copyObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
@@ -404,7 +408,7 @@
         fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
         exit(1);
     }
-    if( dc->w.flags & DC_DIRTY ) UpdateDirtyDC(dc);
+    if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc);
     dc->w.flags &= ~DC_DIRTY;
 
     if (!(obj = (RGNOBJ *) GDI_GetObjPtr( dc->w.hVisRgn, REGION_MAGIC )))
@@ -424,7 +428,7 @@
  */
 int RestoreVisRgn( HDC hdc )
 {
-    HRGN saved;
+    HRGN32 saved;
     RGNOBJ *obj, *savedObj;
     DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc || !dc->w.hVisRgn) return ERROR;    
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 180e1ae..064d02b 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -232,10 +232,10 @@
  *
  * Create a cursor or icon from a resource.
  */
-HANDLE CURSORICON_LoadHandler( HANDLE handle, HINSTANCE hInstance,
-                                      BOOL fCursor )
+HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
+                                  BOOL fCursor )
 {
-    HANDLE hAndBits, hXorBits;
+    HBITMAP16 hAndBits, hXorBits;
     HDC32 hdc;
     int size, sizeAnd, sizeXor;
     POINT16 hotspot = { 0 ,0 };
@@ -367,10 +367,11 @@
  *
  * Load a cursor or icon.
  */
-static HANDLE CURSORICON_Load( HANDLE hInstance, SEGPTR name, int width,
-                               int height, int colors, BOOL fCursor )
+static HGLOBAL16 CURSORICON_Load( HINSTANCE16 hInstance, SEGPTR name,
+                                  int width, int height, int colors,
+                                  BOOL fCursor )
 {
-    HANDLE handle,hRet;
+    HGLOBAL16 handle, hRet;
     HRSRC16 hRsrc;
     CURSORICONDIRENTRY dirEntry;
 
@@ -408,11 +409,11 @@
  *
  * Make a copy of a cursor or icon.
  */
-static HANDLE CURSORICON_Copy( HANDLE hInstance, HANDLE handle )
+static HGLOBAL16 CURSORICON_Copy( HINSTANCE16 hInstance, HGLOBAL16 handle )
 {
     char *ptrOld, *ptrNew;
     int size;
-    HANDLE hNew;
+    HGLOBAL16 hNew;
 
     if (!(ptrOld = (char *)GlobalLock16( handle ))) return 0;
     if (!(hInstance = GetExePtr( hInstance ))) return 0;
@@ -446,9 +447,7 @@
        else 
 	  {
 	   /* kludge */
-
-	   HTASK hTask = GetCurrentTask();
-	   TDB*  pTask = (TDB *)GlobalLock16(hTask);
+	   TDB* pTask = (TDB *)GlobalLock16( GetCurrentTask() );
 
 	   if(!pTask) return 0;
 
@@ -499,7 +498,7 @@
 /***********************************************************************
  *           CreateCursor    (USER.406)
  */
-HCURSOR16 CreateCursor( HINSTANCE hInstance, INT xHotSpot, INT yHotSpot,
+HCURSOR16 CreateCursor( HINSTANCE16 hInstance, INT xHotSpot, INT yHotSpot,
                         INT nWidth, INT nHeight,
                         const BYTE *lpANDbits, const BYTE *lpXORbits )
 {
@@ -514,7 +513,7 @@
 /***********************************************************************
  *           CreateIcon    (USER.407)
  */
-HICON16 CreateIcon( HINSTANCE hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
+HICON16 CreateIcon( HINSTANCE16 hInstance, INT nWidth, INT nHeight, BYTE bPlanes,
                   BYTE bBitsPixel, const BYTE* lpANDbits, const BYTE* lpXORbits)
 {
     CURSORICONINFO info = { { 0, 0 }, nWidth, nHeight, 0, bPlanes, bBitsPixel };
@@ -528,10 +527,12 @@
 /***********************************************************************
  *           CreateCursorIconIndirect    (USER.408)
  */
-HANDLE CreateCursorIconIndirect( HANDLE hInstance, CURSORICONINFO *info,
-                                 const BYTE *lpANDbits, const BYTE *lpXORbits )
+HGLOBAL16 CreateCursorIconIndirect( HINSTANCE16 hInstance,
+                                    CURSORICONINFO *info,
+                                    const BYTE *lpANDbits,
+                                    const BYTE *lpXORbits )
 {
-    HANDLE handle;
+    HGLOBAL16 handle;
     char *ptr;
     int sizeAnd, sizeXor;
 
@@ -611,7 +612,7 @@
 {
     CURSORICONINFO *ptr;
     HDC hMemDC;
-    HBITMAP hXorBits, hAndBits;
+    HBITMAP16 hXorBits, hAndBits;
     COLORREF oldFg, oldBg;
 
     if (!(ptr = (CURSORICONINFO *)GlobalLock16( hIcon ))) return FALSE;
@@ -625,7 +626,7 @@
 
     if (hXorBits && hAndBits)
     {
-        HBITMAP hBitTemp = SelectObject( hMemDC, hAndBits );
+        HBITMAP16 hBitTemp = SelectObject( hMemDC, hAndBits );
         BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCAND );
         SelectObject( hMemDC, hXorBits );
         BitBlt( hdc, x, y, ptr->nWidth, ptr->nHeight, hMemDC, 0, 0, SRCINVERT);
@@ -934,7 +935,7 @@
 /**********************************************************************
  *	    GetIconID    (USER.455)
  */
-WORD GetIconID( HANDLE hResource, DWORD resType )
+WORD GetIconID( HGLOBAL16 hResource, DWORD resType )
 {
     CURSORICONDIR *lpDir = (CURSORICONDIR *)GlobalLock16(hResource);
 /* LockResource16(hResource); */
@@ -973,7 +974,7 @@
 /**********************************************************************
  *	    LoadIconHandler    (USER.456)
  */
-HICON16 LoadIconHandler( HANDLE hResource, BOOL bNew )
+HICON16 LoadIconHandler( HGLOBAL16 hResource, BOOL bNew )
 {
     dprintf_cursor(stddeb,"LoadIconHandler: hRes=%04x\n",hResource);
 
diff --git a/objects/dc.c b/objects/dc.c
index 76d925a..f777779 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -14,20 +14,15 @@
 #include "color.h"
 #include "debug.h"
 #include "font.h"
-#include "callback.h"
 #include "xmalloc.h"
 
 extern void CLIPPING_UpdateGCRegion( DC * dc );     /* objects/clipping.c */
-extern BOOL DCHook( HDC, WORD, DWORD, DWORD );      /* windows/dce.c */
 
   /* Default DC values */
 static const WIN_DC_INFO DC_defaultValues =
 {
     0,                      /* flags */
     NULL,                   /* devCaps */
-    0,                      /* hMetaFile */
-    0,			    /* hHT */
-    0,			    /* HTLen */
     0,                      /* hClipRgn */
     0,                      /* hVisRgn */
     0,                      /* hGCClipRgn */
@@ -146,6 +141,41 @@
 
 
 /***********************************************************************
+ *           DC_AllocDC
+ */
+DC *DC_AllocDC( const DC_FUNCTIONS *funcs )
+{
+    HDC16 hdc;
+    DC *dc;
+
+    if (!(hdc = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return NULL;
+    dc = (DC *) GDI_HEAP_LIN_ADDR( hdc );
+
+    dc->hSelf      = hdc;
+    dc->funcs      = funcs;
+    dc->physDev    = NULL;
+    dc->saveLevel  = 0;
+    dc->dwHookData = 0L;
+    dc->hookProc   = NULL;
+
+    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
+    return dc;
+}
+
+
+/***********************************************************************
+ *           DC_GetDCPtr
+ */
+DC *DC_GetDCPtr( HDC32 hdc )
+{
+    GDIOBJHDR *ptr = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hdc );
+    if ((ptr->wMagic == DC_MAGIC) || (ptr->wMagic == METAFILE_DC_MAGIC))
+        return (DC *)ptr;
+    return NULL;
+}
+
+
+/***********************************************************************
  *           DC_InitDC
  *
  * Setup device-specific DC values for a newly created DC.
@@ -169,7 +199,7 @@
  * If fMapColors is TRUE, X pixels are mapped to Windows colors.
  * Return FALSE if brush is BS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL fMapColors )
+BOOL32 DC_SetupGCForPatBlt( DC * dc, GC gc, BOOL32 fMapColors )
 {
     XGCValues val;
     unsigned long mask;
@@ -251,7 +281,7 @@
  * Setup dc->u.x.gc for drawing operations using current brush.
  * Return FALSE if brush is BS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForBrush( DC * dc )
+BOOL32 DC_SetupGCForBrush( DC * dc )
 {
     return DC_SetupGCForPatBlt( dc, dc->u.x.gc, FALSE );
 }
@@ -263,7 +293,7 @@
  * Setup dc->u.x.gc for drawing operations using current pen.
  * Return FALSE if pen is PS_NULL, TRUE otherwise.
  */
-BOOL DC_SetupGCForPen( DC * dc )
+BOOL32 DC_SetupGCForPen( DC * dc )
 {
     XGCValues val;
 
@@ -309,7 +339,7 @@
  * Setup dc->u.x.gc for text drawing operations.
  * Return FALSE if the font is null, TRUE otherwise.
  */
-BOOL DC_SetupGCForText( DC * dc )
+BOOL32 DC_SetupGCForText( DC * dc )
 {
     XGCValues val;
 
@@ -334,32 +364,12 @@
 
 
 /***********************************************************************
- *           DC_CallHookProc
- */
-BOOL DC_CallHookProc(DC* dc, WORD code, LPARAM lParam)
-{
-  BOOL bRet = FALSE;
-  FARPROC16 ptr = GDI_GetDefDCHook();
-
-  dprintf_dc(stddeb,"CallDCHook: code %04x\n", code);
-
-  /* if 16-bit callback is, in fact, a thunk to DCHook simply call DCHook */
-
-  if( dc->hookProc && !(dc->w.flags & (DC_SAVED | DC_MEMORY)) )
-    bRet = (dc->hookProc == ptr) ?
-          DCHook(dc->hSelf, code, dc->dwHookData, lParam):
-          CallDCHookProc(dc->hookProc, dc->hSelf, code, dc->dwHookData, lParam);
-
-  return bRet;
-}
-
-/***********************************************************************
  *           GetDCState    (GDI.179)
  */
 HDC GetDCState( HDC hdc )
 {
     DC * newdc, * dc;
-    HANDLE handle;
+    HGDIOBJ16 handle;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
     if (!(handle = GDI_AllocObject( sizeof(DC), DC_MAGIC ))) return 0;
@@ -393,9 +403,9 @@
 void SetDCState( HDC hdc, HDC hdcs )
 {
     DC * dc, * dcs;
-    HRGN hVisRgn, hClipRgn, hGCClipRgn;
-    HFONT hfont;
-    HBRUSH hbrush;
+    HRGN32 hVisRgn, hClipRgn, hGCClipRgn;
+    HFONT16 hfont;
+    HBRUSH16 hbrush;
     
     if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return;
     if (!(dcs = (DC *) GDI_GetObjPtr( hdcs, DC_MAGIC ))) return;
@@ -489,39 +499,25 @@
 HDC CreateDC( LPCSTR driver, LPCSTR device, LPCSTR output, const DEVMODE* initData )
 {
     DC * dc;
-    HDC16 handle;
     const DC_FUNCTIONS *funcs;
 
     if (!(funcs = DRIVER_FindDriver( driver ))) return 0;
-
-    handle = GDI_AllocObject( sizeof(DC), DC_MAGIC );
-    if (!handle) return 0;
-    dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
+    if (!(dc = DC_AllocDC( funcs ))) return 0;
+    dc->w.flags = 0;
 
     dprintf_dc(stddeb, "CreateDC(%s %s %s): returning %04x\n",
-	    driver, device, output, handle );
-
-    dc->hSelf      = handle;
-    dc->funcs      = funcs;
-    dc->physDev    = NULL;
-    dc->saveLevel  = 0;
-    dc->dwHookData = 0L;
-    dc->hookProc   = (SEGPTR)0;
-
-    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
-    dc->w.flags = 0;
+               driver, device, output, dc->hSelf );
 
     if (dc->funcs->pCreateDC &&
         !dc->funcs->pCreateDC( dc, driver, device, output, initData ))
     {
         dprintf_dc( stddeb, "CreateDC: creation aborted by device\n" );
-        GDI_HEAP_FREE( handle );
+        GDI_HEAP_FREE( dc->hSelf );
         return 0;
     }
 
     DC_InitDC( dc );
-
-    return handle;
+    return dc->hSelf;
 }
 
 
@@ -541,35 +537,24 @@
 HDC CreateCompatibleDC( HDC hdc )
 {
     DC *dc, *origDC;
-    HDC16 handle;
-    HBITMAP hbitmap;
+    HBITMAP16 hbitmap;
     const DC_FUNCTIONS *funcs;
 
     if ((origDC = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC ))) funcs = origDC->funcs;
     else funcs = DRIVER_FindDriver( "DISPLAY" );
     if (!funcs) return 0;
 
-    handle = GDI_AllocObject( sizeof(DC), DC_MAGIC );
-    if (!handle) return 0;
-    dc = (DC *) GDI_HEAP_LIN_ADDR( handle );
+    if (!(dc = DC_AllocDC( funcs ))) return 0;
 
-    dprintf_dc(stddeb, "CreateCompatibleDC(%04x): returning %04x\n", hdc, handle );
+    dprintf_dc(stddeb, "CreateCompatibleDC(%04x): returning %04x\n",
+               hdc, dc->hSelf );
 
       /* Create default bitmap */
     if (!(hbitmap = CreateBitmap( 1, 1, 1, 1, NULL )))
     {
-	GDI_HEAP_FREE( handle );
+	GDI_HEAP_FREE( dc->hSelf );
 	return 0;
     }
-
-    memcpy( &dc->w, &DC_defaultValues, sizeof(DC_defaultValues) );
-
-    dc->hSelf          = handle;
-    dc->funcs          = funcs;
-    dc->physDev        = NULL;
-    dc->saveLevel      = 0;
-    dc->dwHookData     = 0L;
-    dc->hookProc       = (SEGPTR)0;
     dc->w.flags        = DC_MEMORY;
     dc->w.bitsPerPixel = 1;
     dc->w.hBitmap      = hbitmap;
@@ -580,13 +565,12 @@
     {
         dprintf_dc( stddeb, "CreateDC: creation aborted by device\n" );
         DeleteObject( hbitmap );
-        GDI_HEAP_FREE( handle );
+        GDI_HEAP_FREE( dc->hSelf );
         return 0;
     }
 
     DC_InitDC( dc );
-
-    return handle;
+    return dc->hSelf;
 }
 
 
@@ -751,12 +735,12 @@
 /***********************************************************************
  *           SetDCHook   (GDI.190)
  */
-BOOL SetDCHook( HDC hDC, FARPROC16 hookProc, DWORD dwHookData )
+BOOL16 SetDCHook( HDC16 hdc, FARPROC16 hookProc, DWORD dwHookData )
 {
-    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
 
     dprintf_dc( stddeb, "SetDCHook: hookProc %08x, default is %08x\n",
-                (unsigned)hookProc,(unsigned)GDI_GetDefDCHook() );
+                (UINT32)hookProc, (UINT32)DCHook );
 
     if (!dc) return FALSE;
     dc->hookProc = hookProc;
@@ -768,9 +752,9 @@
 /***********************************************************************
  *           GetDCHook   (GDI.191)
  */
-DWORD GetDCHook( HDC hDC, FARPROC16 *phookProc )
+DWORD GetDCHook( HDC16 hdc, FARPROC16 *phookProc )
 {
-    DC *dc = (DC *)GDI_GetObjPtr( hDC, DC_MAGIC );
+    DC *dc = (DC *)GDI_GetObjPtr( hdc, DC_MAGIC );
     if (!dc) return 0;
     *phookProc = dc->hookProc;
     return dc->dwHookData;
diff --git a/objects/dcvalues.c b/objects/dcvalues.c
index c330f41..9ce69c5 100644
--- a/objects/dcvalues.c
+++ b/objects/dcvalues.c
@@ -84,11 +84,11 @@
 DC_GET_X_Y( DWORD, GetViewportOrg, VportOrgX, VportOrgY )         /* GDI.95 */
 DC_GET_X_Y( DWORD, GetWindowExt, WndExtX, WndExtY )               /* GDI.96 */
 DC_GET_X_Y( DWORD, GetWindowOrg, WndOrgX, WndOrgY )               /* GDI.97 */
-DC_GET_VAL( HRGN, InquireVisRgn, hVisRgn )                        /* GDI.131 */
+DC_GET_VAL( HRGN32, InquireVisRgn, hVisRgn )                      /* GDI.131 */
 DC_GET_X_Y( DWORD, GetBrushOrg, brushOrgX, brushOrgY )            /* GDI.149 */
-DC_GET_VAL( HRGN, GetClipRgn, hClipRgn )                          /* GDI.173 */
+DC_GET_VAL( HRGN32, GetClipRgn, hClipRgn )                        /* GDI.173 */
 DC_GET_VAL( WORD, GetTextAlign, textAlign )                       /* GDI.345 */
-DC_GET_VAL( HFONT, GetCurLogFont, hFont )                         /* GDI.411 */
+DC_GET_VAL( HFONT16, GetCurLogFont, hFont )                       /* GDI.411 */
 DC_GET_VAL_EX( GetBrushOrgEx, brushOrgX, brushOrgY )              /* GDI.469 */
 DC_GET_VAL_EX( GetCurrentPositionEx, CursPosX, CursPosY )         /* GDI.470 */
 DC_GET_VAL_EX( GetViewportExtEx, VportExtX, VportExtY )           /* GDI.472 */
diff --git a/objects/dib.c b/objects/dib.c
index 8d2907d..4f8dd6c 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -626,7 +626,7 @@
 	WORD xSrc, WORD ySrc, WORD wSrcWidth, WORD wSrcHeight,
 	LPSTR bits, LPBITMAPINFO info, WORD wUsage, DWORD dwRop )
 {
-    HBITMAP hBitmap, hOldBitmap;
+    HBITMAP16 hBitmap, hOldBitmap;
     HDC hdcMem;
 
     hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
@@ -724,7 +724,7 @@
 /***********************************************************************
  *           GetDIBits    (GDI.441)
  */
-int GetDIBits( HDC hdc, HBITMAP hbitmap, WORD startscan, WORD lines,
+int GetDIBits( HDC hdc, HBITMAP16 hbitmap, WORD startscan, WORD lines,
 	       LPSTR bits, BITMAPINFO * info, WORD coloruse )
 {
     DC * dc;
@@ -792,10 +792,10 @@
 /***********************************************************************
  *           CreateDIBitmap    (GDI.442)
  */
-HBITMAP CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
-		        LPVOID bits, BITMAPINFO * data, UINT coloruse )
+HBITMAP16 CreateDIBitmap( HDC hdc, BITMAPINFOHEADER * header, DWORD init,
+                          LPVOID bits, BITMAPINFO * data, UINT coloruse )
 {
-    HBITMAP handle;
+    HBITMAP16 handle;
     BOOL fColor;
     DWORD width, height;
     WORD bpp;
diff --git a/objects/font.c b/objects/font.c
index a632754..aca3874 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -529,7 +529,7 @@
     static X_PHYSFONT stockFonts[LAST_STOCK_FONT-FIRST_STOCK_FONT+1];
 
     static struct {
-		HFONT		id;
+		HFONT16		id;
 		LOGFONT16	logfont;
 		int		access;
 		int		used;
@@ -537,7 +537,7 @@
     int 	i;
 
     X_PHYSFONT * stockPtr;
-    HFONT prevHandle = dc->w.hFont;
+    HFONT16 prevHandle = dc->w.hFont;
     XFontStruct * fontStruct;
     dprintf_font(stddeb,"FONT_SelectObject(%p, %04x, %p)\n", dc, hfont, font);
 
@@ -545,7 +545,7 @@
       /* Load font if necessary */
     if (!font)
     {
-	HFONT hnewfont;
+	HFONT16 hnewfont;
 
 	hnewfont = CreateFont16(10, 7, 0, 0, FW_DONTCARE,
 			      FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0,
@@ -1155,10 +1155,10 @@
  */
 INT EnumFonts(HDC hDC, LPCSTR lpFaceName, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
 {
-  HANDLE       hLog;
-  HANDLE       hMet;
-  HFONT	       hFont;
-  HFONT	       hOldFont;
+  HLOCAL16     hLog;
+  HLOCAL16     hMet;
+  HFONT16 hFont;
+  HFONT16 hOldFont;
   LPLOGFONT16  lpLogFont;
   LPTEXTMETRIC16 lptm;
   LPSTR	       lpOldName;
@@ -1225,10 +1225,10 @@
  */
 INT EnumFontFamilies(HDC hDC, LPCSTR lpszFamily, FONTENUMPROC16 lpEnumFunc, LPARAM lpData)
 {
-  HANDLE       	hLog;
-  HANDLE       	hMet;
-  HFONT	       	hFont;
-  HFONT	       	hOldFont;
+  HLOCAL16     	hLog;
+  HLOCAL16     	hMet;
+  HFONT16 hFont;
+  HFONT16 hOldFont;
   LPENUMLOGFONT16 lpEnumLogFont;
   LPTEXTMETRIC16 lptm;
   LPSTR	       	lpOldName;
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index f196635..3aae235 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -12,7 +12,6 @@
 #include "brush.h"
 #include "font.h"
 #include "heap.h"
-#include "module.h"
 #include "palette.h"
 #include "pen.h"
 #include "region.h"
@@ -148,8 +147,6 @@
     (GDIOBJHDR *) &SystemFixedFont
 };
 
-static FARPROC16 defDCHookCallback;
-
 
 /***********************************************************************
  *           GDI_Init
@@ -165,13 +162,6 @@
 
     if (!X11DRV_Init()) return FALSE;
 
-    /* Get default hook */
-
-    defDCHookCallback = (FARPROC16)MODULE_GetEntryPoint(GetModuleHandle("USER"),
-                                                        362  /* DCHook */ );
-    dprintf_gdi( stddeb, "DCHook: 16-bit callback is %08x\n",
-                 (unsigned)defDCHookCallback );
-
       /* Create default palette */
 
     if (!(hpalette = COLOR_Init())) return FALSE;
@@ -194,22 +184,13 @@
 
 
 /***********************************************************************
- *           GDI_GetDefDCHook
- */
-FARPROC16 GDI_GetDefDCHook(void)
-{
-    return defDCHookCallback;
-}
-
-
-/***********************************************************************
  *           GDI_AllocObject
  */
-HANDLE16 GDI_AllocObject( WORD size, WORD magic )
+HGDIOBJ16 GDI_AllocObject( WORD size, WORD magic )
 {
     static DWORD count = 0;
     GDIOBJHDR * obj;
-    HANDLE handle = GDI_HEAP_ALLOC( size );
+    HGDIOBJ16 handle = GDI_HEAP_ALLOC( size );
     if (!handle) return 0;
     obj = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     obj->hNext   = 0;
@@ -222,7 +203,7 @@
 /***********************************************************************
  *           GDI_FreeObject
  */
-BOOL32 GDI_FreeObject( HANDLE16 handle )
+BOOL32 GDI_FreeObject( HGDIOBJ16 handle )
 {
     GDIOBJHDR * object;
 
@@ -246,7 +227,7 @@
  * Return a pointer to the GDI object associated to the handle.
  * Return NULL if the object has the wrong magic number.
  */
-GDIOBJHDR * GDI_GetObjPtr( HANDLE16 handle, WORD magic )
+GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16 handle, WORD magic )
 {
     GDIOBJHDR * ptr = NULL;
 
@@ -290,13 +271,13 @@
 /***********************************************************************
  *           GetStockObject    (GDI.87)
  */
-HANDLE GetStockObject( int obj )
+HGDIOBJ16 GetStockObject( INT16 obj )
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
     dprintf_gdi(stddeb, "GetStockObject: returning %d\n",
                 FIRST_STOCK_HANDLE + obj );
-    return (HANDLE)(FIRST_STOCK_HANDLE + obj);
+    return (HGDIOBJ16)(FIRST_STOCK_HANDLE + obj);
 }
 
 
@@ -376,7 +357,7 @@
 /***********************************************************************
  *           SelectObject    (GDI.45)
  */
-HANDLE SelectObject( HDC hdc, HANDLE handle )
+HGDIOBJ16 SelectObject( HDC hdc, HGDIOBJ16 handle )
 {
     GDIOBJHDR * ptr = NULL;
     DC * dc;
@@ -406,7 +387,7 @@
       case FONT_MAGIC:
 	  return FONT_SelectObject( dc, handle, (FONTOBJ *)ptr );	  
       case REGION_MAGIC:
-	  return (HANDLE)SelectClipRgn( hdc, handle );
+	  return (HGDIOBJ16)SelectClipRgn( hdc, handle );
     }
     return 0;
 }
@@ -415,7 +396,7 @@
 /***********************************************************************
  *           UnrealizeObject    (GDI.150)
  */
-BOOL UnrealizeObject( HANDLE obj )
+BOOL UnrealizeObject( HGDIOBJ16 obj )
 {
       /* Check if object is valid */
 
@@ -521,7 +502,7 @@
 /***********************************************************************
  *           IsGDIObject    (GDI.462)
  */
-BOOL IsGDIObject(HANDLE handle)
+BOOL16 IsGDIObject( HGDIOBJ16 handle )
 {
     GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
     if (object)
diff --git a/objects/metafile.c b/objects/metafile.c
index 3d38d3a..1b1760f 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -11,11 +11,48 @@
 #include "gdi.h"
 #include "bitmap.h"
 #include "file.h"
+#include "heap.h"
 #include "metafile.h"
+#include "metafiledrv.h"
 #include "stddebug.h"
 #include "debug.h"
 
-#define HTINCR  10      /* handle table allocation size increment */
+/******************************************************************
+ *         MF_AddHandle
+ *
+ *    Add a handle to an external handle table and return the index
+ */
+
+static int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HGDIOBJ16 hobj)
+{
+    int i;
+
+    for (i = 0; i < htlen; i++)
+    {
+	if (*(ht->objectHandle + i) == 0)
+	{
+	    *(ht->objectHandle + i) = hobj;
+	    return i;
+	}
+    }
+    return -1;
+}
+
+
+/******************************************************************
+ *         MF_AddHandleDC
+ *
+ * Note: this function assumes that we never delete objects.
+ * If we do someday, we'll need to maintain a table to re-use deleted
+ * handles.
+ */
+static int MF_AddHandleDC( DC *dc )
+{
+    METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    physDev->mh->mtNoObjects++;
+    return physDev->nextHandle++;
+}
+
 
 /******************************************************************
  *         GetMetafile         GDI.124 By Kenny MacDonald 30 Nov 94
@@ -79,68 +116,6 @@
 
 }
 
-/******************************************************************
- *         CreateMetafile         GDI.125
- */
-
-HANDLE CreateMetaFile(LPCSTR lpFilename)
-{
-    DC *dc;
-    HANDLE handle;
-    METAHEADER *mh;
-    HFILE hFile;
-    
-    dprintf_metafile(stddeb,"CreateMetaFile: %s\n", lpFilename);
-
-    handle = GDI_AllocObject(sizeof(DC), METAFILE_DC_MAGIC);
-    
-    if (!handle) 
-      return 0;
-    
-    dc = (DC *)GDI_HEAP_LIN_ADDR(handle);
-
-    if (!(dc->w.hMetaFile = GlobalAlloc16(GMEM_MOVEABLE, sizeof(METAHEADER)))) {
-        GDI_FreeObject(handle);
-	return 0;
-    }
-    if (!(dc->w.hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT,
-				    sizeof(HANDLETABLE16) * HTINCR))) {
-	GlobalFree16(dc->w.hMetaFile);
-	GDI_FreeObject(handle);
-	return 0;
-    }
-    dc->w.HTLen = HTINCR;
-    dc->w.bitsPerPixel = screenDepth;
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
-
-    mh->mtHeaderSize = MFHEADERSIZE / 2;
-    mh->mtVersion = MFVERSION;
-    mh->mtSize = MFHEADERSIZE / 2;
-    mh->mtNoObjects = 0;
-    mh->mtMaxRecord = 0;
-    mh->mtNoParameters = 0;
-
-    if (lpFilename)          /* disk based metafile */
-    {
-	mh->mtType = 1;     /* disk */
-	hFile = _lcreat(lpFilename, 0);
-	if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
-	{
-	    GlobalFree16(dc->w.hHT);
-	    GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(handle);
-	    return 0;
-	}
-	mh->mtNoParameters = hFile; /* store file descriptor here */
-	                            /* windows probably uses this too*/
-    }
-    else                     /* memory based metafile */
-	mh->mtType = 0;
-
-    GlobalUnlock16(dc->w.hMetaFile);
-    dprintf_metafile(stddeb,"CreateMetaFile: returning %04x\n", handle);
-    return handle;
-}
 
 /******************************************************************
  *         CopyMetafile         GDI.151 Niels de Carpentier, April 1996
@@ -204,6 +179,7 @@
 }
 
 
+#if 0
 /******************************************************************
  *         CloseMetafile         GDI.126
  */
@@ -214,15 +190,14 @@
     METAHEADER *mh;
     HMETAFILE16 hmf;
     HFILE hFile;
+    METAFILEDRV_PDEVICE *physDev;
     
     dprintf_metafile(stddeb,"CloseMetaFile\n");
 
-    dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC);
-    
-    if (!dc) 
-      return 0;
-    
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if (!(dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC))) return 0;
+
+    physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+    mh = (METAHEADER *)GlobalLock16( physDev->hMetafile );
 
     /* Construct the end of metafile record - this is documented
      * in SDK Knowledgebase Q99334.
@@ -230,9 +205,7 @@
 
     if (!MF_MetaParam0(dc, META_EOF))
     {
-	GlobalFree16(dc->w.hHT);
-	GlobalFree16(dc->w.hMetaFile);
-	GDI_FreeObject(hdc);
+        DeleteDC( hdc );
 	return 0;
     }	
 
@@ -242,25 +215,21 @@
 	mh->mtNoParameters = 0;
         if (_llseek(hFile, 0L, 0) == -1)
         {
-	    GlobalFree16(dc->w.hHT);
-            GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(hdc);
+            DeleteDC( hdc );
             return 0;
         }
         if (_lwrite32(hFile, (char *)mh, MFHEADERSIZE) == -1)
         {
-	    GlobalFree16(dc->w.hHT);
-            GlobalFree16(dc->w.hMetaFile);
-	    GDI_FreeObject(hdc);
+            DeleteDC( hdc );
             return 0;
         }
         _lclose(hFile);
     }
 
-    GlobalFree16(dc->w.hHT);
-    hmf = dc->w.hMetaFile;
-    GlobalUnlock16(hmf);
-    GDI_FreeObject(hdc);
+    hmf = physDev->hMetafile;
+    GlobalUnlock16( hmf );
+    physDev->hMetafile = 0;  /* So it won't be deleted */
+    DeleteDC( hdc );
     return hmf;
 }
 
@@ -279,7 +248,7 @@
     GlobalFree16(hmf);
     return TRUE;
 }
-
+#endif
 
 /******************************************************************
  *         PlayMetafile         GDI.123
@@ -418,7 +387,7 @@
 			                           WORD nHandles)
 {
     short s1;
-    HANDLE hndl;
+    HANDLE16 hndl;
     char *ptr;
     BITMAPINFOHEADER *infohdr;
 
@@ -774,7 +743,7 @@
  * Trade in a meta file object handle for a handle to the meta file memory
  */
 
-HANDLE GetMetaFileBits(HMETAFILE16 hmf)
+HGLOBAL16 GetMetaFileBits(HMETAFILE16 hmf)
 {
     dprintf_metafile(stddeb,"GetMetaFileBits: hMem out: %04x\n", hmf);
 
@@ -787,7 +756,7 @@
  * Trade in a meta file memory handle for a handle to a meta file object
  */
 
-HMETAFILE16 SetMetaFileBits(HANDLE hMem)
+HMETAFILE16 SetMetaFileBits( HGLOBAL16 hMem )
 {
     dprintf_metafile(stddeb,"SetMetaFileBits: hmf out: %04x\n", hMem);
 
@@ -796,88 +765,38 @@
 
 /******************************************************************
  *         MF_WriteRecord
+ *
+ * Warning: this function can change the metafile handle.
  */
 
-HMETAFILE16 MF_WriteRecord(HMETAFILE16 hmf, METARECORD *mr, WORD rlen)
+static BOOL32 MF_WriteRecord( DC *dc, METARECORD *mr, WORD rlen)
 {
     DWORD len;
-    METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
-    
-    if (mh->mtType == 0)          /* memory based metafile */
+    METAHEADER *mh;
+    METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dc->physDev;
+
+    switch(physDev->mh->mtType)
     {
-	len = mh->mtSize * 2 + rlen;
-	GlobalUnlock16(hmf);
-	hmf = GlobalReAlloc16(hmf, len, GMEM_MOVEABLE); /* hmf can change */
-	mh = (METAHEADER *)GlobalLock16(hmf);
-	memcpy((WORD *)mh + mh->mtSize, mr, rlen);
-    }
-    else if (mh->mtType == 1)     /* disk based metafile */
-    {
-      dprintf_metafile(stddeb,"Writing record to disk\n");
-	if (_lwrite32(mh->mtNoParameters, (char *)mr, rlen) == -1)
-	{
-	    GlobalUnlock16(hmf);
-	    return 0;
-	}
-    }
-    else
-    {
-	GlobalUnlock16(hmf);
-	return 0;
+    case METAFILE_MEMORY:
+	len = physDev->mh->mtSize * 2 + rlen;
+	mh = HeapReAlloc( SystemHeap, 0, physDev->mh, len );
+        if (!mh) return FALSE;
+        physDev->mh = mh;
+	memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen);
+        break;
+    case METAFILE_DISK:
+        dprintf_metafile(stddeb,"Writing record to disk\n");
+	if (_lwrite32(physDev->mh->mtNoParameters, (char *)mr, rlen) == -1)
+	    return FALSE;
+        break;
+    default:
+        fprintf( stderr, "Uknown metafile type %d\n", physDev->mh->mtType );
+        return FALSE;
     }
 
-    mh->mtSize += rlen / 2;
-    mh->mtMaxRecord = MAX(mh->mtMaxRecord, rlen / 2);
-    GlobalUnlock16(hmf);
-    return hmf;
-}
-
-
-/******************************************************************
- *         MF_AddHandle
- *
- *    Add a handle to an external handle table and return the index
- */
-
-int MF_AddHandle(HANDLETABLE16 *ht, WORD htlen, HANDLE hobj)
-{
-    int i;
-
-    for (i = 0; i < htlen; i++)
-    {
-	if (*(ht->objectHandle + i) == 0)
-	{
-	    *(ht->objectHandle + i) = hobj;
-	    return i;
-	}
-    }
-    return -1;
-}
-
-
-/******************************************************************
- *         MF_AddHandleDC
- *
- *    Add a handle to the handle table in the DC, growing table if
- *    necessary. Return the index
- */
-
-int MF_AddHandleDC(DC *dc, HANDLE hobj)
-{
-    int i;
-    HANDLETABLE16 *ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
-
-    if((i = MF_AddHandle(ht, dc->w.HTLen, hobj)) == -1) {
-	GlobalUnlock16(dc->w.hHT);
-	if(!(dc->w.hHT = GlobalReAlloc16(dc->w.hHT, (dc->w.HTLen + HTINCR) *
-	 sizeof(HANDLETABLE16), GMEM_MOVEABLE | GMEM_ZEROINIT)))
-	    return -1;
-	dc->w.HTLen += HTINCR;
-	ht = (HANDLETABLE16 *)GlobalLock16(dc->w.hHT);
-	i = MF_AddHandle(ht, dc->w.HTLen, hobj);
-    }
-    GlobalUnlock16(dc->w.hHT);
-    return i;
+    physDev->mh->mtSize += rlen / 2;
+    physDev->mh->mtMaxRecord = MAX(physDev->mh->mtMaxRecord, rlen / 2);
+    return TRUE;
 }
 
 
@@ -885,57 +804,45 @@
  *         MF_MetaParam0
  */
 
-BOOL MF_MetaParam0(DC *dc, short func)
+BOOL32 MF_MetaParam0(DC *dc, short func)
 {
     char buffer[8];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 3;
     mr->rdFunction = func;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle; 
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam1
  */
-BOOL MF_MetaParam1(DC *dc, short func, short param1)
+BOOL32 MF_MetaParam1(DC *dc, short func, short param1)
 {
     char buffer[8];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 4;
     mr->rdFunction = func;
     *(mr->rdParam) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam2
  */
-BOOL MF_MetaParam2(DC *dc, short func, short param1, short param2)
+BOOL32 MF_MetaParam2(DC *dc, short func, short param1, short param2)
 {
     char buffer[10];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 5;
     mr->rdFunction = func;
     *(mr->rdParam) = param2;
     *(mr->rdParam + 1) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -943,12 +850,11 @@
  *         MF_MetaParam4
  */
 
-BOOL MF_MetaParam4(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam4(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4)
 {
     char buffer[14];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 7;
     mr->rdFunction = func;
@@ -956,10 +862,7 @@
     *(mr->rdParam + 1) = param3;
     *(mr->rdParam + 2) = param2;
     *(mr->rdParam + 3) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -967,12 +870,11 @@
  *         MF_MetaParam6
  */
 
-BOOL MF_MetaParam6(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam6(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5, short param6)
 {
     char buffer[18];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 9;
     mr->rdFunction = func;
@@ -982,23 +884,19 @@
     *(mr->rdParam + 3) = param3;
     *(mr->rdParam + 4) = param2;
     *(mr->rdParam + 5) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle; 
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_MetaParam8
  */
-BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, 
+BOOL32 MF_MetaParam8(DC *dc, short func, short param1, short param2, 
 		   short param3, short param4, short param5,
 		   short param6, short param7, short param8)
 {
     char buffer[22];
     METARECORD *mr = (METARECORD *)&buffer;
-    HMETAFILE16 handle;
     
     mr->rdSize = 11;
     mr->rdFunction = func;
@@ -1010,10 +908,7 @@
     *(mr->rdParam + 5) = param3;
     *(mr->rdParam + 6) = param2;
     *(mr->rdParam + 7) = param1;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1021,37 +916,23 @@
  *         MF_CreateBrushIndirect
  */
 
-BOOL MF_CreateBrushIndirect(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
+BOOL32 MF_CreateBrushIndirect(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGBRUSH16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGBRUSH16) - 2) / 2;
     mr->rdFunction = META_CREATEBRUSHINDIRECT;
     memcpy(&(mr->rdParam), logbrush, sizeof(LOGBRUSH16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, 
-					  mr, mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1059,23 +940,21 @@
  *         MF_CreatePatternBrush
  */
 
-BOOL MF_CreatePatternBrush(DC *dc, HBRUSH hBrush, LOGBRUSH16 *logbrush)
+BOOL32 MF_CreatePatternBrush(DC *dc, HBRUSH16 hBrush, LOGBRUSH16 *logbrush)
 {
     DWORD len, bmSize, biSize;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     BITMAPOBJ *bmp;
     BITMAPINFO *info;
     BITMAPINFOHEADER *infohdr;
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD)];
-    METAHEADER *mh;
 
     switch (logbrush->lbStyle)
     {
     case BS_PATTERN:
-	bmp = (BITMAPOBJ *)GDI_GetObjPtr((HANDLE)logbrush->lbHatch, BITMAP_MAGIC);
+	bmp = (BITMAPOBJ *)GDI_GetObjPtr((HGDIOBJ16)logbrush->lbHatch, BITMAP_MAGIC);
 	if (!bmp) return FALSE;
 	len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + 
 	      (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 6;
@@ -1099,7 +978,7 @@
 	break;
 
     case BS_DIBPATTERN:
-	info = (BITMAPINFO *)GlobalLock16((HANDLE)logbrush->lbHatch);
+	info = (BITMAPINFO *)GlobalLock16((HGLOBAL16)logbrush->lbHatch);
 	if (info->bmiHeader.biCompression)
             bmSize = info->bmiHeader.biSizeImage;
         else
@@ -1120,7 +999,7 @@
     default:
         return FALSE;
     }
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, len)))
+    if (!(MF_WriteRecord(dc, mr, len)))
     {
 	GlobalFree16(hmr);
 	return FALSE;
@@ -1131,18 +1010,10 @@
     mr = (METARECORD *)&buffer;
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
-    if ((index = MF_AddHandleDC(dc, hBrush)) == -1)
-	return FALSE;
 
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1150,36 +1021,23 @@
  *         MF_CreatePenIndirect
  */
 
-BOOL MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
+BOOL32 MF_CreatePenIndirect(DC *dc, HPEN16 hPen, LOGPEN16 *logpen)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGPEN16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGPEN16) - 2) / 2;
     mr->rdFunction = META_CREATEPENINDIRECT;
     memcpy(&(mr->rdParam), logpen, sizeof(LOGPEN16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
-					   mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hPen)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
@@ -1187,47 +1045,34 @@
  *         MF_CreateFontIndirect
  */
 
-BOOL MF_CreateFontIndirect(DC *dc, HFONT hFont, LOGFONT16 *logfont)
+BOOL32 MF_CreateFontIndirect(DC *dc, HFONT16 hFont, LOGFONT16 *logfont)
 {
     int index;
-    HMETAFILE16 handle;
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT16)];
     METARECORD *mr = (METARECORD *)&buffer;
-    METAHEADER *mh;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT16) - 2) / 2;
     mr->rdFunction = META_CREATEFONTINDIRECT;
     memcpy(&(mr->rdParam), logfont, sizeof(LOGFONT16));
-    if (!(dc->w.hMetaFile = MF_WriteRecord(dc->w.hMetaFile, mr, 
-					  mr->rdSize * 2)))
-	return FALSE;
+    if (!(MF_WriteRecord( dc, mr, mr->rdSize * 2))) return FALSE;
 
     mr->rdSize = sizeof(METARECORD) / 2;
     mr->rdFunction = META_SELECTOBJECT;
 
-    if ((index = MF_AddHandleDC(dc, hFont)) == -1)
-	return FALSE;
-
-    mh = (METAHEADER *)GlobalLock16(dc->w.hMetaFile);
+    if ((index = MF_AddHandleDC( dc )) == -1) return FALSE;
     *(mr->rdParam) = index;
-    if (index >= mh->mtNoObjects)
-	mh->mtNoObjects++;
-    GlobalUnlock16(dc->w.hMetaFile);
-    handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
-    
-    return handle;
+    return MF_WriteRecord( dc, mr, mr->rdSize * 2);
 }
 
 
 /******************************************************************
  *         MF_TextOut
  */
-BOOL MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count)
+BOOL32 MF_TextOut(DC *dc, short x, short y, LPCSTR str, short count)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 4;
@@ -1242,21 +1087,20 @@
     memcpy(mr->rdParam + 1, str, count);
     *(mr->rdParam + ((count + 1) >> 1) + 1) = y;
     *(mr->rdParam + ((count + 1) >> 1) + 2) = x;
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 /******************************************************************
  *         MF_ExtTextOut
  */
-BOOL MF_ExtTextOut(DC *dc, short x, short y, UINT16 flags, const RECT16 *rect,
-                   LPCSTR str, short count, const INT16 *lpDx)
+BOOL32 MF_ExtTextOut(DC*dc, short x, short y, UINT16 flags, const RECT16 *rect,
+                     LPCSTR str, short count, const INT16 *lpDx)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
@@ -1278,20 +1122,19 @@
     memcpy(mr->rdParam + 8, str, count);
     if (lpDx)
      memcpy(mr->rdParam + 8+ ((count + 1) >> 1),lpDx,count*sizeof(INT16));
-    handle = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 /******************************************************************
  *         MF_MetaPoly - implements Polygon and Polyline
  */
-BOOL MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count)
+BOOL32 MF_MetaPoly(DC *dc, short func, LPPOINT16 pt, short count)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
 
     len = sizeof(METARECORD) + (count * 4); 
@@ -1304,22 +1147,21 @@
     mr->rdFunction = func;
     *(mr->rdParam) = count;
     memcpy(mr->rdParam + 1, pt, count * 4);
-    handle  = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2);
-    dc->w.hMetaFile = handle;
+    ret = MF_WriteRecord( dc, mr, mr->rdSize * 2);
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
 /******************************************************************
  *         MF_BitBlt
  */
-BOOL MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
-	       short height, HDC hdcSrc, short xSrc, short ySrc, DWORD rop)
+BOOL32 MF_BitBlt(DC *dcDest, short xDest, short yDest, short width,
+                 short height, HDC16 hdcSrc, short xSrc, short ySrc, DWORD rop)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     DC *dcSrc;
     BITMAP16  BM;
@@ -1347,13 +1189,12 @@
       *(mr->rdParam + 4) = width;
       *(mr->rdParam + 5) = yDest;
       *(mr->rdParam + 6) = xDest;
-      handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2);
+      ret = MF_WriteRecord( dcDest, mr, mr->rdSize * 2);
     }  
     else
-      handle = 0;  
-    dcDest->w.hMetaFile = handle;
+        ret = FALSE;
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
@@ -1365,13 +1206,13 @@
  */
 #define STRETCH_VIA_DIB
 #undef  STRETCH_VIA_DIB
-BOOL MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
-		   short heightDest, HDC hdcSrc, short xSrc, short ySrc, 
-		   short widthSrc, short heightSrc, DWORD rop)
+BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
+                     short heightDest, HDC16 hdcSrc, short xSrc, short ySrc, 
+                     short widthSrc, short heightSrc, DWORD rop)
 {
-    HMETAFILE16 handle;
+    BOOL32 ret;
     DWORD len;
-    HANDLE hmr;
+    HGLOBAL16 hmr;
     METARECORD *mr;
     DC *dcSrc;
     BITMAP16  BM;
@@ -1434,13 +1275,12 @@
       *(mr->rdParam + 7) = widthDest;
       *(mr->rdParam + 8) = yDest;
       *(mr->rdParam + 9) = xDest;
-      handle = MF_WriteRecord(dcDest->w.hMetaFile, mr, mr->rdSize * 2);
+      ret = MF_WriteRecord( dcDest, mr, mr->rdSize * 2);
     }  
     else
-      handle = 0;  
-    dcDest->w.hMetaFile = handle;
+        ret = FALSE;
     GlobalFree16(hmr);
-    return handle;
+    return ret;
 }
 
 
diff --git a/objects/text.c b/objects/text.c
index 3d7eb81..acf51de 100644
--- a/objects/text.c
+++ b/objects/text.c
@@ -325,7 +325,7 @@
                      const RECT16 *lprect, LPCSTR str, UINT16 count,
                      const INT16 *lpDx )
 {
-    HRGN	hRgnClip = 0;
+    HRGN32	hRgnClip = 0;
     int 	dir, ascent, descent, i;
     XCharStruct info;
     XFontStruct *font;
@@ -638,7 +638,7 @@
 /***********************************************************************
  *           GrayString   (USER.185)
  */
-BOOL GrayString(HDC hdc, HBRUSH hbr, GRAYSTRINGPROC16 gsprc, LPARAM lParam, 
+BOOL GrayString(HDC hdc, HBRUSH16 hbr, GRAYSTRINGPROC16 gsprc, LPARAM lParam, 
 		INT cch, INT x, INT y, INT cx, INT cy)
 {
     BOOL ret;