update for HEAD-2003091401
[reactos.git] / subsys / win32k / objects / dc.c
index d72b684..da4892e 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 /* $Id$
  *
  * DC.C - Device context functions
 #include <ddk/ntddvid.h>
 
 #include <win32k/bitmaps.h>
+#include <win32k/brush.h>
+#include <win32k/cliprgn.h>
 #include <win32k/coord.h>
 #include <win32k/driver.h>
 #include <win32k/dc.h>
+#include <win32k/misc.h>
 #include <win32k/print.h>
 #include <win32k/region.h>
 #include <win32k/gdiobj.h>
+#include <win32k/paint.h>
 #include <win32k/pen.h>
 #include <win32k/text.h>
+#include "../eng/clip.h"
 #include "../eng/handle.h"
 #include <include/inteng.h>
+#include <include/eng.h>
+#include <include/palette.h>
 
 #define NDEBUG
 #include <win32k/debug1.h>
@@ -38,13 +63,13 @@ static BOOL PrimarySurfaceCreated = FALSE;
 func_type STDCALL  func_name( HDC hdc ) \
 {                                   \
   func_type  ft;                    \
-  PDC  dc = DC_HandleToPtr( hdc );  \
+  PDC  dc = DC_LockDc( hdc );  \
   if (!dc)                          \
   {                                 \
     return 0;                       \
   }                                 \
   ft = dc->dc_field;                \
-  DC_ReleasePtr( hdc );                                \
+  DC_UnlockDc( hdc );                          \
   return ft;                        \
 }
 
@@ -52,82 +77,96 @@ func_type STDCALL  func_name( HDC hdc ) \
  * important that the function has the right signature, for the implementation
  * we can do whatever we want.
  */
