[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 29 Dec 2014 13:12:05 +0000 (13:12 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Mon, 29 Dec 2014 13:12:05 +0000 (13:12 +0000)
- Implement GreCreateCompatibleDC, allowing to pass in a boolean value, specifying the DC type (normal or "alternative" DC, aka metafile DC)
- Properly implement NtGdiCreateMetafileDC around GreCreateCompatibleDC

svn path=/trunk/; revision=65885

reactos/win32ss/gdi/ntgdi/dc.h
reactos/win32ss/gdi/ntgdi/dclife.c
reactos/win32ss/gdi/ntgdi/dcstate.c
reactos/win32ss/gdi/ntgdi/metafile.c

index d1000fc..2db234a 100644 (file)
@@ -182,7 +182,7 @@ COLORREF FASTCALL IntSetDCPenColor(HDC,COLORREF);
 
 INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID);
 PPDEVOBJ FASTCALL IntEnumHDev(VOID);
-PDC NTAPI DC_AllocDcWithHandle(VOID);
+PDC NTAPI DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType);
 BOOL NTAPI DC_bAllocDcAttr(PDC pdc);
 VOID NTAPI DC_vCleanup(PVOID ObjectBody);
 BOOL FASTCALL IntGdiDeleteDC(HDC, BOOL);
@@ -205,6 +205,7 @@ BOOL FASTCALL IntGdiCleanDC(HDC hDC);
 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
 
 BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
+HDC APIENTRY GreCreateCompatibleDC(HDC hdc, BOOL bAltDc);
 
 VOID
 NTAPI
@@ -219,7 +220,8 @@ DC_LockDc(HDC hdc)
     pdc = GDIOBJ_LockObject(hdc, GDIObjType_DC_TYPE);
     if (pdc)
     {
-        ASSERT(GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE);
+        ASSERT((GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_DC_TYPE) ||
+               (GDI_HANDLE_GET_TYPE(pdc->BaseObject.hHmgr) == GDILoObjType_LO_ALTDC_TYPE));
         ASSERT(pdc->dclevel.plfnt != NULL);
         ASSERT(GDI_HANDLE_GET_TYPE(((POBJ)pdc->dclevel.plfnt)->hHmgr) == GDILoObjType_LO_FONT_TYPE);
     }
index 9dce676..22056f3 100644 (file)
@@ -66,10 +66,14 @@ InitDcImpl()
 
 PDC
 NTAPI
-DC_AllocDcWithHandle()
+DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType)
 {
     PDC pdc;
 
+    NT_ASSERT((eDcObjType == GDILoObjType_LO_DC_TYPE) ||
+              (eDcObjType == GDILoObjType_LO_ALTDC_TYPE));
+
+    /* Allocate the object */
     pdc = (PDC)GDIOBJ_AllocateObject(GDIObjType_DC_TYPE,
                                      sizeof(DC),
                                      BASEFLAG_LOOKASIDE);
@@ -79,6 +83,10 @@ DC_AllocDcWithHandle()
         return NULL;
     }
 
