[Win32k]
authorJames Tabor <james.tabor@reactos.org>
Fri, 2 Apr 2010 11:53:14 +0000 (11:53 +0000)
committerJames Tabor <james.tabor@reactos.org>
Fri, 2 Apr 2010 11:53:14 +0000 (11:53 +0000)
- Implement MakeInfoDC and support functions. Dedicated to Timo.

svn path=/trunk/; revision=46679

reactos/subsystems/win32/win32k/include/dc.h
reactos/subsystems/win32/win32k/include/pdevobj.h
reactos/subsystems/win32/win32k/include/surface.h
reactos/subsystems/win32/win32k/objects/dclife.c
reactos/subsystems/win32/win32k/objects/dcutil.c
reactos/subsystems/win32/win32k/objects/device.c

index b616bdc..48b0e92 100644 (file)
@@ -177,6 +177,8 @@ HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC);
 BOOL FASTCALL IntGdiCleanDC(HDC hDC);
 VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS);
 INT FASTCALL IntGdiGetDeviceCaps(PDC,INT);
+BOOL FASTCALL MakeInfoDC(PDC,BOOL);
+BOOL FASTCALL IntSetDefaultRegion(PDC);
 
 extern PPDEVOBJ pPrimarySurface;
 
@@ -228,6 +230,5 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal)
     pdc->dclevel.ppal = ppal;
 }
 
-BOOL FASTCALL
-IntPrepareDriverIfNeeded(VOID);
+BOOL FASTCALL IntPrepareDriverIfNeeded(VOID);
 extern PDEVOBJ PrimarySurface;
index 4124509..ca0c3fa 100644 (file)
@@ -88,8 +88,8 @@ typedef struct _PDEVOBJ
 //  PVOID                     TypeOneInfo;
     PVOID                     pvGammaRamp;    /* Gamma ramp pointer. */
 //  PVOID                     RemoteTypeOne;
-//  ULONG                     ulHorzRes;
-//  ULONG                     ulVertRes;
+    ULONG                     ulHorzRes;
+    ULONG                     ulVertRes;
 //  PFN_DrvSetPointerShape    pfnDrvSetPointerShape;
 //  PFN_DrvMovePointer        pfnDrvMovePointer;
     PFN_DrvMovePointer        pfnMovePointer;
@@ -107,7 +107,7 @@ typedef struct _PDEVOBJ
 //  HANDLE                    hSpooler;       /* Handle to spooler, if spooler dev driver. */
 //  PVOID                     pDesktopId;
     PGRAPHICS_DEVICE          pGraphicsDevice;
-//  POINTL                    ptlOrigion;
+    POINTL                    ptlOrigion;
     PVOID                     pdmwDev;        /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */
 //  DWORD                     Unknown3;
     FLONG                     DxDd_Flags;     /* DxDD active status flags. */
@@ -141,4 +141,6 @@ typedef struct _PDEVEDD
     EDD_DIRECTDRAW_GLOBAL EDDgpl;
 } PDEVEDD, *PPDEVEDD;
 
+PSIZEL FASTCALL PDEV_sizl(PPDEVOBJ, PSIZEL);
+
 extern ULONG gdwDirectDrawContext;
index 57a5ec2..3fe9054 100644 (file)
@@ -3,6 +3,8 @@
 #include "win32.h"
 #include "gdiobj.h"
 
+#define PDEV_SURFACE              0x80000000
+
 /* GDI surface object */
 typedef struct _SURFACE
 {
index 3837b78..e9f4cf7 100644 (file)
@@ -586,8 +586,59 @@ DC_InitDC(HDC  DCHandle)
     NtGdiSetVirtualResolution(DCHandle, 0, 0, 0, 0);
 }
 
+BOOL
+FASTCALL
+MakeInfoDC(PDC pdc, BOOL bSet)
+{
+    PSURFACE pSurface;
+    SIZEL sizl;
+
+    /* Can not be a display DC. */
+    if (pdc->fs & DC_FLAG_DISPLAY) return FALSE;
+    if (bSet)
+    {
+        if (pdc->fs & DC_FLAG_TEMPINFODC || pdc->dctype == DC_TYPE_DIRECT)
+            return FALSE;
+
+        pSurface = pdc->dclevel.pSurface;
+        pdc->fs |= DC_FLAG_TEMPINFODC;
+        pdc->pSurfInfo = pSurface;
+        pdc->dctype = DC_TYPE_INFO;
+        pdc->dclevel.pSurface = NULL;
+
+        if (PDEV_sizl(pdc->ppdev, &sizl)->cx == pdc->dclevel.sizl.cx &&
+            PDEV_sizl(pdc->ppdev, &sizl)->cy == pdc->dclevel.sizl.cy)
+            return TRUE;
+
+        pdc->dclevel.sizl.cx = PDEV_sizl(pdc->ppdev, &sizl)->cx;
+        pdc->dclevel.sizl.cy = sizl.cy;
+        IntSetDefaultRegion(pdc);
+    }
+    else
+    {
+        if (!(pdc->fs & DC_FLAG_TEMPINFODC) || pdc->dctype != DC_TYPE_INFO)
+            return FALSE;
+
+        pSurface = pdc->pSurfInfo;
+        pdc->fs &= ~DC_FLAG_TEMPINFODC;
+        pdc->dclevel.pSurface = pSurface;
+        pdc->dctype = DC_TYPE_DIRECT;
+        pdc->pSurfInfo = NULL;
+
+        if ( !pSurface ||
+             (pSurface->SurfObj.sizlBitmap.cx == pdc->dclevel.sizl.cx &&
+              pSurface->SurfObj.sizlBitmap.cy == pdc->dclevel.sizl.cy) )
+            return TRUE;
+
+        pdc->dclevel.sizl.cx = pSurface->SurfObj.sizlBitmap.cx;
+        pdc->dclevel.sizl.cy = pSurface->SurfObj.sizlBitmap.cy;
+        IntSetDefaultRegion(pdc);
+    }
+    return TRUE;
+}
+
 /*
-* @unimplemented
+* @implemented
 */
 BOOL
 APIENTRY