-#define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \
-BOOL STDCALL  func_name( HDC hdc, LP##type pt ) \
-{                                   \
-  PDC  dc = DC_HandleToPtr( hdc );  \
-  if (!dc)                          \
-  {                                 \
-    return FALSE;                   \
-  }                                 \
-  ((LPPOINT)pt)->x = dc->ret_x;     \
-  ((LPPOINT)pt)->y = dc->ret_y;     \
-  DC_ReleasePtr( hdc );                                \
-  return  TRUE;                     \
+#define DC_GET_VAL_EX( NtGdiFuncName, IntFuncName, ret_x, ret_y, type ) \
+VOID FASTCALL IntFuncName ( PDC dc, LP##type pt )  \
+{                                                  \
+  ASSERT ( dc );                                   \
+  ASSERT ( pt );                                   \
+  ((LPPOINT)pt)->x = dc->ret_x;                    \
+  ((LPPOINT)pt)->y = dc->ret_y;                    \
+}                                                  \
+BOOL STDCALL NtGdiFuncName ( HDC hdc, LP##type pt ) \
+{                                                  \
+  PDC dc = DC_LockDc ( hdc );                 \
+  if ( !dc )                                       \
+    return FALSE;                                  \
+  IntFuncName ( dc, pt );                          \
+  DC_UnlockDc ( hdc );                           \
+  return TRUE;                                     \
 }
 
 #define DC_SET_MODE( func_name, dc_field, min_val, max_val ) \
 INT STDCALL  func_name( HDC hdc, INT mode ) \
 {                                           \
   INT  prevMode;                            \
-  PDC  dc = DC_HandleToPtr( hdc );          \
-  if(!dc)                                   \
-  {                                         \
-    return 0;                               \
-  }                                         \
+  PDC  dc;                                  \
   if ((mode < min_val) || (mode > max_val)) \
-  {                                         \
     return 0;                               \
-  }                                         \
+  dc = DC_LockDc ( hdc );              \
+  if ( !dc )                                \
+    return 0;                               \
   prevMode = dc->dc_field;                  \
   dc->dc_field = mode;                      \
-  DC_ReleasePtr( hdc );                                                \
+  DC_UnlockDc ( hdc );                    \
   return prevMode;                          \
 }
 
 
 //  ---------------------------------------------------------  File Statics
 
-static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave);
-
 //  -----------------------------------------------------  Public Functions
 
-BOOL STDCALL  W32kCancelDC(HDC  hDC)
+BOOL STDCALL
+NtGdiCancelDC(HDC  hDC)
 {
   UNIMPLEMENTED;
 }
 
-HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
+HDC STDCALL
+NtGdiCreateCompatableDC(HDC  hDC)
 {
-  PDC  NewDC, OrigDC = NULL;
+  PDC  NewDC, OrigDC;
   HBITMAP  hBitmap;
   HDC hNewDC;
+  HRGN hVisRgn;
+  BITMAPOBJ *pb;
 
-  OrigDC = DC_HandleToPtr(hDC);
-  if (OrigDC == NULL)
+  if (hDC == NULL)
   {
+    OrigDC = NULL;
     hNewDC = DC_AllocDC(L"DISPLAY");
-       if( hNewDC )
-               NewDC = DC_HandleToPtr( hNewDC );
   }
-  else {
+  else
+  {
     /*  Allocate a new DC based on the original DC's device  */
+    OrigDC = DC_LockDc(hDC);
+    if (NULL == OrigDC)
+    {
+      return NULL;
+    }
     hNewDC = DC_AllocDC(OrigDC->DriverName);
-       if( hNewDC )
-               NewDC = DC_HandleToPtr( hNewDC );
   }
 
-  if (NewDC == NULL)
+  if (NULL == hNewDC)
   {
     return  NULL;
   }
+  NewDC = DC_LockDc( hNewDC );
 
   /* Copy information from original DC to new DC  */
   NewDC->hSelf = NewDC;
 
   /* FIXME: Should this DC request its own PDEV?  */
-  if(OrigDC == NULL) {
-  } else {
+  if(OrigDC == NULL)
+  {
+    NewDC->PDev = PrimarySurface.PDev;
+    memcpy(NewDC->FillPatternSurfaces, PrimarySurface.FillPatterns,
+           sizeof(NewDC->FillPatternSurfaces));
+    NewDC->GDIInfo = &PrimarySurface.GDIInfo;
+    NewDC->DevInfo = &PrimarySurface.DevInfo;
+  }
+  else
+  {
     NewDC->PDev = OrigDC->PDev;
     NewDC->DMW = OrigDC->DMW;
     memcpy(NewDC->FillPatternSurfaces,
@@ -138,9 +177,12 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
   }
 
   /* DriverName is copied in the AllocDC routine  */
-  if(OrigDC == NULL) {
+  if(OrigDC == NULL)
+  {
     NewDC->DeviceDriver = DRIVER_FindMPDriver(NewDC->DriverName);
-  } else {
+  }
+  else
+  {
     NewDC->DeviceDriver = OrigDC->DeviceDriver;
     NewDC->wndOrgX = OrigDC->wndOrgX;
     NewDC->wndOrgY = OrigDC->wndOrgY;
@@ -153,9 +195,10 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
   }
 
   /* Create default bitmap */
-  if (!(hBitmap = W32kCreateBitmap( 1, 1, 1, 1, NULL )))
+  if (!(hBitmap = NtGdiCreateBitmap( 1, 1, 1, 1, NULL )))
   {
-    DC_ReleasePtr( hNewDC );
+    DC_UnlockDc( hDC );
+    DC_UnlockDc( hNewDC );
     DC_FreeDC( hNewDC );
     return NULL;
   }
@@ -163,22 +206,39 @@ HDC STDCALL  W32kCreateCompatableDC(HDC  hDC)
   NewDC->w.bitsPerPixel = 1;
   NewDC->w.hBitmap      = hBitmap;
   NewDC->w.hFirstBitmap = hBitmap;
-  NewDC->Surface = BitmapToSurf(BITMAPOBJ_HandleToPtr(hBitmap));
+  pb = BITMAPOBJ_LockBitmap(hBitmap);
+  NewDC->Surface = BitmapToSurf(pb);
+  BITMAPOBJ_UnlockBitmap(hBitmap);
 
-  if(OrigDC != NULL)
+  if(OrigDC == NULL)
+  {
+    NewDC->w.hPalette = NewDC->DevInfo->hpalDefault;
+  }
+  else
   {
     NewDC->w.hPalette = OrigDC->w.hPalette;
     NewDC->w.textColor = OrigDC->w.textColor;
     NewDC->w.textAlign = OrigDC->w.textAlign;
+    NewDC->w.backgroundColor = OrigDC->w.backgroundColor;
+    NewDC->w.backgroundMode = OrigDC->w.backgroundMode;
+  }
+  if (NULL != hDC)
+  {
+    DC_UnlockDc( hDC );
   }
-  DC_ReleasePtr( hDC );
-  DC_ReleasePtr( hNewDC );
+  DC_UnlockDc( hNewDC );
+
+  hVisRgn = NtGdiCreateRectRgn(0, 0, 1, 1);
+  NtGdiSelectVisRgn(hNewDC, hVisRgn);
+  NtGdiDeleteObject(hVisRgn);
+
   DC_InitDC(hNewDC);
 
   return  hNewDC;
 }
 
-static BOOL STDCALL FindDriverFileNames(PUNICODE_STRING DriverFileNames)
+static BOOL STDCALL
+FindDriverFileNames(PUNICODE_STRING DriverFileNames)
 {
   RTL_QUERY_REGISTRY_TABLE QueryTable[2];
   UNICODE_STRING RegistryPath;
@@ -223,19 +283,22 @@ static BOOL STDCALL FindDriverFileNames(PUNICODE_STRING DriverFileNames)
   return TRUE;
 }
 
-BOOL STDCALL W32kCreatePrimarySurface(LPCWSTR Driver,
+
+BOOL STDCALL
+NtGdiCreatePrimarySurface(LPCWSTR Driver,
                                      LPCWSTR Device)
 {
   PGD_ENABLEDRIVER GDEnableDriver;
-  HANDLE DeviceDriver;
   DRVENABLEDATA DED;
   PSURFOBJ SurfObj;
+  PSURFGDI SurfGDI;
   UNICODE_STRING DriverFileNames;
   PWSTR CurrentName;
   BOOL GotDriver;
+  extern void FASTCALL IntInitDesktopWindow(ULONG Width, ULONG Height);
 
   /*  Open the miniport driver  */
-  if ((DeviceDriver = DRIVER_FindMPDriver(Driver)) == NULL)
+  if ((PrimarySurface.DisplayDevice = DRIVER_FindMPDriver(Driver)) == NULL)
   {
     DPRINT("FindMPDriver failed\n");
     return(FALSE);
@@ -297,7 +360,7 @@ BOOL STDCALL W32kCreatePrimarySurface(LPCWSTR Driver,
     return FALSE;
   }
 
-  DPRINT("Display driver %S loaded\n", DriverName);
+  DPRINT("Display driver %S loaded\n", CurrentName);
 
   DPRINT("Building DDI Functions\n");
 
@@ -328,7 +391,7 @@ BOOL STDCALL W32kCreatePrimarySurface(LPCWSTR Driver,
                                             &PrimarySurface.DevInfo,
                                             NULL,
                                             L"",
-                                            DeviceDriver);
+                                            PrimarySurface.DisplayDevice);
   if (PrimarySurface.PDev == NULL)
   {
     DPRINT("DrvEnablePDEV failed\n");
@@ -353,25 +416,29 @@ BOOL STDCALL W32kCreatePrimarySurface(LPCWSTR Driver,
 
   SurfObj = (PSURFOBJ)AccessUserObject((ULONG) PrimarySurface.Handle);
   SurfObj->dhpdev = PrimarySurface.PDev;
+  SurfGDI = (PSURFGDI)AccessInternalObject((ULONG) PrimarySurface.Handle);
+  IntInitDesktopWindow(SurfGDI->SurfObj.sizlBitmap.cx, SurfGDI->SurfObj.sizlBitmap.cy);
 
   return TRUE;
 }
 
-HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
-                  LPCWSTR  Device,
-                  LPCWSTR  Output,
-                  CONST PDEVMODEW  InitData)
+HDC STDCALL
+NtGdiCreateDC(LPCWSTR  Driver,
+             LPCWSTR  Device,
+             LPCWSTR  Output,
+             CONST PDEVMODEW  InitData)
 {
   HDC      hNewDC;
   PDC      NewDC;
   HDC      hDC = NULL;
   PSURFGDI SurfGDI;
+  HRGN     hVisRgn;
 
   /*  Check for existing DC object  */
   if ((hNewDC = DC_FindOpenDC(Driver)) != NULL)
   {
     hDC = hNewDC;
-    return  W32kCreateCompatableDC(hDC);
+    return  NtGdiCreateCompatableDC(hDC);
   }
 
   DPRINT("NAME: %S\n", Driver); // FIXME: Should not crash if NULL
@@ -382,22 +449,23 @@ HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
     return  NULL;
   }
 
-  NewDC = DC_HandleToPtr( hNewDC );
+  NewDC = DC_LockDc( hNewDC );
   ASSERT( NewDC );
 
-  if (!PrimarySurfaceCreated)
+  if (! PrimarySurfaceCreated)
     {
-      if (!W32kCreatePrimarySurface(Driver, Device))
+      PrimarySurfaceCreated = TRUE;
+      if (!NtGdiCreatePrimarySurface(Driver, Device))
        {
-         DC_ReleasePtr( hNewDC );
+         PrimarySurfaceCreated = FALSE;
+         DC_UnlockDc( hNewDC );
          DC_FreeDC(hNewDC);
          return  NULL;
        }
     }
-  PrimarySurfaceCreated = TRUE;
   NewDC->DMW = PrimarySurface.DMW;
-  NewDC->DevInfo = PrimarySurface.DevInfo;
-  NewDC->GDIInfo = PrimarySurface.GDIInfo;
+  NewDC->DevInfo = &PrimarySurface.DevInfo;
+  NewDC->GDIInfo = &PrimarySurface.GDIInfo;
   memcpy(NewDC->FillPatternSurfaces, PrimarySurface.FillPatterns,
         sizeof(NewDC->FillPatternSurfaces));
   NewDC->PDev = PrimarySurface.PDev;
@@ -419,36 +487,43 @@ HDC STDCALL  W32kCreateDC(LPCWSTR  Driver,
 
   NewDC->w.bitsPerPixel = SurfGDI->BitsPerPixel; // FIXME: set this here??
 
-  NewDC->w.hPalette = NewDC->DevInfo.hpalDefault;
+  NewDC->w.hPalette = NewDC->DevInfo->hpalDefault;
 
   DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel);
+  
+  DC_UnlockDc( hNewDC );
 
-  NewDC->w.hVisRgn = W32kCreateRectRgn(0, 0, SurfGDI->SurfObj.sizlBitmap.cx,
-                                       SurfGDI->SurfObj.sizlBitmap.cy);
-  DC_ReleasePtr( hNewDC );
+  hVisRgn = NtGdiCreateRectRgn(0, 0, SurfGDI->SurfObj.sizlBitmap.cx,
+                              SurfGDI->SurfObj.sizlBitmap.cy);
+  NtGdiSelectVisRgn(hNewDC, hVisRgn);
+  NtGdiDeleteObject(hVisRgn);
 
   /*  Initialize the DC state  */
   DC_InitDC(hNewDC);
-  W32kSetTextColor(hNewDC, RGB(0, 0, 0));
-  W32kSetTextAlign(hNewDC, TA_TOP);
+  NtGdiSetTextColor(hNewDC, RGB(0, 0, 0));
+  NtGdiSetTextAlign(hNewDC, TA_TOP);
+  NtGdiSetBkColor(hNewDC, RGB(255, 255, 255));
+  NtGdiSetBkMode(hNewDC, OPAQUE);
 
   return hNewDC;
 }
 
-HDC STDCALL W32kCreateIC(LPCWSTR  Driver,
-                         LPCWSTR  Device,
-                         LPCWSTR  Output,
-                         CONST PDEVMODEW  DevMode)
+HDC STDCALL
+NtGdiCreateIC(LPCWSTR  Driver,
+             LPCWSTR  Device,
+             LPCWSTR  Output,
+             CONST PDEVMODEW  DevMode)
 {
   /* FIXME: this should probably do something else...  */
-  return  W32kCreateDC(Driver, Device, Output, DevMode);
+  return  NtGdiCreateDC(Driver, Device, Output, DevMode);
 }
 
-BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
+BOOL STDCALL
+NtGdiDeleteDC(HDC  DCHandle)
 {
   PDC  DCToDelete;
 
-  DCToDelete = DC_HandleToPtr(DCHandle);
+  DCToDelete = DC_LockDc(DCHandle);
   if (DCToDelete == NULL)
     {
       return  FALSE;
@@ -458,14 +533,27 @@ BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
   {
     if (!DRIVER_UnreferenceDriver (DCToDelete->DriverName))
     {
+      PEPROCESS CurrentProcess;
       DPRINT( "No more references to driver, reseting display\n" );
-      DCToDelete->DriverFunctions.DisableSurface(DCToDelete->PDev);
-      CHECKPOINT;
       DCToDelete->DriverFunctions.AssertMode( DCToDelete->PDev, FALSE );
       CHECKPOINT;
+      DCToDelete->DriverFunctions.DisableSurface(DCToDelete->PDev);
+      CHECKPOINT;
       DCToDelete->DriverFunctions.DisablePDev(DCToDelete->PDev);
-         PrimarySurfaceCreated = FALSE;
+
+      CurrentProcess = PsGetCurrentProcess();
+      if (CurrentProcess != Win32kDeviceProcess)
+        {
+          KeAttachProcess(Win32kDeviceProcess);
+       }
+      ZwClose(PrimarySurface.DisplayDevice);
+      if (CurrentProcess != Win32kDeviceProcess)
+        {
+          KeDetachProcess();
        }
+
+      PrimarySurfaceCreated = FALSE;
+    }
   }
   CHECKPOINT;
   /*  First delete all saved DCs  */
@@ -475,84 +563,89 @@ BOOL STDCALL W32kDeleteDC(HDC  DCHandle)
     HDC  savedHDC;
 
     savedHDC = DC_GetNextDC (DCToDelete);
-    savedDC = DC_HandleToPtr (savedHDC);
+    savedDC = DC_LockDc (savedHDC);
     if (savedDC == NULL)
     {
       break;
     }
     DC_SetNextDC (DCToDelete, DC_GetNextDC (savedDC));
     DCToDelete->saveLevel--;
-       DC_ReleasePtr( savedHDC );
-    W32kDeleteDC (savedHDC);
+       DC_UnlockDc( savedHDC );
+    NtGdiDeleteDC (savedHDC);
   }
 
   /*  Free GDI resources allocated to this DC  */
   if (!(DCToDelete->w.flags & DC_SAVED))
   {
     /*
-    W32kSelectObject (DCHandle, STOCK_BLACK_PEN);
-    W32kSelectObject (DCHandle, STOCK_WHITE_BRUSH);
-    W32kSelectObject (DCHandle, STOCK_SYSTEM_FONT);
-    DC_LockDC (DCHandle); W32kSelectObject does not recognize stock objects yet  */
-    BITMAPOBJ_ReleasePtr(DCToDelete->w.hBitmap);
+    NtGdiSelectObject (DCHandle, STOCK_BLACK_PEN);
+    NtGdiSelectObject (DCHandle, STOCK_WHITE_BRUSH);
+    NtGdiSelectObject (DCHandle, STOCK_SYSTEM_FONT);
+    DC_LockDC (DCHandle); NtGdiSelectObject does not recognize stock objects yet  */
     if (DCToDelete->w.flags & DC_MEMORY)
     {
       EngDeleteSurface (DCToDelete->Surface);
-      W32kDeleteObject (DCToDelete->w.hFirstBitmap);
+      NtGdiDeleteObject (DCToDelete->w.hFirstBitmap);
     }
   }
   if (DCToDelete->w.hClipRgn)
   {
-    W32kDeleteObject (DCToDelete->w.hClipRgn);
+    NtGdiDeleteObject (DCToDelete->w.hClipRgn);
   }
   if (DCToDelete->w.hVisRgn)
   {
-    W32kDeleteObject (DCToDelete->w.hVisRgn);
+    NtGdiDeleteObject (DCToDelete->w.hVisRgn);
   }
+  if (NULL != DCToDelete->CombinedClip)
+    {
+      IntEngDeleteClipRegion(DCToDelete->CombinedClip);
+    }
   if (DCToDelete->w.hGCClipRgn)
   {
-    W32kDeleteObject (DCToDelete->w.hGCClipRgn);
+    NtGdiDeleteObject (DCToDelete->w.hGCClipRgn);
   }
 #if 0 /* FIXME */
   PATH_DestroyGdiPath (&DCToDelete->w.path);
 #endif
-  DC_ReleasePtr( DCToDelete );
-  DC_FreeDC (DCToDelete);
+  DC_UnlockDc( DCHandle );
+  DC_FreeDC ( DCHandle );
 
   return TRUE;
 }
 
-INT STDCALL W32kDrawEscape(HDC  hDC,
-                    INT  nEscape,
-                    INT  cbInput,
-                    LPCSTR  lpszInData)
+INT STDCALL
+NtGdiDrawEscape(HDC  hDC,
+               INT  nEscape,
+               INT  cbInput,
+               LPCSTR  lpszInData)
 {
   UNIMPLEMENTED;
 }
 
-INT STDCALL W32kEnumObjects(HDC  hDC,
-                     INT  ObjectType,
-                     GOBJENUMPROC  ObjectFunc,
-                     LPARAM  lParam)
+INT STDCALL
+NtGdiEnumObjects(HDC  hDC,
+                INT  ObjectType,
+                GOBJENUMPROC  ObjectFunc,
+                LPARAM  lParam)
 {
   UNIMPLEMENTED;
 }
 
-DC_GET_VAL( COLORREF, W32kGetBkColor, w.backgroundColor )
-DC_GET_VAL( INT, W32kGetBkMode, w.backgroundMode )
-DC_GET_VAL_EX( W32kGetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT )
-DC_GET_VAL( HRGN, W32kGetClipRgn, w.hClipRgn )
+DC_GET_VAL( COLORREF, NtGdiGetBkColor, w.backgroundColor )
+DC_GET_VAL( INT, NtGdiGetBkMode, w.backgroundMode )
+DC_GET_VAL_EX( NtGdiGetBrushOrgEx, IntGetBrushOrgEx, w.brushOrgX, w.brushOrgY, POINT )
+DC_GET_VAL( HRGN, NtGdiGetClipRgn, w.hClipRgn )
 
-HGDIOBJ STDCALL W32kGetCurrentObject(HDC  hDC,
-                              UINT  ObjectType)
+HGDIOBJ STDCALL
+NtGdiGetCurrentObject(HDC  hDC, UINT  ObjectType)
 {
   UNIMPLEMENTED;
 }
 
-DC_GET_VAL_EX( W32kGetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT )
+DC_GET_VAL_EX ( NtGdiGetCurrentPositionEx, IntGetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT )
 
-BOOL STDCALL W32kGetDCOrgEx(HDC  hDC,
-                     LPPOINT  Point)
+BOOL STDCALL
+NtGdiGetDCOrgEx(HDC  hDC, LPPOINT  Point)
 {
   PDC dc;
 
@@ -560,7 +653,7 @@ BOOL STDCALL W32kGetDCOrgEx(HDC  hDC,
   {
     return FALSE;
   }
-  dc = DC_HandleToPtr(hDC);
+  dc = DC_LockDc(hDC);
   if (dc == NULL)
   {
     return FALSE;
@@ -570,16 +663,32 @@ BOOL STDCALL W32kGetDCOrgEx(HDC  hDC,
 
   Point->x += dc->w.DCOrgX;
   Point->y += dc->w.DCOrgY;
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hDC );
   return  TRUE;
 }
 
-HDC STDCALL W32kGetDCState16(HDC  hDC)
+COLORREF STDCALL
+NtGdiSetBkColor(HDC hDC, COLORREF color)
+{
+  COLORREF oldColor;
+  PDC  dc = DC_LockDc(hDC);
+
+  if ( !dc )
+    return 0x80000000;
+
+  oldColor = dc->w.backgroundColor;
+  dc->w.backgroundColor = color;
+  DC_UnlockDc ( hDC );
+  return oldColor;
+}
+
+static HDC STDCALL
+NtGdiGetDCState(HDC  hDC)
 {
   PDC  newdc, dc;
   HDC hnewdc;
 
-  dc = DC_HandleToPtr(hDC);
+  dc = DC_LockDc(hDC);
   if (dc == NULL)
   {
     return 0;
@@ -588,16 +697,13 @@ HDC STDCALL W32kGetDCState16(HDC  hDC)
   hnewdc = DC_AllocDC(NULL);
   if (hnewdc == NULL)
   {
-       DC_ReleasePtr( hDC );
+    DC_UnlockDc( hDC );
     return 0;
   }
-  newdc = DC_HandleToPtr( hnewdc );
+  newdc = DC_LockDc( hnewdc );
   ASSERT( newdc );
 
   newdc->w.flags            = dc->w.flags | DC_SAVED;
-#if 0
-  newdc->w.devCaps          = dc->w.devCaps;
-#endif
   newdc->w.hPen             = dc->w.hPen;
   newdc->w.hBrush           = dc->w.hBrush;
   newdc->w.hFont            = dc->w.hFont;
@@ -663,117 +769,363 @@ HDC STDCALL W32kGetDCState16(HDC  hDC)
 #endif
   if (dc->w.hClipRgn)
   {
-    newdc->w.hClipRgn = W32kCreateRectRgn( 0, 0, 0, 0 );
-    W32kCombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
+    newdc->w.hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 );
+    NtGdiCombineRgn( newdc->w.hClipRgn, dc->w.hClipRgn, 0, RGN_COPY );
   }
   else
   {
     newdc->w.hClipRgn = 0;
   }
-  DC_ReleasePtr( hnewdc );
+  DC_UnlockDc( hnewdc );
+  DC_UnlockDc( hDC );
   return  hnewdc;
 }
 
-INT STDCALL W32kGetDeviceCaps(HDC  hDC,
-                       INT  Index)
+STATIC
+VOID
+FASTCALL
+NtGdiSetDCState ( HDC hDC, HDC hDCSave )
+{
+  PDC  dc, dcs;
+
+  dc = DC_LockDc ( hDC );
+  if ( dc )
+  {
+    dcs = DC_LockDc ( hDCSave );
+    if ( dcs )
+    {
+      if ( dcs->w.flags & DC_SAVED )
+      {
+       dc->w.flags            = dcs->w.flags & ~DC_SAVED;
+
+       dc->w.hFirstBitmap     = dcs->w.hFirstBitmap;
+
+#if 0
+       dc->w.hDevice          = dcs->w.hDevice;
+#endif
+
+       dc->w.totalExtent      = dcs->w.totalExtent;
+       dc->w.ROPmode          = dcs->w.ROPmode;
+       dc->w.polyFillMode     = dcs->w.polyFillMode;
+       dc->w.stretchBltMode   = dcs->w.stretchBltMode;
+       dc->w.relAbsMode       = dcs->w.relAbsMode;
+       dc->w.backgroundMode   = dcs->w.backgroundMode;
+       dc->w.backgroundColor  = dcs->w.backgroundColor;
+       dc->w.textColor        = dcs->w.textColor;
+       dc->w.brushOrgX        = dcs->w.brushOrgX;
+       dc->w.brushOrgY        = dcs->w.brushOrgY;
+       dc->w.textAlign        = dcs->w.textAlign;
+       dc->w.charExtra        = dcs->w.charExtra;
+       dc->w.breakTotalExtra  = dcs->w.breakTotalExtra;
+       dc->w.breakCount       = dcs->w.breakCount;
+       dc->w.breakExtra       = dcs->w.breakExtra;
+       dc->w.breakRem         = dcs->w.breakRem;
+       dc->w.MapMode          = dcs->w.MapMode;
+       dc->w.GraphicsMode     = dcs->w.GraphicsMode;
+#if 0
+       /* Apparently, the DC origin is not changed by [GS]etDCState */
+       dc->w.DCOrgX           = dcs->w.DCOrgX;
+       dc->w.DCOrgY           = dcs->w.DCOrgY;
+#endif
+       dc->w.CursPosX         = dcs->w.CursPosX;
+       dc->w.CursPosY         = dcs->w.CursPosY;
+       dc->w.ArcDirection     = dcs->w.ArcDirection;
+
+#if 0
+       dc->w.xformWorld2Wnd   = dcs->w.xformWorld2Wnd;
+       dc->w.xformWorld2Vport = dcs->w.xformWorld2Vport;
+       dc->w.xformVport2World = dcs->w.xformVport2World;
+       dc->w.vport2WorldValid = dcs->w.vport2WorldValid;
+#endif
+
+       dc->wndOrgX            = dcs->wndOrgX;
+       dc->wndOrgY            = dcs->wndOrgY;
+       dc->wndExtX            = dcs->wndExtX;
+       dc->wndExtY            = dcs->wndExtY;
+       dc->vportOrgX          = dcs->vportOrgX;
+       dc->vportOrgY          = dcs->vportOrgY;
+       dc->vportExtX          = dcs->vportExtX;
+       dc->vportExtY          = dcs->vportExtY;
+
+       if (!(dc->w.flags & DC_MEMORY))
+       {
+         dc->w.bitsPerPixel = dcs->w.bitsPerPixel;
+       }
+
+#if 0
+       if (dcs->w.hClipRgn)
+       {
+         if (!dc->w.hClipRgn)
+         {
+           dc->w.hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 );
+         }
+         NtGdiCombineRgn( dc->w.hClipRgn, dcs->w.hClipRgn, 0, RGN_COPY );
+       }
+       else
+       {
+         if (dc->w.hClipRgn)
+         {
+           NtGdiDeleteObject( dc->w.hClipRgn );
+         }
+
+         dc->w.hClipRgn = 0;
+       }
+       CLIPPING_UpdateGCRegion( dc );
+#endif
+
+       NtGdiSelectObject( hDC, dcs->w.hBitmap );
+       NtGdiSelectObject( hDC, dcs->w.hBrush );
+       NtGdiSelectObject( hDC, dcs->w.hFont );
+       NtGdiSelectObject( hDC, dcs->w.hPen );
+       NtGdiSetBkColor( hDC, dcs->w.backgroundColor);
+       NtGdiSetTextColor( hDC, dcs->w.textColor);
+
+#if 0
+       GDISelectPalette16( hDC, dcs->w.hPalette, FALSE );
+#endif
+      }
+
+      DC_UnlockDc ( hDCSave );
+    }
+    DC_UnlockDc ( hDC );
+  }
+}
+
+INT STDCALL
+NtGdiGetDeviceCaps(HDC  hDC,
+                  INT  Index)
 {
   PDC  dc;
   INT  ret;
   POINT  pt;
 
-  dc = DC_HandleToPtr(hDC);
+  dc = DC_LockDc(hDC);
   if (dc == NULL)
   {
     return 0;
   }
 
-  /* Device capabilities for the printer */
+  /* Retrieve capability */
   switch (Index)
   {
+    case DRIVERVERSION:
+      ret = dc->GDIInfo->ulVersion;
+      break;
+
+    case TECHNOLOGY:
+      ret = dc->GDIInfo->ulTechnology;
+      break;
+
+    case HORZSIZE:
+      ret = dc->GDIInfo->ulHorzSize;
+      break;
+
+    case VERTSIZE:
+      ret = dc->GDIInfo->ulVertSize;
+      break;
+
+    case HORZRES:
+      ret = dc->GDIInfo->ulHorzRes;
+      break;
+
+    case VERTRES:
+      ret = dc->GDIInfo->ulVertRes;
+      break;
+
+    case LOGPIXELSX:
+      ret = dc->GDIInfo->ulLogPixelsX;
+      break;
+
+    case LOGPIXELSY:
+      ret = dc->GDIInfo->ulLogPixelsY;
+      break;
+
+    case BITSPIXEL:
+      ret = dc->GDIInfo->cBitsPixel;
+      break;
+
+    case PLANES:
+      ret = dc->GDIInfo->cPlanes;
+      break;
+
+    case NUMBRUSHES:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case NUMPENS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case NUMFONTS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case NUMCOLORS:
+      ret = dc->GDIInfo->ulNumColors;
+      break;
+
+    case ASPECTX:
+      ret = dc->GDIInfo->ulAspectX;
+      break;
+
+    case ASPECTY:
+      ret = dc->GDIInfo->ulAspectY;
+      break;
+
+    case ASPECTXY:
+      ret = dc->GDIInfo->ulAspectXY;
+      break;
+
+    case PDEVICESIZE:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case CLIPCAPS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case SIZEPALETTE:
+      ret = dc->GDIInfo->ulNumPalReg; /* FIXME not sure */
+      break;
+
+    case NUMRESERVED:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case COLORRES:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
     case PHYSICALWIDTH:
-      if(W32kEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0)
+      {
+        ret = pt.x;
+      }
+      else
       {
-        return pt.x;
+       ret = 0;
       }
       break;
 
     case PHYSICALHEIGHT:
-      if(W32kEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0)
       {
-        return pt.y;
+        ret = pt.y;
+      }
+      else
+      {
+       ret = 0;
       }
       break;
 
     case PHYSICALOFFSETX:
-      if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
+      {
+        ret = pt.x;
+      }
+      else
       {
-        return pt.x;
+       ret = 0;
       }
       break;
 
     case PHYSICALOFFSETY:
-      if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0)
+      {
+        ret = pt.y;
+      }
+      else
       {
-        return pt.y;
+       ret = 0;
       }
       break;
 
+    case VREFRESH:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
     case SCALINGFACTORX:
-      if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
       {
-        return pt.x;
+        ret = pt.x;
+      }
+      else
+      {
+       ret = 0;
       }
       break;
 
     case SCALINGFACTORY:
-      if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
+      if(NtGdiEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0)
+      {
+        ret = pt.y;
+      }
+      else
       {
-        return pt.y;
+       ret = 0;
       }
       break;
-  }
 
-  if ((Index < 0) || (Index > sizeof(DEVICECAPS) - sizeof(WORD)))
-  {
-    return 0;
+    case RASTERCAPS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case CURVECAPS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case LINECAPS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case POLYGONALCAPS:
+      UNIMPLEMENTED; /* FIXME */
+      break;
+
+    case TEXTCAPS:
+      ret = dc->GDIInfo->flTextCaps;
+      break;
+
+    default:
+      ret = 0;
+      break;
   }
 
-  DPRINT("(%04x,%d): returning %d\n",
-         hDC, Index, *(WORD *)(((char *)dc->w.devCaps) + Index));
-  ret = *(WORD *)(((char *)dc->w.devCaps) + Index);
+  DPRINT("(%04x,%d): returning %d\n", hDC, Index, ret);
 
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hDC );
   return ret;
 }
 
-DC_GET_VAL( INT, W32kGetMapMode, w.MapMode )
-DC_GET_VAL( INT, W32kGetPolyFillMode, w.polyFillMode )
+DC_GET_VAL( INT, NtGdiGetMapMode, w.MapMode )
+DC_GET_VAL( INT, NtGdiGetPolyFillMode, w.polyFillMode )
 
-INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer)
+INT STDCALL
+NtGdiGetObjectA(HANDLE handle, INT count, LPVOID buffer)
 {
   PGDIOBJ  gdiObject;
   INT  result = 0;
-  WORD  magic;
+  DWORD objectType;
 
   if (!count)
     return  0;
-  gdiObject = GDIOBJ_LockObj (handle, GO_MAGIC_DONTCARE);
+  gdiObject = GDIOBJ_LockObj (handle, GDI_OBJECT_TYPE_DONTCARE);
   if (gdiObject == 0)
     return  0;
 
-  magic = GDIOBJ_GetHandleMagic (handle);
-  switch(magic)
+  objectType = GDIOBJ_GetObjectType(handle);
+  switch(objectType)
   {
-/*    case GO_PEN_MAGIC:
+/*    case GDI_OBJECT_TYPE_PEN:
       result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer);
       break;
-    case GO_BRUSH_MAGIC:
+    case GDI_OBJECT_TYPE_BRUSH:
       result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer);
       break; */
-    case GO_BITMAP_MAGIC:
+    case GDI_OBJECT_TYPE_BITMAP:
       result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer);
       break;
-/*    case GO_FONT_MAGIC:
+/*    case GDI_OBJECT_TYPE_FONT:
       result = FONT_GetObjectA((FONTOBJ *)gdiObject, count, buffer);
 
       // FIXME: Fix the LOGFONT structure for the stock fonts
@@ -781,54 +1133,54 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer)
       if ( (handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE) )
         FixStockFontSizeA(handle, count, buffer);
       break;
-    case GO_PALETTE_MAGIC:
+    case GDI_OBJECT_TYPE_PALETTE:
       result = PALETTE_GetObject((PALETTEOBJ *)gdiObject, count, buffer);
       break; */
 
-    case GO_REGION_MAGIC:
-    case GO_DC_MAGIC:
-    case GO_DISABLED_DC_MAGIC:
-    case GO_META_DC_MAGIC:
-    case GO_METAFILE_MAGIC:
-    case GO_METAFILE_DC_MAGIC:
-    case GO_ENHMETAFILE_MAGIC:
-    case GO_ENHMETAFILE_DC_MAGIC:
-      // FIXME("Magic %04x not implemented\n", magic);
+    case GDI_OBJECT_TYPE_REGION:
+    case GDI_OBJECT_TYPE_DC:
+    case GDI_OBJECT_TYPE_METADC:
+    case GDI_OBJECT_TYPE_METAFILE:
+    case GDI_OBJECT_TYPE_ENHMETADC:
+    case GDI_OBJECT_TYPE_EMF:
+      DPRINT1("GDI object type 0x%08x not implemented\n", objectType);
       break;
 
     default:
-      DbgPrint("Invalid GDI Magic %04x\n", magic);
+      DPRINT1("Invalid GDI object type 0x%08x\n", objectType);
       break;
   }
-  GDIOBJ_UnlockObj (handle, GO_MAGIC_DONTCARE);
-  return  result;
+  GDIOBJ_UnlockObj(handle, GDI_OBJECT_TYPE_DONTCARE);
+
+  return result;
 }
 
-INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer)
+INT STDCALL
+NtGdiGetObjectW(HANDLE handle, INT count, LPVOID buffer)
 {
   PGDIOBJHDR  gdiObject;
   INT  result = 0;
-  WORD  magic;
+  DWORD objectType;
 
   if (!count)
     return 0;
-  gdiObject = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE);
+  gdiObject = GDIOBJ_LockObj(handle, GDI_OBJECT_TYPE_DONTCARE);
   if (gdiObject == 0)
     return 0;
 
-  magic = GDIOBJ_GetHandleMagic (handle);
-  switch(magic)
+  objectType = GDIOBJ_GetObjectType(handle);
+  switch(objectType)
   {
-/*    case GO_PEN_MAGIC:
+/*    case GDI_OBJECT_TYPE_PEN:
       result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer);
       break;
-    case GO_BRUSH_MAGIC:
+    case GDI_OBJECT_TYPE_BRUSH:
       result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer);
        break; */
-    case GO_BITMAP_MAGIC:
+    case GDI_OBJECT_TYPE_BITMAP:
       result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer);
       break;
-/*    case GO_FONT_MAGIC:
+/*    case GDI_OBJECT_TYPE_FONT:
       result = FONT_GetObjectW((FONTOBJ *)gdiObject, count, buffer);
 
       // Fix the LOGFONT structure for the stock fonts
@@ -836,100 +1188,109 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer)
       if ( (handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE) )
       FixStockFontSizeW(handle, count, buffer);
     break;
-    case GO_PALETTE_MAGIC:
+    case GDI_OBJECT_TYPE_PALETTE:
       result = PALETTE_GetObject((PALETTEOBJ *)gdiObject, count, buffer);
       break; */
     default:
-      // FIXME("Magic %04x not implemented\n", gdiObject->magic);
+      DPRINT1("GDI object type 0x%08x not implemented\n", objectType);
       break;
   }
-  GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE);
-  return  result;
+
+  GDIOBJ_UnlockObj(handle, GDI_OBJECT_TYPE_DONTCARE);
+
+  return result;
 }
 
-INT STDCALL W32kGetObject(HANDLE handle, INT count, LPVOID buffer)
+INT STDCALL
+NtGdiGetObject(HANDLE handle, INT count, LPVOID buffer)
 {
-  return W32kGetObjectW(handle, count, buffer);
+  return NtGdiGetObjectW(handle, count, buffer);
 }
 
-DWORD STDCALL W32kGetObjectType(HANDLE handle)
+DWORD STDCALL
+NtGdiGetObjectType(HANDLE handle)
 {
   GDIOBJHDR * ptr;
   INT result = 0;
-  WORD  magic;
+  DWORD objectType;
 
-  ptr = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE);
+  ptr = GDIOBJ_LockObj(handle, GDI_OBJECT_TYPE_DONTCARE);
   if (ptr == 0)
     return 0;
 
-  magic = GDIOBJ_GetHandleMagic (handle);
-  switch(magic)
+  objectType = GDIOBJ_GetObjectType(handle);
+  switch(objectType)
   {
-    case GO_PEN_MAGIC:
+    case GDI_OBJECT_TYPE_PEN:
       result = OBJ_PEN;
       break;
-    case GO_BRUSH_MAGIC:
+    case GDI_OBJECT_TYPE_BRUSH:
       result = OBJ_BRUSH;
       break;
-    case GO_BITMAP_MAGIC:
+    case GDI_OBJECT_TYPE_BITMAP:
       result = OBJ_BITMAP;
       break;
-    case GO_FONT_MAGIC:
+    case GDI_OBJECT_TYPE_FONT:
       result = OBJ_FONT;
       break;
-    case GO_PALETTE_MAGIC:
+    case GDI_OBJECT_TYPE_PALETTE:
       result = OBJ_PAL;
       break;
-    case GO_REGION_MAGIC:
+    case GDI_OBJECT_TYPE_REGION:
       result = OBJ_REGION;
       break;
-    case GO_DC_MAGIC:
+    case GDI_OBJECT_TYPE_DC:
       result = OBJ_DC;
       break;
-    case GO_META_DC_MAGIC:
+    case GDI_OBJECT_TYPE_METADC:
       result = OBJ_METADC;
       break;
-    case GO_METAFILE_MAGIC:
+    case GDI_OBJECT_TYPE_METAFILE:
       result = OBJ_METAFILE;
       break;
-    case GO_METAFILE_DC_MAGIC:
-     result = OBJ_METADC;
-      break;
-    case GO_ENHMETAFILE_MAGIC:
+    case GDI_OBJECT_TYPE_ENHMETAFILE:
       result = OBJ_ENHMETAFILE;
       break;
-    case GO_ENHMETAFILE_DC_MAGIC:
+    case GDI_OBJECT_TYPE_ENHMETADC:
       result = OBJ_ENHMETADC;
       break;
+    case GDI_OBJECT_TYPE_EXTPEN:
+      result = OBJ_EXTPEN;
+      break;
+    case GDI_OBJECT_TYPE_MEMDC:
+      result = OBJ_MEMDC;
+      break;
     default:
-      // FIXME("Magic %04x not implemented\n", magic);
+      DPRINT1("Magic 0x%08x not implemented\n", objectType);
       break;
   }
-  GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE);
+  GDIOBJ_UnlockObj(handle, GDI_OBJECT_TYPE_DONTCARE);
   return result;
 }
 
