[WIN32K]
[reactos.git] / reactos / win32ss / gdi / eng / pdevobj.c
index b13963e..5402a84 100644 (file)
@@ -136,6 +136,7 @@ PDEVOBJ_bEnablePDEV(
     PWSTR pwszLogAddress)
 {
     PFN_DrvEnablePDEV pfnEnablePDEV;
+    ULONG i;
 
     DPRINT("PDEVOBJ_bEnablePDEV()\n");
 
@@ -165,6 +166,13 @@ PDEVOBJ_bEnablePDEV(
     /* Setup Palette */
     ppdev->ppalSurf = PALETTE_ShareLockPalette(ppdev->devinfo.hpalDefault);
 
+    /* Setup hatch brushes */
+    for (i = 0; i < HS_DDI_MAX; i++)
+    {
+        if (ppdev->ahsurf[i] == NULL)
+            ppdev->ahsurf[i] = gahsurfHatch[i];
+    }
+
     DPRINT("PDEVOBJ_bEnablePDEV - dhpdev = %p\n", ppdev->dhpdev);
 
     return TRUE;
@@ -283,14 +291,14 @@ EngpCreatePDEV(
     {
         /* ... use the device's default one */
         pdm = pGraphicsDevice->pDevModeList[pGraphicsDevice->iDefaultMode].pdm;
-        DPRINT("Using iDefaultMode = %ld\n", pGraphicsDevice->iDefaultMode);
+        DPRINT("Using iDefaultMode = %lu\n", pGraphicsDevice->iDefaultMode);
     }
 
     /* Try to get a diplay driver */
     ppdev->pldev = EngLoadImageEx(pdm->dmDeviceName, LDEV_DEVICE_DISPLAY);
     if (!ppdev->pldev)
     {
-        DPRINT1("Could not load display driver '%ls', '%s'\n",
+        DPRINT1("Could not load display driver '%ls', '%ls'\n",
                 pGraphicsDevice->pDiplayDrivers,
                 pdm->dmDeviceName);
         ExFreePoolWithTag(ppdev, GDITAG_PDEV);
@@ -333,52 +341,68 @@ EngpCreatePDEV(
     return ppdev;
 }
 
+VOID
+FORCEINLINE
+SwitchPointer(
+    _Inout_ PVOID pvPointer1,
+    _Inout_ PVOID pvPointer2)
+{
+    PVOID *ppvPointer1 = pvPointer1;
+    PVOID *ppvPointer2 = pvPointer2;
+    PVOID pvTemp;
+
+    pvTemp = *ppvPointer1;
+    *ppvPointer1 = *ppvPointer2;
+    *ppvPointer2 = pvTemp;
+}
+
 VOID
 NTAPI
 PDEVOBJ_vSwitchPdev(
     PPDEVOBJ ppdev,
     PPDEVOBJ ppdev2)
 {
-    PDEVOBJ pdevTmp;
-    DWORD tmpStateFlags;
-
-    /* Exchange data */
-    pdevTmp = *ppdev;
+    union
+    {
+        DRIVER_FUNCTIONS pfn;
+        GDIINFO gdiinfo;
+        DEVINFO devinfo;
+        DWORD StateFlags;
+    } temp;
 
     /* Exchange driver functions */
+    temp.pfn = ppdev->pfn;
     ppdev->pfn = ppdev2->pfn;
-    ppdev2->pfn = pdevTmp.pfn;
+    ppdev2->pfn = temp.pfn;
 
     /* Exchange LDEVs */
-    ppdev->pldev = ppdev2->pldev;
-    ppdev2->pldev = pdevTmp.pldev;
+    SwitchPointer(&ppdev->pldev, &ppdev2->pldev);
 
     /* Exchange DHPDEV */
-    ppdev->dhpdev = ppdev2->dhpdev;
-    ppdev2->dhpdev = pdevTmp.dhpdev;
+    SwitchPointer(&ppdev->dhpdev, &ppdev2->dhpdev);
 
     /* Exchange surfaces and associate them with their new PDEV */
-    ppdev->pSurface = ppdev2->pSurface;
-    ppdev2->pSurface = pdevTmp.pSurface;
+    SwitchPointer(&ppdev->pSurface, &ppdev2->pSurface);
     ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev;
     ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2;
 
     /* Exchange devinfo */
+    temp.devinfo = ppdev->devinfo;
     ppdev->devinfo = ppdev2->devinfo;
-    ppdev2->devinfo = pdevTmp.devinfo;
+    ppdev2->devinfo = temp.devinfo;
 
     /* Exchange gdiinfo */
+    temp.gdiinfo = ppdev->gdiinfo;
     ppdev->gdiinfo = ppdev2->gdiinfo;
-    ppdev2->gdiinfo = pdevTmp.gdiinfo;
+    ppdev2->gdiinfo = temp.gdiinfo;
 
     /* Exchange DEVMODE */
-    ppdev->pdmwDev = ppdev2->pdmwDev;
-    ppdev2->pdmwDev = pdevTmp.pdmwDev;
+    SwitchPointer(&ppdev->pdmwDev, &ppdev2->pdmwDev);
 
     /* Exchange state flags */
-    tmpStateFlags = ppdev->pGraphicsDevice->StateFlags;
+    temp.StateFlags = ppdev->pGraphicsDevice->StateFlags;
     ppdev->pGraphicsDevice->StateFlags = ppdev2->pGraphicsDevice->StateFlags;
-    ppdev2->pGraphicsDevice->StateFlags = tmpStateFlags;
+    ppdev2->pGraphicsDevice->StateFlags = temp.StateFlags;
 
     /* Notify each driver instance of its new HDEV association */
     ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev);
@@ -399,6 +423,7 @@ PDEVOBJ_bSwitchMode(
 
     /* Lock the PDEV */
     EngAcquireSemaphore(ppdev->hsemDevLock);
+
     /* And everything else */
     EngAcquireSemaphore(ghsemPDEV);
 
@@ -464,7 +489,7 @@ leave:
 PPDEVOBJ
 NTAPI
 EngpGetPDEV(
-    PUNICODE_STRING pustrDeviceName)
+    _In_opt_ PUNICODE_STRING pustrDeviceName)
 {
     UNICODE_STRING ustrCurrent;
     PPDEVOBJ ppdev;
@@ -473,37 +498,39 @@ EngpGetPDEV(
     /* Acquire PDEV lock */
     EngAcquireSemaphore(ghsemPDEV);
 
-    /* If no device name is given, ... */
-    if (!pustrDeviceName && gppdevPrimary)
+    /* Did the caller pass a device name? */
+    if (pustrDeviceName)
     {
-        /* ... use the primary PDEV */
-        ppdev = gppdevPrimary;
+        /* Loop all present PDEVs */
+        for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
+        {
+            /* Get a pointer to the GRAPHICS_DEVICE */
+            pGraphicsDevice = ppdev->pGraphicsDevice;
 
-        /* Reference the pdev */
-        InterlockedIncrement(&ppdev->cPdevRefs);
-        goto leave;
+            /* Compare the name */
+            RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
+            if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
+            {
+                /* Found! */
+                break;
+            }
+        }
     }
-
-    /* Loop all present PDEVs */
-    for (ppdev = gppdevList; ppdev; ppdev = ppdev->ppdevNext)
+    else
     {
-        /* Get a pointer to the GRAPHICS_DEVICE */
-        pGraphicsDevice = ppdev->pGraphicsDevice;
-
-        /* Compare the name */
-        RtlInitUnicodeString(&ustrCurrent, pGraphicsDevice->szWinDeviceName);
-        if (RtlEqualUnicodeString(pustrDeviceName, &ustrCurrent, FALSE))
-        {
-            /* Found! Reference the PDEV */
-            InterlockedIncrement(&ppdev->cPdevRefs);
-            break;
-        }
+        /* Otherwise use the primary PDEV */
+        ppdev = gppdevPrimary;
     }
 
     /* Did we find one? */
-    if (!ppdev)
+    if (ppdev)
     {
-        /* No, create a new PDEV */
+        /* Yes, reference the PDEV */
+        InterlockedIncrement(&ppdev->cPdevRefs);
+    }
+    else
+    {
+        /* No, create a new PDEV for the given device */
         ppdev = EngpCreatePDEV(pustrDeviceName, NULL);
         if (ppdev)
         {
@@ -520,7 +547,6 @@ EngpGetPDEV(
         }
     }
 
-leave:
     /* Release PDEV lock */
     EngReleaseSemaphore(ghsemPDEV);
 
@@ -604,23 +630,19 @@ PDEVOBJ_vGetDeviceCaps(
 
 /** Exported functions ********************************************************/
 
+_Must_inspect_result_ _Ret_z_
 LPWSTR
 APIENTRY
-EngGetDriverName(IN HDEV hdev)
+EngGetDriverName(_In_ HDEV hdev)
 {
     PPDEVOBJ ppdev = (PPDEVOBJ)hdev;
-    PLDEVOBJ pldev;
 
-    if (!hdev)
-        return NULL;
+    ASSERT(ppdev);
+    ASSERT(ppdev->pldev);
+    ASSERT(ppdev->pldev->pGdiDriverInfo);
+    ASSERT(ppdev->pldev->pGdiDriverInfo->DriverName.Buffer);
 
-    pldev = ppdev->pldev;
-    ASSERT(pldev);
-
-    if (!pldev->pGdiDriverInfo)
-        return NULL;
-
-    return pldev->pGdiDriverInfo->DriverName.Buffer;
+    return ppdev->pldev->pGdiDriverInfo->DriverName.Buffer;
 }
 
 
@@ -772,7 +794,7 @@ NtGdiGetDeviceCaps(
     return 0;
 }
 
-
+_Success_(return!=FALSE)
 BOOL
 APIENTRY
 NtGdiGetDeviceCapsAll(
@@ -832,7 +854,7 @@ NtGdiGetDhpdev(
     for (ppdev = gppdevList;  ppdev; ppdev = ppdev->ppdevNext)
     {
         /* Compare with the given HDEV */
-        if (ppdev == hdev)
+        if (ppdev == (PPDEVOBJ)hdev)
         {
             /* Found the PDEV! Get it's dhpdev and break */
             dhpdev = ppdev->dhpdev;