@@ -595,7 +646,14 @@ NtGdiMakeInfoDC(
     IN HDC hdc,
     IN BOOL bSet)
 {
-    UNIMPLEMENTED;
+    BOOL Ret;
+    PDC pdc = DC_LockDc(hdc);
+    if (pdc)
+    {
+        Ret = MakeInfoDC(pdc, bSet);
+        DC_UnlockDc(pdc);
+        return Ret;
+    }
     return FALSE;
 }
 
index 9721af3..a8c28ec 100644 (file)
@@ -125,6 +125,71 @@ IntIsPrimarySurface(SURFOBJ *SurfObj)
 }
 #endif
 
+BOOL
+FASTCALL
+IntSetDefaultRegion(PDC pdc)
+{
+    PSURFACE pSurface;
+    PROSRGNDATA prgn;
+    RECTL rclWnd, rclClip;
+
+    IntGdiReleaseRaoRgn(pdc);
+
+    rclWnd.left   = 0;
+    rclWnd.top    = 0;
+    rclWnd.right  = pdc->dclevel.sizl.cx;
+    rclWnd.bottom = pdc->dclevel.sizl.cy;
+    rclClip = rclWnd;
+
+//    EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock);
+    if (pdc->ppdev->flFlags & PDEV_META_DEVICE)
+    {
+        pSurface = pdc->dclevel.pSurface;
+        if (pSurface && pSurface->flFlags & PDEV_SURFACE)
+        {
+            rclClip.left   += pdc->ppdev->ptlOrigion.x;
+            rclClip.top    += pdc->ppdev->ptlOrigion.y;
+            rclClip.right  += pdc->ppdev->ptlOrigion.x;
+            rclClip.bottom += pdc->ppdev->ptlOrigion.y;
+        }
+    }
+//    EngReleaseSemaphore(pdc->ppdev->hsemDevLock);
+
+    prgn = pdc->prgnVis;
+
+    if (prgn && prgn != prgnDefault)
+    {
+        REGION_SetRectRgn( prgn,
+                           rclClip.left,
+                           rclClip.top,
+                           rclClip.right ,
+                           rclClip.bottom );
+    }
+    else
+    {
+        prgn = IntSysCreateRectpRgn( rclClip.left,
+                                     rclClip.top,
+                                     rclClip.right ,
+                                     rclClip.bottom );
+        pdc->prgnVis = prgn;
+    }
+
+    if (prgn)
+    {
+        pdc->ptlDCOrig.x = 0;
+        pdc->ptlDCOrig.y = 0;
+        pdc->erclWindow = rclWnd;
+        pdc->erclClip = rclClip;
+        /* Might be an InitDC or DCE....*/
+        pdc->ptlFillOrigin.x = pdc->dcattr.VisRectRegion.Rect.right;
+        pdc->ptlFillOrigin.y = pdc->dcattr.VisRectRegion.Rect.bottom;
+        return TRUE;
+    }
+
+    pdc->prgnVis = prgnDefault;
+    return FALSE;
+}
+
 
 BOOL APIENTRY
 NtGdiCancelDC(HDC  hDC)
index 40a7956..b115847 100644 (file)
@@ -19,6 +19,22 @@ static KEVENT VideoDriverNeedsPreparation;
 static KEVENT VideoDriverPrepared;
 PDC defaultDCstate = NULL;
 
+PSIZEL
+FASTCALL
+PDEV_sizl(PPDEVOBJ ppdev, PSIZEL psizl)
+{
+    if (ppdev->flFlags & PDEV_META_DEVICE)
+    {
+        psizl->cx = ppdev->ulHorzRes;
+        psizl->cy = ppdev->ulVertRes;
+    }
+    else
+    {
+        psizl->cx = ppdev->gdiinfo.ulHorzRes;
+        psizl->cy = ppdev->gdiinfo.ulVertRes;
+    }
+    return psizl;
+}
 
 NTSTATUS FASTCALL
 InitDcImpl(VOID)