-DC_GET_VAL( INT, W32kGetRelAbs, w.relAbsMode )
-DC_GET_VAL( INT, W32kGetROP2, w.ROPmode )
-DC_GET_VAL( INT, W32kGetStretchBltMode, w.stretchBltMode )
-DC_GET_VAL( UINT, W32kGetTextAlign, w.textAlign )
-DC_GET_VAL( COLORREF, W32kGetTextColor, w.textColor )
-DC_GET_VAL_EX( W32kGetViewportExtEx, vportExtX, vportExtY, SIZE )
-DC_GET_VAL_EX( W32kGetViewportOrgEx, vportOrgX, vportOrgY, POINT )
-DC_GET_VAL_EX( W32kGetWindowExtEx, wndExtX, wndExtY, SIZE )
-DC_GET_VAL_EX( W32kGetWindowOrgEx, wndOrgX, wndOrgY, POINT )
-
-HDC STDCALL W32kResetDC(HDC  hDC, CONST DEVMODEW *InitData)
+DC_GET_VAL( INT, NtGdiGetRelAbs, w.relAbsMode )
+DC_GET_VAL( INT, NtGdiGetROP2, w.ROPmode )
+DC_GET_VAL( INT, NtGdiGetStretchBltMode, w.stretchBltMode )
+DC_GET_VAL( UINT, NtGdiGetTextAlign, w.textAlign )
+DC_GET_VAL( COLORREF, NtGdiGetTextColor, w.textColor )
+DC_GET_VAL_EX( NtGdiGetViewportExtEx, IntGetViewportExtEx, vportExtX, vportExtY, SIZE )
+DC_GET_VAL_EX( NtGdiGetViewportOrgEx, IntGetViewportOrgEx, vportOrgX, vportOrgY, POINT )
+DC_GET_VAL_EX( NtGdiGetWindowExtEx, IntGetWindowExtEx, wndExtX, wndExtY, SIZE )
+DC_GET_VAL_EX( NtGdiGetWindowOrgEx, IntGetWindowOrgEx, wndOrgX, wndOrgY, POINT )
+
+HDC STDCALL
+NtGdiResetDC(HDC  hDC, CONST DEVMODEW *InitData)
 {
   UNIMPLEMENTED;
 }
 
-BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
+BOOL STDCALL
+NtGdiRestoreDC(HDC  hDC, INT  SaveLevel)
 {
   PDC  dc, dcs;
   BOOL  success;
 
-  dc = DC_HandleToPtr(hDC);
+  dc = DC_LockDc(hDC);
   if(!dc)
   {
     return FALSE;
@@ -950,7 +1311,7 @@ BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
   {
     HDC hdcs = DC_GetNextDC (dc);
 
-    dcs = DC_HandleToPtr (hdcs);
+    dcs = DC_LockDc (hdcs);
     if (dcs == NULL)
     {
       return FALSE;
@@ -958,7 +1319,9 @@ BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
     DC_SetNextDC (dcs, DC_GetNextDC (dcs));
     if (--dc->saveLevel < SaveLevel)
       {
-        W32kSetDCState16 (hDC, hdcs);
+       DC_UnlockDc( hDC );
+        DC_UnlockDc( hdcs );
+        NtGdiSetDCState(hDC, hdcs);
 #if 0
         if (!PATH_AssignGdiPath( &dc->w.path, &dcs->w.path ))
         {
@@ -967,31 +1330,45 @@ BOOL STDCALL W32kRestoreDC(HDC  hDC, INT  SaveLevel)
           success = FALSE;
         }
 #endif
+       dc = DC_LockDc(hDC);
+       if(!dc)
+       {
+         return FALSE;
+       }
       }
-         DC_ReleasePtr( hdcs );
-    W32kDeleteDC (hdcs);
+    else
+      {
+      DC_UnlockDc( hdcs );
+      }
+    NtGdiDeleteDC (hdcs);
   }
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hDC );
   return  success;
 }
 
-INT STDCALL W32kSaveDC(HDC  hDC)
+INT STDCALL
+NtGdiSaveDC(HDC  hDC)
 {
   HDC  hdcs;
   PDC  dc, dcs;
   INT  ret;
 
-  dc = DC_HandleToPtr (hDC);
-  if (dc == NULL)
+  if (!(hdcs = NtGdiGetDCState(hDC)))
   {
     return 0;
   }
 
-  if (!(hdcs = W32kGetDCState16 (hDC)))
+  dcs = DC_LockDc (hdcs);
+  if (dcs == NULL)
+  {
+    return 0;
+  }
+  dc = DC_LockDc (hDC);
+  if (dc == NULL)
   {
+    DC_UnlockDc(dc);
     return 0;
   }
-  dcs = DC_HandleToPtr (hdcs);
 
 #if 0
     /* Copy path. The reason why path saving / restoring is in SaveDC/
@@ -1002,7 +1379,7 @@ INT STDCALL W32kSaveDC(HDC  hDC)
      */
   if (!PATH_AssignGdiPath (&dcs->w.path, &dc->w.path))
   {
-    W32kDeleteDC (hdcs);
+    NtGdiDeleteDC (hdcs);
     return 0;
   }
 #endif
@@ -1010,84 +1387,101 @@ INT STDCALL W32kSaveDC(HDC  hDC)
   DC_SetNextDC (dcs, DC_GetNextDC (dc));
   DC_SetNextDC (dc, hdcs);
   ret = ++dc->saveLevel;
-  DC_ReleasePtr( hdcs );
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hdcs );
+  DC_UnlockDc( hDC );
 
   return  ret;
 }
 
