- GdiIsPlayMetafileDC: function GdiGetHandleUserData might fail
[reactos.git] / reactos / dll / win32 / gdi32 / misc / stubs.c
index f2c3791..a826faf 100644 (file)
 #define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__);
 
 
-/*
- * @unimplemented
- */
-int
-STDCALL
-StretchDIBits(HDC hdc,
-              int XDest,
-              int YDest,
-              int nDestWidth,
-              int nDestHeight,
-              int XSrc,
-              int YSrc,
-              int nSrcWidth,
-              int nSrcHeight,
-              CONST VOID *lpBits,
-              CONST BITMAPINFO *lpBitsInfo,
-              UINT iUsage,
-              DWORD dwRop)
-
-{
-    /* FIXME share memory */
-    return NtGdiStretchDIBits(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, YSrc,
-                              nSrcWidth, nSrcHeight, lpBits, lpBitsInfo, iUsage, dwRop);
-}
-
-/*
- * @unimplemented
- */
-int
-STDCALL
-SetDIBits(HDC hdc,
-          HBITMAP hbmp,
-          UINT uStartScan,
-          UINT cScanLines,
-          CONST VOID *lpvBits,
-          CONST BITMAPINFO *lpbmi,
-          UINT fuColorUse)
-{
-    /* FIXME share memory */
-    return NtGdiSetDIBits(hdc, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse);
-}
-
-/*
- * @unimplemented
- */
-int
-STDCALL
-SetStretchBltMode(HDC hdc, int iStretchMode)
-{
-    /* FIXME share memory */
-    return NtGdiSetStretchBltMode(hdc, iStretchMode);
-}
-
 /*
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 PtInRegion(IN HRGN hrgn,
            int x,
            int y)
@@ -91,7 +38,7 @@ PtInRegion(IN HRGN hrgn,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 RectInRegion(HRGN hrgn,
              LPCRECT prcl)
 {
@@ -103,7 +50,7 @@ RectInRegion(HRGN hrgn,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 RestoreDC(IN HDC hdc,
           IN INT iLevel)
 {
@@ -115,7 +62,7 @@ RestoreDC(IN HDC hdc,
  * @unimplemented
  */
 INT
