[GDI32]
[reactos.git] / reactos / dll / win32 / gdi32 / objects / dc.c
index bdb6d6b..ddc33e5 100644 (file)
@@ -20,6 +20,15 @@ IntCreateDICW ( LPCWSTR   lpwszDriver,
 
  HANDLE hspool = NULL;
 
+ if ( !ghSpooler && !LoadTheSpoolerDrv())
+ {
+    DPRINT1("WinSpooler.Drv Did not load!\n");
+ }
+ else
+ {
+    DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x\n", ghSpooler);
+ }
+
  if ((!lpwszDevice) && (!lpwszDriver))
  {
      Default = FALSE;  // Ask Win32k to set Default device.
@@ -27,7 +36,7 @@ IntCreateDICW ( LPCWSTR   lpwszDriver,
  }
  else
  {
-    if (lpwszDevice) // First
+    if ((lpwszDevice) && (wcslen(lpwszDevice) != 0))  // First
     {
       if (!_wcsnicmp(lpwszDevice, L"\\\\.\\DISPLAY",11)) Display = TRUE;
       RtlInitUnicodeString(&Device, lpwszDevice);
@@ -55,6 +64,7 @@ IntCreateDICW ( LPCWSTR   lpwszDriver,
                      (PDEVMODEW) lpInitData,
                      (lpwszOutput ? &Output : NULL),
                       iType,             // DCW 0 and ICW 1.
+                      Display,
                       hspool,
                      (PVOID) NULL,       // NULL for now.
                      (PVOID) &UMdhpdev );
@@ -83,7 +93,7 @@ IntCreateDICW ( LPCWSTR   lpwszDriver,
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 CreateCompatibleDC ( HDC hdc)
 {
  HDC rhDC;
@@ -106,7 +116,7 @@ CreateCompatibleDC ( HDC hdc)
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 CreateDCA (
        LPCSTR          lpszDriver,
        LPCSTR          lpszDevice,
@@ -170,7 +180,7 @@ CreateDCA (
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 CreateDCW (
        LPCWSTR         lpwszDriver,
        LPCWSTR         lpwszDevice,
@@ -191,7 +201,7 @@ CreateDCW (
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 CreateICW(
        LPCWSTR         lpszDriver,
        LPCWSTR         lpszDevice,
@@ -211,7 +221,7 @@ CreateICW(
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 CreateICA(
        LPCSTR          lpszDriver,
        LPCSTR          lpszDevice,
@@ -262,29 +272,41 @@ CreateICA(
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 DeleteDC(HDC hDC)
 {
   BOOL Ret = TRUE;
-#if 0
-  PDC_ATTR Dc_Attr;
-  PLDC pLDC;
+  PLDC pLDC = NULL;
+  HANDLE hPrinter = NULL;
+  ULONG hType = GDI_HANDLE_GET_TYPE(hDC);
 
-  if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return FALSE;
+  pLDC = GdiGetLDC(hDC);
 
-  if ( Dc_Attr )
-    {
-      pLDC = Dc_Attr->pvLDC;
+  if (hType != GDILoObjType_LO_DC_TYPE)
+  {
+
+     if ( !pLDC || hType == GDILoObjType_LO_METADC16_TYPE)
+     {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+     }
+     if (pLDC->Flags & LDC_INIT_DOCUMENT) AbortDoc(hDC);
+     if (pLDC->hPrinter)
+     {
+        DocumentEventEx(NULL, pLDC->hPrinter, hDC, DOCUMENTEVENT_DELETEDC, 0, NULL, 0, NULL);
+        hPrinter = pLDC->hPrinter;
+        pLDC->hPrinter = NULL;
+     }
+  }
 
-      if ( pLDC )
-        {
-          DPRINT1("Delete the Local DC structure\n");
-          LocalFree( pLDC );
-        }
-    }
-#endif
   Ret = NtGdiDeleteObjectApp(hDC);
 
+  if (Ret && pLDC )
+  {
+     DPRINT1("Delete the Local DC structure\n");
+     LocalFree( pLDC );
+  }
+  if (hPrinter) fpClosePrinter(hPrinter);
   return Ret;
 }
 
@@ -292,7 +314,7 @@ DeleteDC(HDC hDC)
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 DeleteObject(HGDIOBJ hObject)
 {
   UINT Type = 0;
@@ -372,7 +394,7 @@ DeleteObject(HGDIOBJ hObject)
 }
 
 INT
-STDCALL
+WINAPI
 GetArcDirection( HDC hdc )
 {
   return GetDCDWord( hdc, GdiGetArcDirection, 0);
@@ -380,7 +402,7 @@ GetArcDirection( HDC hdc )
 
 
 INT
-STDCALL
+WINAPI
 SetArcDirection( HDC hdc, INT nDirection )
 {
   return GetAndSetDCDWord( hdc, GdiGetSetArcDirection, nDirection, 0, 0, 0 );
@@ -388,7 +410,7 @@ SetArcDirection( HDC hdc, INT nDirection )
 
 
 HGDIOBJ
-STDCALL
+WINAPI
 GetDCObject( HDC hDC, INT iType)
 {
  if((iType == GDI_OBJECT_TYPE_BRUSH) ||
@@ -429,7 +451,7 @@ GetDCObject( HDC hDC, INT iType)
  *
  */
 HGDIOBJ
-STDCALL
+WINAPI
 GetCurrentObject(HDC hdc,
                  UINT uObjectType)
 {
@@ -470,7 +492,7 @@ GetCurrentObject(HDC hdc,
  *
  */
 int
-STDCALL
+WINAPI
 GetDeviceCaps(HDC hDC,
               int i)
 {
@@ -505,11 +527,6 @@ GetDeviceCaps(HDC hDC,
   }
   else
   {
-     // HAX!!!!
-     // Due to winlogon process/thread mapping issues we have this hax!
-     //
-     return NtGdiGetDeviceCaps(hDC,i);
-
      if (!GdiGetHandleUserData((HGDIOBJ) hDC, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr))
         return 0;
      if (!(Dc_Attr->ulDirty_ & DC_PRIMARY_DISPLAY) )
@@ -643,7 +660,7 @@ GetDeviceCaps(HDC hDC,
  * @implemented
  */
 DWORD
-STDCALL
+WINAPI
 GetRelAbs(
          HDC  hdc,
          DWORD dwIgnore
@@ -656,8 +673,8 @@ GetRelAbs(
 /*
  * @implemented
  */
-DWORD
-STDCALL
+INT
+WINAPI
 SetRelAbs(
        HDC hdc,
        INT Mode
@@ -671,7 +688,7 @@ SetRelAbs(
  * @implemented
  */
 DWORD
-STDCALL
+WINAPI
 GetAndSetDCDWord( HDC hDC, INT u, DWORD dwIn, DWORD Unk1, DWORD Unk2, DWORD Unk3 )
 {
   BOOL Ret = TRUE;
@@ -710,7 +727,7 @@ GetAndSetDCDWord( HDC hDC, INT u, DWORD dwIn, DWORD Unk1, DWORD Unk2, DWORD Unk3
  * @implemented
  */
 DWORD
-STDCALL
+WINAPI
 GetDCDWord( HDC hDC, INT u, DWORD Result )
 {
   BOOL Ret = NtGdiGetDCDword( hDC, u, (DWORD*) &u );
@@ -723,7 +740,7 @@ GetDCDWord( HDC hDC, INT u, DWORD Result )
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetAspectRatioFilterEx(
                 HDC hdc,
                 LPSIZE lpAspectRatio
@@ -737,7 +754,7 @@ GetAspectRatioFilterEx(
  * @implemented
  */
 BOOL
-STDCALL
+WINAPI
 GetDCOrgEx(
     HDC hdc,
     LPPOINT lpPoint
@@ -751,7 +768,7 @@ GetDCOrgEx(
  * @implemented
  */
 LONG
-STDCALL
+WINAPI
 GetDCOrg(
     HDC hdc
     )
@@ -813,14 +830,14 @@ GetNonFontObject(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
  * @implemented
  */
 int
-STDCALL
+WINAPI
 GetObjectA(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
 {
   ENUMLOGFONTEXDVW LogFont;
   DWORD dwType;
   INT Result = 0;
 
-  dwType = GDI_HANDLE_GET_TYPE(hGdiObj);;
+  dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
 
   if(dwType == GDI_OBJECT_TYPE_COLORSPACE) //Stays here, processes struct A
   {
@@ -879,7 +896,7 @@ GetObjectA(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
  * @implemented
  */
 int
-STDCALL
+WINAPI
 GetObjectW(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
 {
   DWORD dwType = GDI_HANDLE_GET_TYPE(hGdiObj);
@@ -911,7 +928,7 @@ GetObjectW(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
     }
     // Poorly written apps are not ReactOS problem!
     // We fix it here if the size is larger than the default size.
-    if( cbSize > sizeof(ENUMLOGFONTEXDVW) ) cbSize = sizeof(ENUMLOGFONTEXDVW);
+    if( cbSize > (int)sizeof(ENUMLOGFONTEXDVW) ) cbSize = sizeof(ENUMLOGFONTEXDVW);
 
     Result = NtGdiExtGetObjectW(hGdiObj, cbSize, lpBuffer); // Should handle the copy.
 
@@ -930,7 +947,7 @@ GetObjectW(HGDIOBJ hGdiObj, int cbSize, LPVOID lpBuffer)
  * @implemented
  */
 COLORREF
-STDCALL
+WINAPI
 GetDCBrushColor(
        HDC hdc
 )
@@ -938,14 +955,14 @@ GetDCBrushColor(
   PDC_ATTR Dc_Attr;
 
   if (!GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr)) return CLR_INVALID;
-  return (COLORREF) Dc_Attr->ulPenClr;
+  return (COLORREF) Dc_Attr->ulBrushClr;
 }
 
 /*
  * @implemented
  */
 COLORREF
-STDCALL
+WINAPI
 GetDCPenColor(
        HDC hdc
 )
@@ -960,7 +977,7 @@ GetDCPenColor(
  * @implemented
  */
 COLORREF
-STDCALL
+WINAPI
 SetDCBrushColor(
        HDC hdc,
        COLORREF crColor
@@ -988,7 +1005,7 @@ SetDCBrushColor(
  * @implemented
  */
 COLORREF
-STDCALL
+WINAPI
 SetDCPenColor(
        HDC hdc,
        COLORREF crColor
@@ -1017,7 +1034,7 @@ SetDCPenColor(
  *
  */
 COLORREF
-STDCALL
+WINAPI
 GetBkColor(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1029,7 +1046,7 @@ GetBkColor(HDC hdc)
  * @implemented
  */
 COLORREF
-STDCALL
+WINAPI
 SetBkColor(
        HDC hdc,
        COLORREF crColor
@@ -1064,7 +1081,7 @@ SetBkColor(
 
   if ( Dc_Attr->crBackgroundClr != crColor )
   {
-     Dc_Attr->ulDirty_ |= DIRTY_LINE;
+     Dc_Attr->ulDirty_ |= (DIRTY_BACKGROUND|DIRTY_LINE|DIRTY_FILL);
      Dc_Attr->crBackgroundClr = crColor;
   }
   return OldColor;
@@ -1075,7 +1092,7 @@ SetBkColor(
  *
  */
 int
-STDCALL
+WINAPI
 GetBkMode(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1088,7 +1105,7 @@ GetBkMode(HDC hdc)
  *
  */
 int
-STDCALL
+WINAPI
 SetBkMode(HDC hdc,
               int iBkMode)
 {
@@ -1127,7 +1144,7 @@ SetBkMode(HDC hdc,
  *
  */
 int
-STDCALL
+WINAPI
 GetPolyFillMode(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1139,7 +1156,7 @@ GetPolyFillMode(HDC hdc)
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 SetPolyFillMode(HDC hdc,
                 int iPolyFillMode)
 {
@@ -1187,7 +1204,7 @@ SetPolyFillMode(HDC hdc,
  *
  */
 int
-STDCALL
+WINAPI
 GetGraphicsMode(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1199,7 +1216,7 @@ GetGraphicsMode(HDC hdc)
  * @unimplemented
  */
 int
-STDCALL
+WINAPI
 SetGraphicsMode(HDC hdc,
                 int iMode)
 {
@@ -1237,7 +1254,7 @@ SetGraphicsMode(HDC hdc,
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 ResetDCW(
        HDC             hdc,
        CONST DEVMODEW  *lpInitData
@@ -1252,7 +1269,7 @@ ResetDCW(
  * @implemented
  */
 HDC
-STDCALL
+WINAPI
 ResetDCA(
        HDC             hdc,
        CONST DEVMODEA  *lpInitData
@@ -1268,25 +1285,11 @@ ResetDCA(
 }
 
 
-/*
- * @implemented
- */
-int
-STDCALL
-StartDocW(
-       HDC             hdc,
-       CONST DOCINFOW  *a1
-       )
-{
-       return NtGdiStartDoc ( hdc, (DOCINFOW *)a1, NULL, 0);
-}
-
-
 /*
  * @implemented
  */
 DWORD
-STDCALL
+WINAPI
 GetObjectType(
        HGDIOBJ h
        )
@@ -1378,12 +1381,12 @@ GetStockObject(
 }
 
 /* FIXME: include correct header */
-HPALETTE STDCALL NtUserSelectPalette(HDC  hDC,
+HPALETTE WINAPI NtUserSelectPalette(HDC  hDC,
                             HPALETTE  hpal,
                             BOOL  ForceBackground);
 
 HPALETTE
-STDCALL
+WINAPI
 SelectPalette(
     HDC hDC,
     HPALETTE hPal,
@@ -1417,7 +1420,7 @@ SelectPalette(
  *
  */
 int
-STDCALL
+WINAPI
 GetMapMode(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1429,7 +1432,7 @@ GetMapMode(HDC hdc)
  * @implemented
  */
 INT
-STDCALL
+WINAPI
 SetMapMode(
        HDC hdc,
        INT Mode
@@ -1462,7 +1465,7 @@ SetMapMode(
  *
  */
 int
-STDCALL
+WINAPI
 GetStretchBltMode(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1474,7 +1477,7 @@ GetStretchBltMode(HDC hdc)
  * @implemented
  */
 int
-STDCALL
+WINAPI
 SetStretchBltMode(HDC hdc, int iStretchMode)
 {
   INT oSMode;
@@ -1516,7 +1519,7 @@ SetStretchBltMode(HDC hdc, int iStretchMode)
  * @implemented
  */
 HFONT
-STDCALL
+WINAPI
 GetHFONT(HDC hdc)
 {
   PDC_ATTR Dc_Attr;
@@ -1530,13 +1533,13 @@ GetHFONT(HDC hdc)
  *
  */
 HGDIOBJ
-STDCALL
+WINAPI
 SelectObject(HDC hDC,
              HGDIOBJ hGdiObj)
 {
     PDC_ATTR pDc_Attr;
-//    HGDIOBJ hOldObj = NULL;
-//    PTEB pTeb;
+    HGDIOBJ hOldObj = NULL;
+    UINT uType;
 
     if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
     {
@@ -1550,7 +1553,7 @@ SelectObject(HDC hDC,
         return NULL;
     }
 
-    UINT uType = GDI_HANDLE_GET_TYPE(hGdiObj);
+    uType = GDI_HANDLE_GET_TYPE(hGdiObj);
 
     switch (uType)
     {
@@ -1561,47 +1564,43 @@ SelectObject(HDC hDC,
             return NtGdiSelectBitmap(hDC, hGdiObj);
 
         case GDI_OBJECT_TYPE_BRUSH:
-#if 0 // enable this when support is ready in win32k
             hOldObj = pDc_Attr->hbrush;
             pDc_Attr->ulDirty_ |= DC_BRUSH_DIRTY;
             pDc_Attr->hbrush = hGdiObj;
             return hOldObj;
-#endif
-            return NtGdiSelectBrush(hDC, hGdiObj);
+//            return NtGdiSelectBrush(hDC, hGdiObj);
 
         case GDI_OBJECT_TYPE_PEN:
         case GDI_OBJECT_TYPE_EXTPEN:
-#if 0 // enable this when support is ready in win32k
             hOldObj = pDc_Attr->hpen;
             pDc_Attr->ulDirty_ |= DC_PEN_DIRTY;
             pDc_Attr->hpen = hGdiObj;
             return hOldObj;
-#endif
-            return NtGdiSelectPen(hDC, hGdiObj);
+//            return NtGdiSelectPen(hDC, hGdiObj);
 
         case GDI_OBJECT_TYPE_FONT:
-#if 0
-            pTeb = NtCurrentTeb();
-            if (((pTeb->GdiTebBatch.HDC == 0) ||
-                 (pTeb->GdiTebBatch.HDC == (ULONG)hDC)) &&
-                ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
-               (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
+            hOldObj = pDc_Attr->hlfntNew;
+            if (hOldObj == hGdiObj) return hOldObj;
+
+            pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
+            pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
+            pDc_Attr->hlfntNew = hGdiObj;
+
+            if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
             {
-              PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] +
-                                                pTeb->GdiTebBatch.Offset);
-              pgO->gbHdr.Cmd = GdiBCSelObj;
-              pgO->gbHdr.Size = sizeof(GDIBSOBJECT);
-              pgO->hgdiobj = hGdiObj;
-
-              pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT);
-              pTeb->GdiTebBatch.HDC = (ULONG)hDC;
-              pTeb->GdiBatchCount++;
-              if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
-              return pDc_Attr->hlfntNew;
+                PGDIBSOBJECT pgO;
+
+                pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj);
+                if (pgO)
+                {
+                    pgO->hgdiobj = hGdiObj;
+                    return hOldObj;
+                }
             }
-#endif
+
             // default for select object font
             return NtGdiSelectFont(hDC, hGdiObj);
+
 #if 0
         case GDI_OBJECT_TYPE_METADC:
             return MFDRV_SelectObject( hDC, hGdiObj);