-HGDIOBJ STDCALL W32kSelectObject(HDC  hDC, HGDIOBJ  hGDIObj)
+HGDIOBJ
+STDCALL
+NtGdiSelectObject(HDC  hDC, HGDIOBJ  hGDIObj)
 {
-  HGDIOBJ   objOrg;
+  HGDIOBJ objOrg = NULL; // default to failure
   BITMAPOBJ *pb;
   PDC dc;
   PPENOBJ pen;
   PBRUSHOBJ brush;
   PXLATEOBJ XlateObj;
   PPALGDI PalGDI;
-  WORD  objectMagic;
+  DWORD objectType;
   COLORREF *ColorMap;
   ULONG NumColors, Index;
+  HRGN hVisRgn;
+  USHORT Mode;
 
   if(!hDC || !hGDIObj) return NULL;
 
-  dc = DC_HandleToPtr(hDC);
-  objectMagic = GDIOBJ_GetHandleMagic (hGDIObj);
+  dc = DC_LockDc(hDC);
+  ASSERT ( dc );
+
+  objectType = GDIOBJ_GetObjectType(hGDIObj);
 //  GdiObjHdr = hGDIObj;
 
   // FIXME: Get object handle from GDIObj and use it instead of GDIObj below?
 
-  switch(objectMagic) {
-    case GO_PEN_MAGIC:
+  switch (objectType)
+  {
+    case GDI_OBJECT_TYPE_PEN:
       objOrg = (HGDIOBJ)dc->w.hPen;
       dc->w.hPen = hGDIObj;
 
-      // Convert the color of the pen to the format of the DC
-      PalGDI = (PPALGDI)AccessInternalObject((ULONG) dc->w.hPalette);
-      if( PalGDI ){
-       XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalGDI->Mode, PAL_RGB, dc->w.hPalette, NULL);
-       pen = GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC);
-       if( pen ){
-         pen->logpen.lopnColor = XLATEOBJ_iXlate(XlateObj, pen->logpen.lopnColor);
+      /* Convert the color of the pen to the format of the DC */
+      PalGDI = PALETTE_LockPalette(dc->w.hPalette);
+      if (NULL != PalGDI)
+      {
+       Mode = PalGDI->Mode;
+       PALETTE_UnlockPalette(dc->w.hPalette);
+       XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL);
+       ASSERT ( XlateObj );
+       pen = PENOBJ_LockPen(dc->w.hPen);
+       if( pen )
+       {
+         pen->logpen.lopnColor = XLATEOBJ_iXlate(XlateObj, pen->logpen.lopnColor);
+         PENOBJ_UnlockPen(dc->w.hPen);
        }
-       GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC);
        EngDeleteXlate(XlateObj);
       }
       break;
 
-    case GO_BRUSH_MAGIC:
+    case GDI_OBJECT_TYPE_BRUSH:
       objOrg = (HGDIOBJ)dc->w.hBrush;
       dc->w.hBrush = (HBRUSH) hGDIObj;
 
-      // Convert the color of the brush to the format of the DC
-      PalGDI = (PPALGDI)AccessInternalObject((ULONG) dc->w.hPalette);
-      if( PalGDI ){
-       XlateObj = (PXLATEOBJ)IntEngCreateXlate(PalGDI->Mode, PAL_RGB, dc->w.hPalette, NULL);
-       brush = GDIOBJ_LockObj(dc->w.hBrush, GO_BRUSH_MAGIC);
-       if( brush ){
-         brush->iSolidColor = XLATEOBJ_iXlate(XlateObj, brush->logbrush.lbColor);
+      /* Convert the color of the brush to the format of the DC */
+      PalGDI = PALETTE_LockPalette(dc->w.hPalette);
+      if (NULL != PalGDI)
+      {
+       Mode = PalGDI->Mode;
+       PALETTE_UnlockPalette(dc->w.hPalette);
+       XlateObj = (PXLATEOBJ)IntEngCreateXlate(Mode, PAL_RGB, dc->w.hPalette, NULL);
+       ASSERT(XlateObj);
+       brush = BRUSHOBJ_LockBrush(dc->w.hBrush);
+       if( brush )
+       {
+         brush->iSolidColor = XLATEOBJ_iXlate(XlateObj, brush->logbrush.lbColor);
        }
-       GDIOBJ_UnlockObj( dc->w.hBrush, GO_BRUSH_MAGIC);
+       BRUSHOBJ_UnlockBrush(dc->w.hBrush);
        EngDeleteXlate(XlateObj);
       }
       break;
 
-    case GO_FONT_MAGIC:
+    case GDI_OBJECT_TYPE_FONT:
       objOrg = (HGDIOBJ)dc->w.hFont;
       dc->w.hFont = (HFONT) hGDIObj;
       TextIntRealizeFont(dc->w.hFont);
       break;
 
-    case GO_BITMAP_MAGIC:
+    case GDI_OBJECT_TYPE_BITMAP:
       // must be memory dc to select bitmap
       if (!(dc->w.flags & DC_MEMORY)) return NULL;
       objOrg = (HGDIOBJ)dc->w.hBitmap;
 
       /* Release the old bitmap, lock the new one and convert it to a SURF */
       EngDeleteSurface(dc->Surface);
-      BITMAPOBJ_ReleasePtr(objOrg);
       dc->w.hBitmap = hGDIObj;
-      pb = BITMAPOBJ_HandleToPtr(hGDIObj);
+      pb = BITMAPOBJ_LockBitmap(hGDIObj);
+      ASSERT(pb);
       dc->Surface = BitmapToSurf(pb);
 
       // if we're working with a DIB, get the palette [fixme: only create if the selected palette is null]
@@ -1102,219 +1496,99 @@ HGDIOBJ STDCALL W32kSelectObject(HDC  hDC, HGDIOBJ  hGDIObj)
           if(pb->dib->dsBmih.biBitCount == 8) { NumColors = 256; }
 
           ColorMap = ExAllocatePool(PagedPool, sizeof(COLORREF) * NumColors);
+          ASSERT(ColorMap);
           for (Index = 0; Index < NumColors; Index++)
-            {
+          {
             ColorMap[Index] = RGB(pb->ColorMap[Index].rgbRed,
                                   pb->ColorMap[Index].rgbGreen,
                                   pb->ColorMap[Index].rgbBlue);
           }
-          dc->w.hPalette = EngCreatePalette(PAL_INDEXED, NumColors, (ULONG *) ColorMap, 0, 0, 0);
+          dc->w.hPalette = PALETTE_AllocPalette(PAL_INDEXED, NumColors, (ULONG *) ColorMap, 0, 0, 0);
           ExFreePool(ColorMap);
-        } else
-        if(16 == pb->dib->dsBmih.biBitCount)
+        }
+        else if ( 16 == pb->dib->dsBmih.biBitCount )
         {
-          dc->w.hPalette = EngCreatePalette(PAL_BITFIELDS, pb->dib->dsBmih.biClrUsed, NULL, 0x7c00, 0x03e0, 0x001f);
-        } else
-        if(pb->dib->dsBmih.biBitCount >= 24)
+          dc->w.hPalette = PALETTE_AllocPalette(PAL_BITFIELDS, pb->dib->dsBmih.biClrUsed, NULL, 0x7c00, 0x03e0, 0x001f);
+        }
+        else if(pb->dib->dsBmih.biBitCount >= 24)
         {
-          dc->w.hPalette = EngCreatePalette(PAL_RGB, pb->dib->dsBmih.biClrUsed, NULL, 0, 0, 0);
+          dc->w.hPalette = PALETTE_AllocPalette(PAL_RGB, pb->dib->dsBmih.biClrUsed, NULL, 0, 0, 0);
         }
-      } else {
+      }
+      else
+      {
         dc->w.bitsPerPixel = pb->bitmap.bmBitsPixel;
       }
