[GDI32]
[reactos.git] / reactos / dll / win32 / gdi32 / objects / dc.c
index 924c340..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 );
@@ -266,25 +276,37 @@ 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;
 }
 
@@ -651,7 +673,7 @@ GetRelAbs(
 /*
  * @implemented
  */
-DWORD
+INT
 WINAPI
 SetRelAbs(
        HDC hdc,
@@ -1263,20 +1285,6 @@ ResetDCA(
 }
 
 
-/*
- * @implemented
- */
-int
-WINAPI
-StartDocW(
-       HDC             hdc,
-       CONST DOCINFOW  *a1
-       )
-{
-       return NtGdiStartDoc ( hdc, (DOCINFOW *)a1, NULL, 0);
-}
-
-
 /*
  * @implemented
  */
@@ -1531,7 +1539,7 @@ SelectObject(HDC hDC,
 {
     PDC_ATTR pDc_Attr;
     HGDIOBJ hOldObj = NULL;
-//    PTEB pTeb;
+    UINT uType;
 
     if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
     {
@@ -1545,7 +1553,7 @@ SelectObject(HDC hDC,
         return NULL;
     }
 
-    UINT uType = GDI_HANDLE_GET_TYPE(hGdiObj);
+    uType = GDI_HANDLE_GET_TYPE(hGdiObj);
 
     switch (uType)
     {
@@ -1573,29 +1581,23 @@ SelectObject(HDC hDC,
         case GDI_OBJECT_TYPE_FONT:
             hOldObj = pDc_Attr->hlfntNew;
             if (hOldObj == hGdiObj) return hOldObj;
-#if 0
+
             pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS;
             pDc_Attr->ulDirty_ |= DIRTY_CHARSET;
             pDc_Attr->hlfntNew = hGdiObj;
-            pTeb = NtCurrentTeb();
-            if (((pTeb->GdiTebBatch.HDC == 0) ||
-                 (pTeb->GdiTebBatch.HDC == hDC)) &&
-                ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) &&
-               (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)))
+
+            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 = hDC;
-              pTeb->GdiBatchCount++;
-              if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
-              return hOldObj;
+                PGDIBSOBJECT pgO;
+
+                pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj);
+                if (pgO)
+                {
+                    pgO->hgdiobj = hGdiObj;
+                    return hOldObj;
+                }
             }
-#endif
+
             // default for select object font
             return NtGdiSelectFont(hDC, hGdiObj);