-STDCALL
+WINAPI
 SaveDC(IN HDC hdc)
 {
     /* FIXME Sharememory */
@@ -128,7 +75,7 @@ SaveDC(IN HDC hdc)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 CancelDC(HDC hdc)
 {
     UNIMPLEMENTED;
@@ -141,7 +88,7 @@ CancelDC(HDC hdc)
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 DrawEscape(HDC  hdc,
            int a1,
            int a2,
@@ -157,7 +104,7 @@ DrawEscape(HDC  hdc,
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 EnumObjects(HDC hdc,
             int a1,
             GOBJENUMPROC a2,
@@ -168,23 +115,13 @@ EnumObjects(HDC hdc,
     return 0;
 }
 
-/*
- * @unimplemented
- */
-int
-STDCALL
-Escape(HDC hdc, INT escape, INT in_count, LPCSTR in_data, LPVOID out_data)
-{
-        UNIMPLEMENTED;
-        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-        return 0;
-}
+
 
 /*
  * @implemented
  */
 UINT
-STDCALL
+WINAPI
 GetBoundsRect(
        HDC     hdc,
        LPRECT  lprcBounds,
@@ -195,23 +132,11 @@ GetBoundsRect(
 }
 
 
-/*
- * @implemented
- */
-int
-STDCALL
-GetMetaRgn(HDC hdc,
-           HRGN hrgn)
-{
-    return NtGdiGetRandomRgn(hdc,hrgn,2);
-}
-
-
 /*
  * @unimplemented
  */
 UINT
-STDCALL
+WINAPI
 GetMetaFileBitsEx(
        HMETAFILE       a0,
        UINT            a1,
@@ -223,27 +148,11 @@ GetMetaFileBitsEx(
        return 0;
 }
 
-
-
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-GetFontLanguageInfo(
-       HDC     hDc
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return 0;
-}
-
 /*
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 PlayMetaFile(
        HDC             a0,
        HMETAFILE       a1
@@ -254,69 +163,24 @@ PlayMetaFile(
        return FALSE;
 }
 
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-ResizePalette(
-       HPALETTE        a0,
-       UINT            a1
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
-/*
- * @unimplemented
- */
-int
-STDCALL
-SetMetaRgn(
-       HDC     hdc
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return 0;
-}
-
 /*
  * @implemented
  */
 UINT
-STDCALL
+WINAPI
 SetBoundsRect(HDC hdc,
               CONST RECT *prc,
               UINT flags)
 {
-    /* FIXME add check for vaildate the flags */
+    /* FIXME add check for validate the flags */
     return NtGdiSetBoundsRect(hdc, (LPRECT)prc, flags);
 }
 
-
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-SetMapperFlags(
-       HDC     a0,
-       DWORD   a1
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return 0;
-}
-
 /*
  * @unimplemented
  */
 HMETAFILE
-STDCALL
+WINAPI
 SetMetaFileBitsEx(
        UINT            a0,
        CONST BYTE      *a1
@@ -331,22 +195,7 @@ SetMetaFileBitsEx(
  * @unimplemented
  */
 BOOL
-STDCALL
-UpdateColors(
-       HDC     hdc
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
+WINAPI
 PlayMetaFileRecord(
        HDC             a0,
        LPHANDLETABLE   a1,
@@ -364,7 +213,7 @@ PlayMetaFileRecord(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 EnumMetaFile(
        HDC                     a0,
        HMETAFILE               a1,
@@ -381,7 +230,7 @@ EnumMetaFile(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 DeleteEnhMetaFile(
        HENHMETAFILE    a0
        )
@@ -395,7 +244,7 @@ DeleteEnhMetaFile(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 EnumEnhMetaFile(
        HDC             a0,
        HENHMETAFILE    a1,
@@ -413,7 +262,7 @@ EnumEnhMetaFile(
  * @unimplemented
  */
 UINT
-STDCALL
+WINAPI
 GetEnhMetaFileBits(
        HENHMETAFILE    a0,
        UINT            a1,
@@ -430,7 +279,7 @@ GetEnhMetaFileBits(
  * @unimplemented
  */
 UINT
-STDCALL
+WINAPI
 GetEnhMetaFileHeader(
        HENHMETAFILE    a0,
        UINT            a1,
@@ -446,7 +295,7 @@ GetEnhMetaFileHeader(
  * @unimplemented
  */
 UINT
-STDCALL
+WINAPI
 GetEnhMetaFilePaletteEntries(
        HENHMETAFILE    a0,
        UINT            a1,
@@ -462,7 +311,7 @@ GetEnhMetaFilePaletteEntries(
  * @unimplemented
  */
 UINT
-STDCALL
+WINAPI
 GetWinMetaFileBits(
        HENHMETAFILE    a0,
        UINT            a1,
@@ -481,7 +330,7 @@ GetWinMetaFileBits(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 PlayEnhMetaFile(
        HDC             a0,
        HENHMETAFILE    a1,
@@ -498,7 +347,7 @@ PlayEnhMetaFile(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 PlayEnhMetaFileRecord(
        HDC                     a0,
        LPHANDLETABLE           a1,
@@ -516,7 +365,7 @@ PlayEnhMetaFileRecord(
  * @unimplemented
  */
 HENHMETAFILE
-STDCALL
+WINAPI
 SetEnhMetaFileBits(
        UINT            a0,
        CONST BYTE      *a1
@@ -532,7 +381,7 @@ SetEnhMetaFileBits(
  * @unimplemented
  */
 HENHMETAFILE
-STDCALL
+WINAPI
 SetWinMetaFileBits(
        UINT                    a0,
        CONST BYTE              *a1,
@@ -549,7 +398,7 @@ SetWinMetaFileBits(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiComment(
        HDC             hDC,
        UINT            bytes,
@@ -579,27 +428,7 @@ GdiComment(
  * @unimplemented
  */
 BOOL
-STDCALL
-AngleArc(
-       HDC     hdc,
-       int     a1,
-       int     a2,
-       DWORD   a3,
-       FLOAT   a4,
-       FLOAT   a5
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
+WINAPI
 SetColorAdjustment(
        HDC                     hdc,
        CONST COLORADJUSTMENT   *a1
@@ -614,7 +443,7 @@ SetColorAdjustment(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 EndDoc(
        HDC     hdc
        )
@@ -629,7 +458,7 @@ EndDoc(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 StartPage(
        HDC     hdc
        )
@@ -644,7 +473,7 @@ StartPage(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 EndPage(
        HDC     hdc
        )
@@ -659,7 +488,7 @@ EndPage(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 AbortDoc(
        HDC     hdc
        )
@@ -674,67 +503,37 @@ AbortDoc(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 SetAbortProc(
-       HDC             hdc,
-       ABORTPROC       a1
-       )
+       HDC hdc,
+       ABORTPROC lpAbortProc)
 {
        UNIMPLEMENTED;
        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
        return 0;
 }
 
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-ScaleViewportExtEx(
-       HDC     a0,
-       int     a1,
-       int     a2,
-       int     a3,
-       int     a4,
-       LPSIZE  a5
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-ScaleWindowExtEx(
-       HDC     a0,
-       int     a1,
-       int     a2,
-       int     a3,
-       int     a4,
-       LPSIZE  a5
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
-
 /*
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 UnrealizeObject(HGDIOBJ  hgdiobj)
 {
     BOOL retValue = TRUE;
+/*
+   Win 2k Graphics API, Black Book. by coriolis.com
+   Page 62, Note that Steps 3, 5, and 6 are not required for Windows NT(tm)
+   and Windows 2000(tm).
 
+   Step 5. UnrealizeObject(hTrackBrush);
+ */
+/*
+    msdn.microsoft.com,
+    "Windows 2000/XP: If hgdiobj is a brush, UnrealizeObject does nothing,
+    and the function returns TRUE. Use SetBrushOrgEx to set the origin of
+    a brush."
+ */
     if (GDI_HANDLE_GET_TYPE(hgdiobj) != GDI_OBJECT_TYPE_BRUSH)
     {
         retValue = NtGdiUnrealizeObject(hgdiobj);
@@ -748,7 +547,7 @@ UnrealizeObject(HGDIOBJ  hgdiobj)
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiFlush()
 {
     NtGdiFlush();
@@ -760,7 +559,7 @@ GdiFlush()
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 SetICMMode(
        HDC     a0,
        int     a1
@@ -776,7 +575,7 @@ SetICMMode(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 CheckColorsInGamut(
        HDC     a0,
        LPVOID  a1,
@@ -790,39 +589,11 @@ CheckColorsInGamut(
 }
 
 
-/*
- * @unimplemented
- */
-HCOLORSPACE
-STDCALL
-GetColorSpace(HDC hDc)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-
-/*
- * @unimplemented
- */
-HCOLORSPACE
-STDCALL
-SetColorSpace(
-       HDC             a0,
-       HCOLORSPACE     a1
-       )
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return FALSE;
-}
-
 /*
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetDeviceGammaRamp( HDC hdc,
                     LPVOID lpGammaRamp)
 {
@@ -843,7 +614,7 @@ GetDeviceGammaRamp( HDC hdc,
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 SetDeviceGammaRamp(HDC hdc,
                    LPVOID lpGammaRamp)
 {
@@ -866,7 +637,7 @@ SetDeviceGammaRamp(HDC hdc,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 ColorMatchToTarget(
        HDC     a0,
        HDC     a1,
@@ -883,7 +654,7 @@ ColorMatchToTarget(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglCopyContext(
        HGLRC   a0,
        HGLRC   a1,
@@ -900,7 +671,7 @@ wglCopyContext(
  * @unimplemented
  */
 HGLRC
-STDCALL
+WINAPI
 wglCreateContext(
        HDC     hDc
        )
@@ -915,7 +686,7 @@ wglCreateContext(
  * @unimplemented
  */
 HGLRC
-STDCALL
+WINAPI
 wglCreateLayerContext(
        HDC     hDc,
        int     a1
@@ -931,7 +702,7 @@ wglCreateLayerContext(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglDeleteContext(
        HGLRC   a
        )
@@ -946,7 +717,7 @@ wglDeleteContext(
  * @unimplemented
  */
 HGLRC
-STDCALL
+WINAPI
 wglGetCurrentContext(VOID)
 {
        UNIMPLEMENTED;
@@ -959,7 +730,7 @@ wglGetCurrentContext(VOID)
  * @unimplemented
  */
 HDC
-STDCALL
+WINAPI
 wglGetCurrentDC(VOID)
 {
        UNIMPLEMENTED;
@@ -972,7 +743,7 @@ wglGetCurrentDC(VOID)
  * @unimplemented
  */
 PROC
-STDCALL
+WINAPI
 wglGetProcAddress(
        LPCSTR          a0
        )
@@ -987,7 +758,7 @@ wglGetProcAddress(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglMakeCurrent(
        HDC     a0,
        HGLRC   a1
@@ -1003,7 +774,7 @@ wglMakeCurrent(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglShareLists(
        HGLRC   a0,
        HGLRC   a1
@@ -1019,7 +790,7 @@ wglShareLists(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglDescribeLayerPlane(
        HDC                     a0,
        int                     a1,
@@ -1038,7 +809,7 @@ wglDescribeLayerPlane(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 wglSetLayerPaletteEntries(
        HDC             a0,
        int             a1,
@@ -1057,7 +828,7 @@ wglSetLayerPaletteEntries(
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 wglGetLayerPaletteEntries(
        HDC             a0,
        int             a1,
@@ -1076,7 +847,7 @@ wglGetLayerPaletteEntries(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglRealizeLayerPalette(
        HDC             a0,
        int             a1,
@@ -1093,7 +864,7 @@ wglRealizeLayerPalette(
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 wglSwapLayerBuffers(
        HDC             a0,
        UINT            a1
@@ -1114,7 +885,7 @@ wglSwapLayerBuffers(
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 IsValidEnhMetaRecord(
        DWORD   a0,
        DWORD   a1
@@ -1130,7 +901,7 @@ IsValidEnhMetaRecord(
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 IsValidEnhMetaRecordOffExt(
        DWORD   a0,
        DWORD   a1,
@@ -1148,7 +919,7 @@ IsValidEnhMetaRecordOffExt(
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 GetGlyphOutlineWow(
        DWORD   a0,
        DWORD   a1,
@@ -1168,7 +939,7 @@ GetGlyphOutlineWow(
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 gdiPlaySpoolStream(
        DWORD   a0,
        DWORD   a1,
@@ -1184,10 +955,10 @@ gdiPlaySpoolStream(
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 HANDLE
-STDCALL
+WINAPI
 AddFontMemResourceEx(
        PVOID pbFont,
        DWORD cbFont,
@@ -1195,16 +966,19 @@ AddFontMemResourceEx(
        DWORD *pcFonts
 )
 {
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return 0;
+  if ( pbFont && cbFont && pcFonts)
+  {
+     return NtGdiAddFontMemResourceEx(pbFont, cbFont, NULL, 0, pcFonts);
+  }
+  SetLastError(ERROR_INVALID_PARAMETER);
+  return NULL;
 }
 
 /*
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 AddFontResourceTracking(
        LPCSTR lpString,
        int unknown
@@ -1221,7 +995,7 @@ AddFontResourceTracking(
  * @unimplemented
  */
 HBITMAP
-STDCALL
+WINAPI
 ClearBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
 {
        UNIMPLEMENTED;
@@ -1233,7 +1007,7 @@ ClearBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
  * @unimplemented
  */
 HBRUSH
-STDCALL
+WINAPI
 ClearBrushAttributes(HBRUSH hbm, DWORD dwFlags)
 {
        UNIMPLEMENTED;
@@ -1245,7 +1019,7 @@ ClearBrushAttributes(HBRUSH hbm, DWORD dwFlags)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 ColorCorrectPalette(HDC hDC,HPALETTE hPalette,DWORD dwFirstEntry,DWORD dwNumOfEntries)
 {
        UNIMPLEMENTED;
@@ -1257,7 +1031,7 @@ ColorCorrectPalette(HDC hDC,HPALETTE hPalette,DWORD dwFirstEntry,DWORD dwNumOfEn
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 EndFormPage(HDC hdc)
 {
        UNIMPLEMENTED;
@@ -1265,25 +1039,11 @@ EndFormPage(HDC hdc)
        return 0;
 }
 
-
-
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-GdiAddGlsBounds(HDC hdc,LPRECT prc)
-{
-       UNIMPLEMENTED;
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-       return 0;
-}
-
 /*
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiArtificialDecrementDriver(LPWSTR pDriverName,BOOL unknown)
 {
        UNIMPLEMENTED;
@@ -1295,7 +1055,7 @@ GdiArtificialDecrementDriver(LPWSTR pDriverName,BOOL unknown)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiCleanCacheDC(HDC hdc)
 {
        UNIMPLEMENTED;
@@ -1307,7 +1067,7 @@ GdiCleanCacheDC(HDC hdc)
  * @unimplemented
  */
 HDC
-STDCALL
+WINAPI
 GdiConvertAndCheckDC(HDC hdc)
 {
        UNIMPLEMENTED;
@@ -1319,7 +1079,7 @@ GdiConvertAndCheckDC(HDC hdc)
  * @unimplemented
  */
 HENHMETAFILE
-STDCALL
+WINAPI
 GdiConvertEnhMetaFile(HENHMETAFILE hmf)
 {
     UNIMPLEMENTED;
@@ -1331,7 +1091,7 @@ GdiConvertEnhMetaFile(HENHMETAFILE hmf)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiDrawStream(HDC dc, ULONG l, VOID *v)
 {
     UNIMPLEMENTED;
@@ -1340,46 +1100,76 @@ GdiDrawStream(HDC dc, ULONG l, VOID *v)
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
-STDCALL
-GdiIsMetaFileDC(HDC hdc)
+WINAPI
+GdiIsMetaFileDC(HDC hDC)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+  if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+  {
+     if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+        return TRUE;
+     else
+     {
+        PLDC pLDC = GdiGetLDC(hDC);
+        if ( !pLDC )
+        {
+           SetLastError(ERROR_INVALID_HANDLE);
+           return FALSE;
+        }
+        if ( pLDC->iType == LDC_EMFLDC) return TRUE;
+     }
+  }
+  return FALSE;
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
-STDCALL
-GdiIsMetaPrintDC(HDC hdc)
+WINAPI
+GdiIsMetaPrintDC(HDC hDC)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+
+  if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+  {
+     if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+        return FALSE;
+     else
+     {
+        PLDC pLDC = GdiGetLDC(hDC);
+        if ( !pLDC )
+        {
+           SetLastError(ERROR_INVALID_HANDLE);
+           return FALSE;
+        }
+        if ( pLDC->Flags & LDC_META_PRINT) return TRUE;
+     }
+  }
+  return FALSE;
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 BOOL
-STDCALL
-GdiIsPlayMetafileDC(HDC hdc)
+WINAPI
+GdiIsPlayMetafileDC(HDC hDC)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+  PLDC pLDC = GdiGetLDC(hDC);
+  if ( pLDC )
+  {
+     if ( pLDC->Flags & LDC_PLAY_MFDC ) return TRUE;
+  }
+  return FALSE;
 }
 
 /*
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiValidateHandle(HGDIOBJ hobj)
 {
     UNIMPLEMENTED;
@@ -1391,7 +1181,7 @@ GdiValidateHandle(HGDIOBJ hobj)
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 GetBitmapAttributes(HBITMAP hbm)
 {
     UNIMPLEMENTED;
@@ -1403,7 +1193,7 @@ GetBitmapAttributes(HBITMAP hbm)
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 GetBrushAttributes(HBRUSH hbr)
 {
     UNIMPLEMENTED;
@@ -1415,7 +1205,7 @@ GetBrushAttributes(HBRUSH hbr)
  * @implemented
  */
 ULONG
-STDCALL
+WINAPI
 GetEUDCTimeStamp(VOID)
 {
     return NtGdiGetEudcTimeStampEx(NULL,0,TRUE);
@@ -1425,7 +1215,7 @@ GetEUDCTimeStamp(VOID)
  * @implemented
  */
 ULONG
-STDCALL
+WINAPI
 GetFontAssocStatus(HDC hdc)
 {
     ULONG retValue = 0;
@@ -1438,36 +1228,11 @@ GetFontAssocStatus(HDC hdc)
     return retValue;
 }
 
-/*
- * @unimplemented
- */
-HFONT
-STDCALL
-GetHFONT(HDC dc)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-GetLayout(HDC hdc
-)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
 /*
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetTextExtentExPointWPri(HDC hdc,
                          LPWSTR lpwsz,
                          ULONG cwc,
@@ -1479,48 +1244,11 @@ GetTextExtentExPointWPri(HDC hdc,
     return NtGdiGetTextExtentExW(hdc,lpwsz,cwc,dxMax,pcCh,pdxOut,psize,0);
 }
 
-/*
- * @implemented
- */
-INT
-STDCALL
-GetTextFaceAliasW(HDC hdc,
-                  int cChar,
-                  LPWSTR pszOut)
-{
-    INT retValue = 0;
-    if ((!pszOut) || (cChar))
-    {
-        retValue = NtGdiGetTextFaceW(hdc,cChar,pszOut,TRUE);
-    }
-    else
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-    }
-    return retValue;
-}
-
-
-
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-MirrorRgn(HWND hwnd,HRGN hrgn)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-
-
 /*
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 QueryFontAssocStatus(VOID)
 {
     UNIMPLEMENTED;
@@ -1532,27 +1260,22 @@ QueryFontAssocStatus(VOID)
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 RemoveFontMemResourceEx(HANDLE fh)
 {
-    BOOL retValue=0;
-
-    if (fh)
-    {
-        retValue = NtGdiRemoveFontMemResourceEx(fh);
-    }
-    else
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-    }
-    return retValue;
+  if (fh)
+  {
+     return NtGdiRemoveFontMemResourceEx(fh);
+  }
+  SetLastError(ERROR_INVALID_PARAMETER);
+  return FALSE;
 }
 
 /*
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 RemoveFontResourceTracking(LPCSTR lpString,int unknown)
 {
        UNIMPLEMENTED;
@@ -1564,7 +1287,7 @@ RemoveFontResourceTracking(LPCSTR lpString,int unknown)
  * @unimplemented
  */
 HBITMAP
-STDCALL
+WINAPI
 SetBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
 {
        UNIMPLEMENTED;
@@ -1576,7 +1299,7 @@ SetBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
  * @unimplemented
  */
 HBRUSH
-STDCALL
+WINAPI
 SetBrushAttributes(HBRUSH hbm, DWORD dwFlags)
 {
        UNIMPLEMENTED;
@@ -1584,38 +1307,11 @@ SetBrushAttributes(HBRUSH hbm, DWORD dwFlags)
        return 0;
 }
 
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-SetLayout(HDC hdc,
-          DWORD dwLayout)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-/*
- * @unimplemented
- */
-DWORD
-STDCALL
-SetLayoutWidth(HDC hdc,LONG wox,DWORD dwLayout)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-
-
 /*
  * @implemented
  */
 int
-STDCALL
+WINAPI
 StartFormPage(HDC hdc)
 {
     return StartPage(hdc);
@@ -1625,7 +1321,7 @@ StartFormPage(HDC hdc)
  * @unimplemented
  */
 VOID
-STDCALL
+WINAPI
 UnloadNetworkFonts(DWORD unknown)
 {
     UNIMPLEMENTED;
@@ -1633,71 +1329,224 @@ UnloadNetworkFonts(DWORD unknown)
 }
 
 /*
- * @implemented
+ * @unimplemented
  */
 BOOL
-STDCALL
-GetTextExtentExPointI(HDC hdc,
-                      LPWORD pgiIn,
-                      int cgi,
-                      int nMaxExtent,
-                      LPINT lpnFit,
-                      LPINT alpDx,
-                      LPSIZE lpSize)
+WINAPI
+GdiRealizationInfo(HDC hdc,
+                   PREALIZATION_INFO pri)
 {
-    return NtGdiGetTextExtentExW(hdc,pgiIn,cgi,nMaxExtent,(ULONG *)lpnFit, (PULONG) alpDx,lpSize,1);
+    // ATM we do not support local font data and Language Pack.
+    return NtGdiGetRealizationInfo(hdc, pri, (HFONT) NULL);
 }
 
 /*
  * @implemented
  */
 BOOL
-STDCALL
-GetTextExtentPointI(HDC hdc,
-                    LPWORD pgiIn,
-                    int cgi,
-                    LPSIZE lpSize)
+WINAPI
+GetETM(HDC hdc,
+       EXTTEXTMETRIC *petm)
 {
-    return NtGdiGetTextExtent(hdc,pgiIn,cgi,lpSize,2);
-}
-
-
+  BOOL Ret = NtGdiGetETM(hdc, petm);
 
+  if (Ret && petm)
+    petm->emKernPairs = GetKerningPairsA(hdc, 0, 0);
 
+  return Ret;
+}
 
 /*
  * @unimplemented
  */
-BOOL
-STDCALL
-GdiRealizationInfo(HDC hdc,
-                   PREALIZATION_INFO pri)
+int
+WINAPI
+Escape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpvInData, LPVOID lpvOutData)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
+    int retValue = SP_ERROR;    
+    HGDIOBJ hObject = hdc;
+    UINT Type = 0;
+    LPVOID pUserData = NULL;
 
+    Type = GDI_HANDLE_GET_TYPE(hObject);
 
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-GetETM(HDC hdc,
-       EXTTEXTMETRIC *petm)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+    if (Type == GDI_OBJECT_TYPE_METADC)
+    {
+        /* FIXME we do not support metafile */
+        UNIMPLEMENTED;
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    }
+    else
+    {
+        switch (nEscape)
+        {
+            case ABORTDOC:        
+                /* Note Winodws check see if the handle have any user data for ABORTDOC command 
+                 * ReactOS copy this behavior to be compatible with windows 2003 
+                 */
+                if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) ||  
+                      (pUserData == NULL) ) 
+                 {
+                     GdiSetLastError(ERROR_INVALID_HANDLE);
+                     retValue = FALSE;
+                 }
+                 else
+                 {
+                    retValue = AbortDoc(hdc);
+                 }
+                break;
+
+            case DRAFTMODE:
+            case FLUSHOUTPUT:
+            case SETCOLORTABLE:
+                /* Note 1: DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE is outdated and been replace with other api */
+                /* Note 2: Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command 
+                 * ReactOS copy this behavior to be compatible with windows 2003 
+                 */
+                if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) ||  
+                     (pUserData == NULL) ) 
+                {
+                    GdiSetLastError(ERROR_INVALID_HANDLE);
+                }
+                retValue = FALSE;
+                break;
+
+            case SETABORTPROC:
+                /* Note : Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command 
+                 * ReactOS copy this behavior to be compatible with windows 2003 
+                 */
+                if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) ||  
+                     (pUserData == NULL) ) 
+                {
+                    GdiSetLastError(ERROR_INVALID_HANDLE);
+                    retValue = FALSE;
+                }
+                retValue = SetAbortProc(hdc, (ABORTPROC)lpvInData);
+                break;
+
+            case GETCOLORTABLE:
+                retValue = GetSystemPaletteEntries(hdc, (UINT)*lpvInData, 1, (LPPALETTEENTRY)lpvOutData);
+                if ( !retValue )
+                {
+                    retValue = SP_ERROR;        
+                }            
+                break;
+
+            case ENDDOC:
+                /* Note : Winodws check see if the handle have any user data for DRAFTMODE, FLUSHOUTPUT, SETCOLORTABLE command 
+                 * ReactOS copy this behavior to be compatible with windows 2003 
+                 */
+                if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserData)) ||  
+                     (pUserData == NULL) ) 
+                {
+                    GdiSetLastError(ERROR_INVALID_HANDLE);
+                    retValue = FALSE;
+                }
+                retValue = EndDoc(hdc);
+                break;
+
+
+            case GETSCALINGFACTOR:
+                /* Note GETSCALINGFACTOR is outdated have been replace by GetDeviceCaps */
+                if ( Type == GDI_OBJECT_TYPE_DC )
+                {                
+                    if ( lpvOutData )
+                    {
+                        PPOINT ptr = (PPOINT) lpvOutData;
+                        ptr->x = 0;
+                        ptr->y = 0;                            
+                    }
+                }                                
+                retValue = FALSE;
+                break;
+
+            case GETEXTENDEDTEXTMETRICS:
+                retValue = (int) GetETM( hdc, (EXTTEXTMETRIC *) lpvOutData) != 0;
+                break;
+
+            case  STARTDOC:
+                {
+                    DOCINFOA *pUserDatalpdi;
+                    DOCINFOA lpdi;
+
+                    /* Note : Winodws check see if the handle have any user data for STARTDOC command 
+                     * ReactOS copy this behavior to be compatible with windows 2003 
+                     */
+                    if ( (!GdiGetHandleUserData(hObject, (DWORD)Type, (PVOID) &pUserDatalpdi)) ||  
+                         (pUserData == NULL) ) 
+                    {
+                        GdiSetLastError(ERROR_INVALID_HANDLE);
+                        retValue = FALSE;
+                    }
+
+                    lpdi.cbSize = sizeof(DOCINFOA);
+
+                    /* NOTE lpszOutput will be store in handle userdata */
+                    lpdi.lpszOutput = 0;
+
+                    lpdi.lpszDatatype = 0;
+                    lpdi.fwType = 0;
+                    lpdi.lpszDocName = lpvInData;
+
+                    /* NOTE : doc for StartDocA/W at msdn http://msdn2.microsoft.com/en-us/library/ms535793(VS.85).aspx */
+                    retValue = StartDocA(hdc, &lpdi);  
+
+                    /* StartDocA fail */
+                    if (retValue < 0)
+                    {                                        
+                        /* check see if outbuffer contain any data, if it does abort */ 
+                        if  ( (pUserDatalpdi->lpszOutput != 0) && 
+                              ( (*(WCHAR *)pUserDatalpdi->lpszOutput) != UNICODE_NULL) )
+                        {
+                            retValue = SP_APPABORT;
+                        }
+                        else
+                        {
+                            retValue = GetLastError();
+                         
+                            /* Translate StartDocA error code to STARTDOC error code 
+                             * see msdn http://msdn2.microsoft.com/en-us/library/ms535472.aspx 
+                             */
+                            switch(retValue)
+                            {
+                                case ERROR_NOT_ENOUGH_MEMORY:
+                                    retValue = SP_OUTOFMEMORY;
+                                    break;
+
+                                case ERROR_PRINT_CANCELLED:
+                                    retValue = SP_USERABORT;
+                                    break;
+
+                                case ERROR_DISK_FULL:
+                                    retValue = SP_OUTOFDISK;
+                                    break;
+
+                                default:
+                                    retValue = SP_ERROR;
+                                    break;
+                            }                         
+                        }                                                  
+                    }
+                }
+                break;
+                
+            
+
+
+            default:
+                UNIMPLEMENTED;
+                SetLastError(ERROR_CALL_NOT_IMPLEMENTED);                
+        }
+    }
+    
+    return retValue;
 }
 
 /*
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiAddGlsRecord(HDC hdc,
                 DWORD unknown1,
                 LPCSTR unknown2,
@@ -1712,7 +1561,7 @@ GdiAddGlsRecord(HDC hdc,
  * @unimplemented
  */
 HANDLE
-STDCALL
+WINAPI
 GdiConvertMetaFilePict(HGLOBAL hMem)
 {
     UNIMPLEMENTED;
@@ -1724,82 +1573,54 @@ GdiConvertMetaFilePict(HGLOBAL hMem)
  * @implemented
  */
 DEVMODEW *
-STDCALL
-GdiConvertToDevmodeW(DEVMODEA *dm)
-{
-    LPDEVMODEW dmw;
-
-    dmw = HEAP_alloc(sizeof(DEVMODEW));
-    #define COPYS(f,len) MultiByteToWideChar ( CP_THREAD_ACP, 0, (LPSTR)dm->f, len, dmw->f, len )
-    #define COPYN(f) dmw->f = dm->f
-    COPYS(dmDeviceName, CCHDEVICENAME );
-    COPYN(dmSpecVersion);
-    COPYN(dmDriverVersion);
-    switch ( dm->dmSize )
-    {
-        case SIZEOF_DEVMODEA_300:
-            dmw->dmSize = SIZEOF_DEVMODEW_300;
-            break;
-        case SIZEOF_DEVMODEA_400:
-            dmw->dmSize = SIZEOF_DEVMODEW_400;
-            break;
-        case SIZEOF_DEVMODEA_500:
-            default: /* FIXME what to do??? */
-                dmw->dmSize = SIZEOF_DEVMODEW_500;
-            break;
-    }
-    COPYN(dmDriverExtra);
-    COPYN(dmFields);
-    COPYN(dmPosition.x);
-    COPYN(dmPosition.y);
-    COPYN(dmScale);
-    COPYN(dmCopies);
-    COPYN(dmDefaultSource);
-    COPYN(dmPrintQuality);
-    COPYN(dmColor);
-    COPYN(dmDuplex);
-    COPYN(dmYResolution);
-    COPYN(dmTTOption);
-    COPYN(dmCollate);
-    COPYS(dmFormName,CCHFORMNAME);
-    COPYN(dmLogPixels);
-    COPYN(dmBitsPerPel);
-    COPYN(dmPelsWidth);
-    COPYN(dmPelsHeight);
-    COPYN(dmDisplayFlags); // aka dmNup
-    COPYN(dmDisplayFrequency);
-
-    if ( dm->dmSize <= SIZEOF_DEVMODEA_300 )
-    {
-        return dmw; // we're done with 0x300 fields
-    }
+WINAPI
+GdiConvertToDevmodeW(DEVMODEA *dmA)
+{
+    DEVMODEW *dmW;
+    WORD dmW_size, dmA_size;
+
+    dmA_size = dmA->dmSize;
+
+    /* this is the minimal dmSize that XP accepts */
+    if (dmA_size < FIELD_OFFSET(DEVMODEA, dmFields))
+        return NULL;
+
+    if (dmA_size > sizeof(DEVMODEA))
+        dmA_size = sizeof(DEVMODEA);
 
-    COPYN(dmICMMethod);
-    COPYN(dmICMIntent);
-    COPYN(dmMediaType);
-    COPYN(dmDitherType);
-    COPYN(dmReserved1);
-    COPYN(dmReserved2);
+    dmW_size = dmA_size + CCHDEVICENAME;
+    if (dmA_size >= FIELD_OFFSET(DEVMODEA, dmFormName) + CCHFORMNAME)
+        dmW_size += CCHFORMNAME;
 
-    if ( dm->dmSize <= SIZEOF_DEVMODEA_400 )
+    dmW = HeapAlloc(GetProcessHeap(), 0, dmW_size + dmA->dmDriverExtra);
+    if (!dmW) return NULL;
+
+    MultiByteToWideChar(CP_ACP, 0, (const char*) dmA->dmDeviceName, CCHDEVICENAME,
+                                   dmW->dmDeviceName, CCHDEVICENAME);
+    /* copy slightly more, to avoid long computations */
+    memcpy(&dmW->dmSpecVersion, &dmA->dmSpecVersion, dmA_size - CCHDEVICENAME);
+
+    if (dmA_size >= FIELD_OFFSET(DEVMODEA, dmFormName) + CCHFORMNAME)
     {
-        return dmw; // we're done with 0x400 fields
+        MultiByteToWideChar(CP_ACP, 0, (const char*) dmA->dmFormName, CCHFORMNAME,
+                                       dmW->dmFormName, CCHFORMNAME);
+        if (dmA_size > FIELD_OFFSET(DEVMODEA, dmLogPixels))
+            memcpy(&dmW->dmLogPixels, &dmA->dmLogPixels, dmA_size - FIELD_OFFSET(DEVMODEA, dmLogPixels));
     }
 
-    COPYN(dmPanningWidth);
-    COPYN(dmPanningHeight);
+    if (dmA->dmDriverExtra)
+        memcpy((char *)dmW + dmW_size, (const char *)dmA + dmA_size, dmA->dmDriverExtra);
 
-    return dmw;
+    dmW->dmSize = dmW_size;
 
-    #undef COPYN
-    #undef COPYS
+    return dmW;
 }
 
 /*
  * @unimplemented
  */
 HENHMETAFILE
-STDCALL
+WINAPI
 GdiCreateLocalEnhMetaFile(HENHMETAFILE hmo)
 {
     UNIMPLEMENTED;
@@ -1811,7 +1632,7 @@ GdiCreateLocalEnhMetaFile(HENHMETAFILE hmo)
  * @unimplemented
  */
 METAFILEPICT *
-STDCALL
+WINAPI
 GdiCreateLocalMetaFilePict(HENHMETAFILE hmo)
 {
     UNIMPLEMENTED;
@@ -1824,7 +1645,7 @@ GdiCreateLocalMetaFilePict(HENHMETAFILE hmo)
  * @unimplemented
  */
 HANDLE
-STDCALL
+WINAPI
 GdiGetSpoolFileHandle(LPWSTR pwszPrinterName,
                       LPDEVMODEW pDevmode,
                       LPWSTR pwszDocName)
@@ -1838,7 +1659,7 @@ GdiGetSpoolFileHandle(LPWSTR pwszPrinterName,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiDeleteSpoolFileHandle(HANDLE SpoolFileHandle)
 {
     UNIMPLEMENTED;
@@ -1850,7 +1671,7 @@ GdiDeleteSpoolFileHandle(HANDLE SpoolFileHandle)
  * @unimplemented
  */
 DWORD
-STDCALL
+WINAPI
 GdiGetPageCount(HANDLE SpoolFileHandle)
 {
     UNIMPLEMENTED;
@@ -1862,7 +1683,7 @@ GdiGetPageCount(HANDLE SpoolFileHandle)
  * @unimplemented
  */
 HDC
-STDCALL
+WINAPI
 GdiGetDC(HANDLE SpoolFileHandle)
 {
     UNIMPLEMENTED;
@@ -1874,7 +1695,7 @@ GdiGetDC(HANDLE SpoolFileHandle)
  * @unimplemented
  */
 HANDLE
-STDCALL
+WINAPI
 GdiGetPageHandle(HANDLE SpoolFileHandle,
                  DWORD Page,
                  LPDWORD pdwPageType)
@@ -1888,7 +1709,7 @@ GdiGetPageHandle(HANDLE SpoolFileHandle,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiStartDocEMF(HANDLE SpoolFileHandle,
                DOCINFOW *pDocInfo)
 {
@@ -1901,7 +1722,7 @@ GdiStartDocEMF(HANDLE SpoolFileHandle,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiStartPageEMF(HANDLE SpoolFileHandle)
 {
     UNIMPLEMENTED;
@@ -1913,7 +1734,7 @@ GdiStartPageEMF(HANDLE SpoolFileHandle)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiPlayPageEMF(HANDLE SpoolFileHandle,
                HANDLE hemf,
                RECT *prectDocument,
@@ -1929,7 +1750,7 @@ GdiPlayPageEMF(HANDLE SpoolFileHandle,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiEndPageEMF(HANDLE SpoolFileHandle,
               DWORD dwOptimization)
 {
@@ -1942,7 +1763,7 @@ GdiEndPageEMF(HANDLE SpoolFileHandle,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiEndDocEMF(HANDLE SpoolFileHandle)
 {
     UNIMPLEMENTED;
@@ -1954,7 +1775,7 @@ GdiEndDocEMF(HANDLE SpoolFileHandle)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiGetDevmodeForPage(HANDLE SpoolFileHandle,
                      DWORD dwPageNumber,
                      PDEVMODEW *pCurrDM,
@@ -1969,7 +1790,7 @@ GdiGetDevmodeForPage(HANDLE SpoolFileHandle,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiResetDCEMF(HANDLE SpoolFileHandle,
               PDEVMODEW pCurrDM)
 {
@@ -1979,22 +1800,11 @@ GdiResetDCEMF(HANDLE SpoolFileHandle,
 }
 
 
-HBITMAP
-STDCALL
-CreateDIBitmap(HDC hDc,
-               const BITMAPINFOHEADER *Header,
-               DWORD Init, LPCVOID Bits, const BITMAPINFO *Data,
-               UINT ColorUse)
-{
-    /* FIMXE we need do more thing in user mode */
-    return NtGdiCreateDIBitmap(hDc, Header, Init, Bits, Data,  ColorUse);
-}
-
 /*
  * @unimplemented
  */
 INT
-STDCALL
+WINAPI
 CombineRgn(HRGN  hDest,
            HRGN  hSrc1,
            HRGN  hSrc2,
@@ -2007,32 +1817,7 @@ CombineRgn(HRGN  hDest,
 /*
  * @unimplemented
  */
-HBITMAP STDCALL
-CreateBitmap(INT  Width,
-             INT  Height,
-             UINT  Planes,
-             UINT  BitsPixel,
-             PCVOID pUnsafeBits)
-{
-    /* FIXME some part should be done in user mode */
-    return NtGdiCreateBitmap(Width, Height, Planes, BitsPixel, (LPBYTE) pUnsafeBits);
-}
-
-/*
- * @unimplemented
- */
-LPWSTR STDCALL
-EngGetDriverName(HDEV hdev)
-{
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
-}
-
-/*
- * @unimplemented
- */
-ULONG STDCALL
+ULONG WINAPI
 XLATEOBJ_iXlate(XLATEOBJ *XlateObj,
                 ULONG Color)
 {
@@ -2045,7 +1830,7 @@ XLATEOBJ_iXlate(XLATEOBJ *XlateObj,
  * @unimplemented
  */
 ULONG *
-STDCALL
+WINAPI
 XLATEOBJ_piVector(XLATEOBJ *XlateObj)
 {
     return XlateObj->pulXlate;
@@ -2055,7 +1840,7 @@ XLATEOBJ_piVector(XLATEOBJ *XlateObj)
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiPlayEMF(LPWSTR pwszPrinterName,
            LPDEVMODEW pDevmode,
            LPWSTR pwszDocName,
@@ -2074,7 +1859,7 @@ GdiPlayEMF(LPWSTR pwszPrinterName,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiPlayPrivatePageEMF(HANDLE SpoolFileHandle,
                       DWORD unknown,
                       RECT *prectDocument)
@@ -2087,7 +1872,7 @@ GdiPlayPrivatePageEMF(HANDLE SpoolFileHandle,
 /*
  * @unimplemented
  */
-VOID STDCALL GdiInitializeLanguagePack(DWORD InitParam)
+VOID WINAPI GdiInitializeLanguagePack(DWORD InitParam)
 {
     UNIMPLEMENTED;
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
@@ -2098,7 +1883,7 @@ VOID STDCALL GdiInitializeLanguagePack(DWORD InitParam)
  * @implemented
  */
 INT
-STDCALL
+WINAPI
 ExcludeClipRect(IN HDC hdc, IN INT xLeft, IN INT yTop, IN INT xRight, IN INT yBottom)
 {
     /* FIXME some part need be done on user mode size */
@@ -2109,7 +1894,7 @@ ExcludeClipRect(IN HDC hdc, IN INT xLeft, IN INT yTop, IN INT xRight, IN INT yBo
  * @implemented
  */
 INT
-STDCALL
+WINAPI
 ExtSelectClipRgn( IN HDC hdc, IN HRGN hrgn, IN INT iMode)
 {
     /* FIXME some part need be done on user mode size */
@@ -2120,7 +1905,7 @@ ExtSelectClipRgn( IN HDC hdc, IN HRGN hrgn, IN INT iMode)
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiGradientFill(
     IN HDC hdc,
     IN PTRIVERTEX pVertex,
@@ -2138,7 +1923,7 @@ GdiGradientFill(
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiTransparentBlt(IN HDC hdcDst,
                   IN INT xDst,
                   IN INT yDst,
@@ -2160,7 +1945,7 @@ GdiTransparentBlt(IN HDC hdcDst,
  * @unimplemented
  */
 BOOL
-STDCALL
+WINAPI
 GdiPrinterThunk(
     IN HUMPD humpd,
     DWORD *status,
@@ -2179,7 +1964,7 @@ GdiPrinterThunk(
  *
  */
 HBITMAP
-STDCALL
+WINAPI
 GdiConvertBitmapV5(
     HBITMAP in_format_BitMap,
     HBITMAP src_BitMap,
@@ -2197,30 +1982,15 @@ GdiConvertBitmapV5(
     return FALSE;
 }
 
-
-/*
- * @implemented
- *
- */
-int
-STDCALL
-GetDeviceCaps(HDC hdc,
-              int i)
-{
-    /* FIXME some part need be done in user mode */
-    return NtGdiGetDeviceCaps(hdc,i);
-}
-
 /*
  * @implemented
  *
  */
 int
-STDCALL
+WINAPI
 GetClipBox(HDC hdc,
            LPRECT lprc)
 {
-    /* FIXME some part need be done in user mode */
     return  NtGdiGetAppClipBox(hdc, lprc);
 }
 
@@ -2229,7 +1999,7 @@ GetClipBox(HDC hdc,
  *
  */
 DWORD
-STDCALL
+WINAPI
 GetFontData(HDC hdc,
             DWORD dwTable,
             DWORD dwOffset,
@@ -2249,7 +2019,7 @@ GetFontData(HDC hdc,
  *
  */
 DWORD
-STDCALL
+WINAPI
 GetRegionData(HRGN hrgn,
               DWORD nCount,
               LPRGNDATA lpRgnData)
@@ -2268,12 +2038,29 @@ GetRegionData(HRGN hrgn,
  *
  */
 INT
-STDCALL
+WINAPI
 GetRgnBox(HRGN hrgn,
           LPRECT prcOut)
 {
-    /* FIXME some stuff need be done in user mode */
-    return NtGdiGetRgnBox(hrgn, prcOut);
+#if 0
+  PRGN_ATTR Rgn_Attr;
+  if (!GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr))
+     return NtGdiGetRgnBox(hrgn, prcOut);
+  if (Rgn_Attr->Flags == NULLREGION)
+  {
+     prcOut->left   = 0;
+     prcOut->top    = 0;
+     prcOut->right  = 0;
+     prcOut->bottom = 0;
+  }
+  else
+  {
+     if (Rgn_Attr->Flags != SIMPLEREGION) return NtGdiGetRgnBox(hrgn, prcOut);
+     *prcOut = Rgn_Attr->Rect;
+  }
+  return Rgn_Attr->Flags;
+#endif
+  return NtGdiGetRgnBox(hrgn, prcOut);
 }
 
 
@@ -2282,7 +2069,7 @@ GetRgnBox(HRGN hrgn,
  *
  */
 INT
-STDCALL
+WINAPI
 OffsetRgn( HRGN hrgn,
           int nXOffset,
           int nYOffset)
@@ -2291,44 +2078,75 @@ OffsetRgn( HRGN hrgn,
     return NtGdiOffsetRgn(hrgn,nXOffset,nYOffset);
 }
 
-
-INT
-STDCALL
-GetTextCharsetInfo(HDC hdc,
-                   LPFONTSIGNATURE lpSig,
-                   DWORD dwFlags)
-{
-    /* FIXME some part are done in user mode */
-    return NtGdiGetTextCharsetInfo(hdc, lpSig, dwFlags);
-}
-
-
-
+/*
+ * @implemented
+ */
 INT
-STDCALL
+WINAPI
 IntersectClipRect(HDC hdc,
                   int nLeftRect,
                   int nTopRect,
                   int nRightRect,
                   int nBottomRect)
 {
-    /* FIXME some part are done in user mode */
+#if 0
+// Handle something other than a normal dc object.
+  if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
+  {
+    if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
+      return MFDRV_IntersectClipRect( hdc, nLeftRect, nTopRect, nRightRect, nBottomRect);
+    else
+    {
+      PLDC pLDC = GdiGetLDC(hdc);
+      if ( pLDC )
+      {
+         if (pLDC->iType != LDC_EMFLDC || EMFDRV_IntersectClipRect( hdc, nLeftRect, nTopRect, nRightRect, nBottomRect))
+             return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect);
+      }
+      else
+        SetLastError(ERROR_INVALID_HANDLE);
+      return 0;
+    }
+  }
+#endif
     return NtGdiIntersectClipRect(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect);
 }
 
+/*
+ * @implemented
+ */
 INT
-STDCALL
+WINAPI
 OffsetClipRgn(HDC hdc,
               int nXOffset,
               int nYOffset)
 {
-    /* FIXME some part are done in user mode */
-    return NtGdiOffsetClipRgn( hdc,  nXOffset,  nYOffset);
+#if 0
+// Handle something other than a normal dc object.
+  if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
+  {
+    if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
+      return MFDRV_OffsetClipRgn( hdc, nXOffset, nYOffset );
+    else
+    {
+      PLDC pLDC = GdiGetLDC(hdc);
+      if ( !pLDC )
+      {
+         SetLastError(ERROR_INVALID_HANDLE);
+         return 0;
+      }
+      if (pLDC->iType == LDC_EMFLDC && !EMFDRV_OffsetClipRgn( hdc, nXOffset, nYOffset ))
+         return 0;
+      return NtGdiOffsetClipRgn( hdc,  nXOffset,  nYOffset);
+    }
+  }
+#endif
+  return NtGdiOffsetClipRgn( hdc,  nXOffset,  nYOffset);
 }
 
 
 INT
-STDCALL
+WINAPI
 NamedEscape(HDC hdc,
             PWCHAR pDriver,
             INT iEsc,
@@ -2352,7 +2170,7 @@ NamedEscape(HDC hdc,
 
 /* FIXME wrong protypes, it is a fastcall api */
 DWORD
-STDCALL
+WINAPI
 cGetTTFFromFOT(DWORD x1 ,DWORD x2 ,DWORD x3, DWORD x4, DWORD x5, DWORD x6, DWORD x7)
 {
     UNIMPLEMENTED;