-      break;
+
+      DC_UnlockDc ( hDC );
+      hVisRgn = NtGdiCreateRectRgn ( 0, 0, pb->size.cx, pb->size.cy );
+      NtGdiSelectVisRgn ( hDC, hVisRgn );
+      NtGdiDeleteObject ( hVisRgn );
+      BITMAPOBJ_UnlockBitmap(hGDIObj);
+
+      return objOrg;
 
 #if UPDATEREGIONS
-    case GO_REGION_MAGIC:
-      /* objOrg = (HGDIOBJ)hDC->region; */
-      objOrg = NULL; /* FIXME? hDC->region is destroyed below */
+    case GDI_OBJECT_TYPE_REGION:
+      DC_UnlockDc ( hDC );
       SelectClipRgn(hDC, (HRGN)hGDIObj);
-      break;
+      return NULL;
 #endif
     default:
-      return NULL;
+      break;
   }
-  DC_ReleasePtr( hDC );
+  DC_UnlockDc( hDC );
   return objOrg;
 }
 
-DC_SET_MODE( W32kSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE )
-DC_SET_MODE( W32kSetPolyFillMode, w.polyFillMode, ALTERNATE, WINDING )
-// DC_SET_MODE( W32kSetRelAbs, w.relAbsMode, ABSOLUTE, RELATIVE )
-DC_SET_MODE( W32kSetROP2, w.ROPmode, R2_BLACK, R2_WHITE )
-DC_SET_MODE( W32kSetStretchBltMode, w.stretchBltMode, BLACKONWHITE, HALFTONE )
-
-COLORREF STDCALL W32kSetBkColor(HDC hDC, COLORREF color)
-{
-  COLORREF  oldColor;
-  PDC  dc = DC_HandleToPtr(hDC);
-
-  if (!dc)
-  {
-    return 0x80000000;
-  }
+DC_SET_MODE( NtGdiSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE )
+DC_SET_MODE( NtGdiSetPolyFillMode, w.polyFillMode, ALTERNATE, WINDING )
+// DC_SET_MODE( NtGdiSetRelAbs, w.relAbsMode, ABSOLUTE, RELATIVE )
+DC_SET_MODE( NtGdiSetROP2, w.ROPmode, R2_BLACK, R2_WHITE )
+DC_SET_MODE( NtGdiSetStretchBltMode, w.stretchBltMode, BLACKONWHITE, HALFTONE )
 
-  oldColor = dc->w.backgroundColor;
-  dc->w.backgroundColor = color;
-  DC_ReleasePtr( hDC );
-  return  oldColor;
-}
+//  ----------------------------------------------------  Private Interface
 