+    /* Set the actual DC type */
+    pdc->BaseObject.hHmgr = UlongToHandle(eDcObjType);
+
+    /* Insert the object */
     if (!GDIOBJ_hInsertObject(&pdc->BaseObject, GDI_OBJ_HMGR_POWNED))
     {
         DPRINT1("Could not insert DC into handle table.\n");
@@ -95,6 +103,15 @@ DC_AllocDcWithHandle()
 void
 DC_InitHack(PDC pdc)
 {
+    if (defaultDCstate == NULL)
+    {
+        defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC);
+        ASSERT(defaultDCstate);
+        RtlZeroMemory(defaultDCstate, sizeof(DC));
+        defaultDCstate->pdcattr = &defaultDCstate->dcattr;
+        DC_vCopyState(pdc, defaultDCstate, TRUE);
+    }
+
     TextIntRealizeFont(pdc->pdcattr->hlfntNew,NULL);
     pdc->pdcattr->iCS_CP = ftGdiGetTextCharsetInfo(pdc,NULL,0);
 
@@ -327,15 +344,6 @@ DC_vInitDc(
        pdc->dcattr.iGraphicsMode = GM_COMPATIBLE;
        pdc->dcattr.iCS_CP = 0;
     pdc->pSurfInfo = NULL;
-
-    if (defaultDCstate == NULL)
-    {
-        defaultDCstate = ExAllocatePoolWithTag(PagedPool, sizeof(DC), TAG_DC);
-        ASSERT(defaultDCstate);
-        RtlZeroMemory(defaultDCstate, sizeof(DC));
-        defaultDCstate->pdcattr = &defaultDCstate->dcattr;
-        DC_vCopyState(pdc, defaultDCstate, TRUE);
-    }
 }
 
 VOID
@@ -631,7 +639,7 @@ GreOpenDCW(
 
     DPRINT("GreOpenDCW - ppdev = %p\n", ppdev);
 
-    pdc = DC_AllocDcWithHandle();
+    pdc = DC_AllocDcWithHandle(GDILoObjType_LO_DC_TYPE);
     if (!pdc)
     {
         DPRINT1("Could not Allocate a DC\n");
@@ -755,8 +763,9 @@ NtGdiOpenDCW(
 
 HDC
 APIENTRY
-NtGdiCreateCompatibleDC(HDC hdc)
+GreCreateCompatibleDC(HDC hdc, BOOL bAltDc)
 {
+    GDILOOBJTYPE eDcObjType;
     HDC hdcNew;
     PPDEVOBJ ppdev;
     PDC pdc, pdcNew;
@@ -794,7 +803,8 @@ NtGdiCreateCompatibleDC(HDC hdc)
     }
 
     /* Allocate a new DC */
-    pdcNew = DC_AllocDcWithHandle();
+    eDcObjType = bAltDc ? GDILoObjType_LO_ALTDC_TYPE : GDILoObjType_LO_DC_TYPE;
+    pdcNew = DC_AllocDcWithHandle(eDcObjType);
     if (!pdcNew)
     {
         DPRINT1("Could not allocate a new DC\n");
@@ -804,7 +814,7 @@ NtGdiCreateCompatibleDC(HDC hdc)
     hdcNew = pdcNew->BaseObject.hHmgr;
 
     /* Lock ppdev and initialize the new DC */
-    DC_vInitDc(pdcNew, DCTYPE_MEMORY, ppdev);
+    DC_vInitDc(pdcNew, bAltDc ? DCTYPE_INFO : DCTYPE_MEMORY, ppdev);
     /* FIXME: HACK! */
     DC_InitHack(pdcNew);
 
@@ -818,6 +828,14 @@ NtGdiCreateCompatibleDC(HDC hdc)
     return hdcNew;
 }
 
+HDC
+APIENTRY
+NtGdiCreateCompatibleDC(HDC hdc)
+{
+    /* Call the internal function to create a normal memory DC */
+    return GreCreateCompatibleDC(hdc, FALSE);
+}
+
 BOOL
 FASTCALL
 IntGdiDeleteDC(HDC hDC, BOOL Force)
index 38ad481..f3da811 100644 (file)
@@ -262,7 +262,7 @@ NtGdiSaveDC(
     }
 
     /* Allocate a new dc */
-    pdcSave = DC_AllocDcWithHandle();
+    pdcSave = DC_AllocDcWithHandle(GDILoObjType_LO_DC_TYPE);
     if (pdcSave == NULL)
     {
         DPRINT("Could not allocate a new DC\n");
index bf0f30e..6dafea7 100644 (file)
@@ -34,23 +34,8 @@ HDC
 APIENTRY
 NtGdiCreateMetafileDC(IN HDC hdc)
 {
-   PDC pDc;
-   HDC ret = NULL;
-
-   if (hdc)
-   {
-      pDc = DC_LockDc(hdc);
-      if (pDc)
-      { // Not sure this is right for getting the HDEV handle, maybe Timo could help or just if'ed it out.
-         ret = IntGdiCreateDisplayDC(pDc->ppdev->BaseObject.hHmgr, DC_TYPE_INFO, TRUE);
-         DC_UnlockDc(pDc);
-      }
-   }
-   else
-   {
-       ret = UserGetDesktopDC(DC_TYPE_INFO, TRUE, FALSE);
-   }
-   return ret;
+    /* Call the internal function to create an alternative info DC */
+    return GreCreateCompatibleDC(hdc, TRUE);
 }
 
 /*
@@ -68,7 +53,7 @@ NtGdiCreateServerMetaFile(IN DWORD iType,
     UNIMPLEMENTED;
     return NULL;
 }
+
 /*
  * @unimplemented
  */