-static void  W32kSetDCState16(HDC  hDC, HDC  hDCSave)
+HDC FASTCALL
+DC_AllocDC(LPCWSTR Driver)
 {
-  PDC  dc, dcs;
+  PDC  NewDC;
+  HDC  hDC;
 
-  dc = DC_HandleToPtr(hDC);
-  if (dc == NULL)
-  {
-    return;
-  }
-
-  dcs = DC_HandleToPtr(hDCSave);
-  if (dcs == NULL)
+  hDC = (HDC) GDIOBJ_AllocObj(sizeof(DC), GDI_OBJECT_TYPE_DC, (GDICLEANUPPROC) DC_InternalDeleteDC);
+  if (hDC == NULL)
   {
-       DC_ReleasePtr( hDC );
-    return;
-  }
-  if (!dcs->w.flags & DC_SAVED)
-  {
-    return;
+    return  NULL;
   }
 
-  dc->w.flags            = dcs->w.flags & ~DC_SAVED;
-
-#if 0
-  dc->w.devCaps          = dcs->w.devCaps;
-#endif
+  NewDC = DC_LockDc(hDC);
 
-  dc->w.hFirstBitmap     = dcs->w.hFirstBitmap;
-
-#if 0
-  dc->w.hDevice          = dcs->w.hDevice;
-#endif
-
-  dc->w.totalExtent      = dcs->w.totalExtent;
-  dc->w.ROPmode          = dcs->w.ROPmode;
-  dc->w.polyFillMode     = dcs->w.polyFillMode;
-  dc->w.stretchBltMode   = dcs->w.stretchBltMode;
-  dc->w.relAbsMode       = dcs->w.relAbsMode;
-  dc->w.backgroundMode   = dcs->w.backgroundMode;
-  dc->w.backgroundColor  = dcs->w.backgroundColor;
-  dc->w.textColor        = dcs->w.textColor;
-  dc->w.brushOrgX        = dcs->w.brushOrgX;
-  dc->w.brushOrgY        = dcs->w.brushOrgY;
-  dc->w.textAlign        = dcs->w.textAlign;
-  dc->w.charExtra        = dcs->w.charExtra;
-  dc->w.breakTotalExtra  = dcs->w.breakTotalExtra;
-  dc->w.breakCount       = dcs->w.breakCount;
-  dc->w.breakExtra       = dcs->w.breakExtra;
-  dc->w.breakRem         = dcs->w.breakRem;
-  dc->w.MapMode          = dcs->w.MapMode;
-  dc->w.GraphicsMode     = dcs->w.GraphicsMode;
-#if 0
-  /* Apparently, the DC origin is not changed by [GS]etDCState */
-  dc->w.DCOrgX           = dcs->w.DCOrgX;
-  dc->w.DCOrgY           = dcs->w.DCOrgY;
-#endif
-  dc->w.CursPosX         = dcs->w.CursPosX;
-  dc->w.CursPosY         = dcs->w.CursPosY;
-  dc->w.ArcDirection     = dcs->w.ArcDirection;
-
-#if 0
-  dc->w.xformWorld2Wnd   = dcs->w.xformWorld2Wnd;
-  dc->w.xformWorld2Vport = dcs->w.xformWorld2Vport;
-  dc->w.xformVport2World = dcs->w.xformVport2World;
-  dc->w.vport2WorldValid = dcs->w.vport2WorldValid;
-#endif
-
-  dc->wndOrgX            = dcs->wndOrgX;
-  dc->wndOrgY            = dcs->wndOrgY;
-  dc->wndExtX            = dcs->wndExtX;
-  dc->wndExtY            = dcs->wndExtY;
-  dc->vportOrgX          = dcs->vportOrgX;
-  dc->vportOrgY          = dcs->vportOrgY;
-  dc->vportExtX          = dcs->vportExtX;
-  dc->vportExtY          = dcs->vportExtY;
-
-  if (!(dc->w.flags & DC_MEMORY))
+  if (Driver != NULL)
   {
-    dc->w.bitsPerPixel = dcs->w.bitsPerPixel;
+    NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR));
+    wcscpy(NewDC->DriverName, Driver);
   }
 
-#if 0
-  if (dcs->w.hClipRgn)
-  {
-    if (!dc->w.hClipRgn)
-    {
-      dc->w.hClipRgn = W32kCreateRectRgn( 0, 0, 0, 0 );
-    }
-    W32kCombineRgn( dc->w.hClipRgn, dcs->w.hClipRgn, 0, RGN_COPY );
-  }
-  else
-  {
-    if (dc->w.hClipRgn)
-    {
-      W32kDeleteObject( dc->w.hClipRgn );
-    }
-
-    dc->w.hClipRgn = 0;
-  }
-  CLIPPING_UpdateGCRegion( dc );
-#endif
-
-  W32kSelectObject( hDC, dcs->w.hBitmap );
-  W32kSelectObject( hDC, dcs->w.hBrush );
-  W32kSelectObject( hDC, dcs->w.hFont );
-  W32kSelectObject( hDC, dcs->w.hPen );
-  W32kSetBkColor( hDC, dcs->w.backgroundColor);
-  W32kSetTextColor( hDC, dcs->w.textColor);
-
-#if 0
-  GDISelectPalette16( hDC, dcs->w.hPalette, FALSE );
-#endif
+  NewDC->w.xformWorld2Wnd.eM11 = 1.0f;
+  NewDC->w.xformWorld2Wnd.eM12 = 0.0f;
+  NewDC->w.xformWorld2Wnd.eM21 = 0.0f;
+  NewDC->w.xformWorld2Wnd.eM22 = 1.0f;
+  NewDC->w.xformWorld2Wnd.eDx = 0.0f;
+  NewDC->w.xformWorld2Wnd.eDy = 0.0f;
+  NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd;
+  NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd;
+  NewDC->w.vport2WorldValid = TRUE;
 
-  DC_ReleasePtr( hDCSave );
-  DC_ReleasePtr( hDC );
-}
+  NewDC->w.hFont = NtGdiGetStockObject(SYSTEM_FONT);
+  TextIntRealizeFont(NewDC->w.hFont);
 
-//  ----------------------------------------------------  Private Interface
+  DC_UnlockDc(hDC);
 
-HDC  DC_AllocDC(LPCWSTR  Driver)
-{
-       PDC  NewDC;
-       HDC  hDC;
-
-       hDC = (HDC) GDIOBJ_AllocObj(sizeof(DC), GO_DC_MAGIC);
-       if (hDC == NULL)
-       {
-         return  NULL;
-       }
-
-       NewDC = (PDC) GDIOBJ_LockObj( hDC, GO_DC_MAGIC );
-
-       if (Driver != NULL)
-       {
-         NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR));
-         wcscpy(NewDC->DriverName, Driver);
-       }
-
-       NewDC->w.xformWorld2Wnd.eM11 = 1.0f;
-       NewDC->w.xformWorld2Wnd.eM12 = 0.0f;
-       NewDC->w.xformWorld2Wnd.eM21 = 0.0f;
-       NewDC->w.xformWorld2Wnd.eM22 = 1.0f;
-       NewDC->w.xformWorld2Wnd.eDx = 0.0f;
-       NewDC->w.xformWorld2Wnd.eDy = 0.0f;
-       NewDC->w.xformWorld2Vport = NewDC->w.xformWorld2Wnd;
-       NewDC->w.xformVport2World = NewDC->w.xformWorld2Wnd;
-       NewDC->w.vport2WorldValid = TRUE;
-
-       NewDC->w.hFont = W32kGetStockObject(SYSTEM_FONT);
-
-       GDIOBJ_UnlockObj( hDC, GO_DC_MAGIC );
-       return  hDC;
+  return  hDC;
 }
 
-HDC  DC_FindOpenDC(LPCWSTR  Driver)
+HDC FASTCALL
+DC_FindOpenDC(LPCWSTR  Driver)
 {
   return NULL;
 }
@@ -1322,44 +1596,52 @@ HDC  DC_FindOpenDC(LPCWSTR  Driver)
 /*!
  * Initialize some common fields in the Device Context structure.
 */
-void  DC_InitDC(HDC  DCHandle)
+VOID FASTCALL
+DC_InitDC(HDC  DCHandle)
 {
-//  W32kRealizeDefaultPalette(DCHandle);
+//  NtGdiRealizeDefaultPalette(DCHandle);
 
-  W32kSelectObject(DCHandle, W32kGetStockObject( WHITE_BRUSH ));
-  W32kSelectObject(DCHandle, W32kGetStockObject( BLACK_PEN ));
-  //W32kSelectObject(DCHandle, hFont);
+  NtGdiSelectObject(DCHandle, NtGdiGetStockObject( WHITE_BRUSH ));
+  NtGdiSelectObject(DCHandle, NtGdiGetStockObject( BLACK_PEN ));
+  //NtGdiSelectObject(DCHandle, hFont);
 
 //  CLIPPING_UpdateGCRegion(DCToInit);
 
 }
 
-void  DC_FreeDC(HDC  DCToFree)
+VOID FASTCALL
+DC_FreeDC(HDC  DCToFree)
 {
-  if (!GDIOBJ_FreeObj(DCToFree, GO_DC_MAGIC, GDIOBJFLAG_DEFAULT))
+  if (!GDIOBJ_FreeObj(DCToFree, GDI_OBJECT_TYPE_DC, GDIOBJFLAG_DEFAULT))
   {
     DPRINT("DC_FreeDC failed\n");
   }
 }
 
-BOOL DC_InternalDeleteDC( PDC DCToDelete )
+BOOL FASTCALL
+DC_InternalDeleteDC( PDC DCToDelete )
 {
-       if( DCToDelete->DriverName )
-               ExFreePool(DCToDelete->DriverName);
-       return TRUE;
+  if( DCToDelete->DriverName )
+    {
+      ExFreePool(DCToDelete->DriverName);
+    }
+
+  return TRUE;
 }
 
-HDC  DC_GetNextDC (PDC pDC)
+HDC FASTCALL
+DC_GetNextDC (PDC pDC)
 {
   return pDC->hNext;
 }
 
-void  DC_SetNextDC (PDC pDC, HDC hNextDC)
+VOID FASTCALL
+DC_SetNextDC (PDC pDC, HDC hNextDC)
 {
   pDC->hNext = hNextDC;
 }
 
-void
+VOID FASTCALL
 DC_UpdateXforms(PDC  dc)
 {
   XFORM  xformWnd2Vport;
@@ -1376,13 +1658,13 @@ DC_UpdateXforms(PDC  dc)
   xformWnd2Vport.eDy  = (FLOAT)dc->vportOrgY - scaleY * (FLOAT)dc->wndOrgY;
 
   /* Combine with the world transformation */
-  W32kCombineTransform(&dc->w.xformWorld2Vport, &dc->w.xformWorld2Wnd, &xformWnd2Vport);
+  NtGdiCombineTransform(&dc->w.xformWorld2Vport, &dc->w.xformWorld2Wnd, &xformWnd2Vport);
 
   /* Create inverse of world-to-viewport transformation */
   dc->w.vport2WorldValid = DC_InvertXform(&dc->w.xformWorld2Vport, &dc->w.xformVport2World);
 }
 
-BOOL
+BOOL FASTCALL
 DC_InvertXform(const XFORM *xformSrc,
                XFORM *xformDest)
 {
@@ -1403,3 +1685,4 @@ DC_InvertXform(const XFORM *xformSrc,
 
   return  TRUE;
 }
+/* EOF */