[ros-diffs] [fireball] 42097: - Swap szWnd/szVport/ptWndOrg/ptVportOrg to two rectangles: Vport one, and DC one. The DC one is relative to the Vport one. - Set both DC and Vport rectangles from the winent driver. Setting them back to fullscreen is not supported now, but since only their origins (top, left) are used now - it's ok. - Offset all graphic operations by the Vport offset too. Now graphics is displayed at correct places inside windows, including text output too. - Silence font.c debug prints. - Add inlined functions for RECTL management (set, offset, check for emptyness) from the trunk's win32k.

fireball at svn.reactos.org fireball at svn.reactos.org
Mon Jul 20 15:33:16 CEST 2009


Author: fireball
Date: Mon Jul 20 15:33:16 2009
New Revision: 42097

URL: http://svn.reactos.org/svn/reactos?rev=42097&view=rev
Log:
- Swap szWnd/szVport/ptWndOrg/ptVportOrg to two rectangles: Vport one, and DC one. The DC one is relative to the Vport one.
- Set both DC and Vport rectangles from the winent driver. Setting them back to fullscreen is not supported now, but since only their origins (top,left) are used now - it's ok.
- Offset all graphic operations by the Vport offset too. Now graphics is displayed at correct places inside windows, including text output too.
- Silence font.c debug prints.
- Add inlined functions for RECTL management (set, offset, check for emptyness) from the trunk's win32k.

Modified:
    branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
    branches/arwinss/reactos/include/psdk/ntrosgdi.h
    branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
    branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c
    branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
    branches/arwinss/reactos/subsystems/win32/win32k/include/dc.h
    branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
    branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db

Modified: branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/dll/win32/winent.drv/gdidrv.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -191,7 +191,6 @@
 INT CDECL RosDrv_ExtEscape( NTDRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID in_data,
                             INT out_count, LPVOID out_data )
 {
-    RECT dc_rect;
     switch(escape)
     {
     case NTDRV_ESCAPE:
@@ -203,14 +202,9 @@
                 if (in_count >= sizeof(struct ntdrv_escape_set_drawable))
                 {
                     const struct ntdrv_escape_set_drawable *data = in_data;
-                    dc_rect = data->dc_rect;
-                    RosGdiSetDcRect(physDev->hKernelDC, &dc_rect);
-                    //physDev->dc_rect = data->dc_rect;
-                    //physDev->drawable = data->drawable;
-                    //physDev->drawable_rect = data->drawable_rect;
-                    //TRACE( "SET_DRAWABLE hdc %p drawable %lx gl_drawable %lx pf %u dc_rect %s drawable_rect %s\n",
-                    //       physDev->hdc, physDev->drawable, physDev->gl_drawable, physDev->current_pf,
-                    //       wine_dbgstr_rect(&physDev->dc_rect), wine_dbgstr_rect(&physDev->drawable_rect) );
+                    RosGdiSetDcRects(physDev->hKernelDC, &data->dc_rect, &data->drawable_rect);
+                    TRACE( "SET_DRAWABLE hdc %p dc_rect %s drawable_rect %s\n",
+                           physDev->hUserDC, wine_dbgstr_rect(&data->dc_rect), wine_dbgstr_rect(&data->drawable_rect) );
                     return TRUE;
                 }
                 break;

Modified: branches/arwinss/reactos/include/psdk/ntrosgdi.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/include/psdk/ntrosgdi.h?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/include/psdk/ntrosgdi.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/include/psdk/ntrosgdi.h [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -116,7 +116,7 @@
                                    int iPixelFormat,
                                    const PIXELFORMATDESCRIPTOR *ppfd);
 COLORREF APIENTRY RosGdiSetTextColor( HDC physDev, COLORREF color );
-VOID APIENTRY RosGdiSetDcRect( HDC physDev, RECT *rcDcRect );
+VOID APIENTRY RosGdiSetDcRects( HDC physDev, RECT *rcDcRect, RECT *rcVport );
 
 /* enum.c */
 int APIENTRY RosGdiChoosePixelFormat(HDC physDev,

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/dc.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -113,22 +113,33 @@
     /* Check if it's a compatible DC */
     if (*pdev)
     {
-        DPRINT1("Creating a compatible with %x DC\n", *pdev);
-        slSize.cx = 1; slSize.cy = 1;
-        hStockBitmap = GreCreateBitmap(slSize, 1, 1, 0, NULL);
-        pNewDC->pBitmap = GDI_GetObjPtr(hStockBitmap, (SHORT)GDI_OBJECT_TYPE_BITMAP);
-    }
-    else if (dc->dwType == OBJ_MEMDC)
+        DPRINT1("Creating a compatible with %x DC!\n", *pdev);
+    }
+
+    if (dc->dwType == OBJ_MEMDC)
     {
         DPRINT1("Creating a memory DC %x\n", hNewDC);
         slSize.cx = 1; slSize.cy = 1;
         hStockBitmap = GreCreateBitmap(slSize, 1, 1, 0, NULL);
         pNewDC->pBitmap = GDI_GetObjPtr(hStockBitmap, (SHORT)GDI_OBJECT_TYPE_BITMAP);
+
+        /* Set DC rectangles */
+        pNewDC->rcDcRect.left = 0; pNewDC->rcDcRect.top = 0;
+        pNewDC->rcDcRect.right = 1; pNewDC->rcDcRect.bottom = 1;
+        pNewDC->rcVport = pNewDC->rcDcRect;
     }
     else
     {
         DPRINT1("Creating a display DC %x\n", hNewDC);
         pNewDC->pBitmap = GDI_GetObjPtr(PrimarySurface.pSurface, (SHORT)GDI_OBJECT_TYPE_BITMAP);
+
+        /* Set DC rectangles */
+        pNewDC->rcVport.left = 0;
+        pNewDC->rcVport.top = 0;
+        pNewDC->rcVport.right = PrimarySurface.GDIInfo.ulHorzRes;
+        pNewDC->rcVport.bottom = PrimarySurface.GDIInfo.ulVertRes;
+
+        pNewDC->rcDcRect = pNewDC->rcVport;
     }
 
     /* Give handle to the caller */
@@ -187,6 +198,13 @@
 
     /* Select it */
     pDC->pBitmap = pSurface;
+
+    /* Set DC rectangles */
+    pDC->rcVport.left = 0;
+    pDC->rcVport.top = 0;
+    pDC->rcVport.right = pSurface->SurfObj.sizlBitmap.cx;
+    pDC->rcVport.bottom = pSurface->SurfObj.sizlBitmap.cy;
+    pDC->rcDcRect = pDC->rcVport;
 
     /* Release the DC object */
     GDI_ReleaseObj(physDev);
@@ -379,7 +397,7 @@
     return color;
 }
 
-VOID APIENTRY RosGdiSetDcRect( HDC physDev, RECT *rcDcRect )
+VOID APIENTRY RosGdiSetDcRects( HDC physDev, RECT *rcDcRect, RECT *rcVport )
 {
     PDC pDC;
 
@@ -387,19 +405,23 @@
     pDC = GDI_GetObjPtr(physDev, (SHORT)GDI_OBJECT_TYPE_DC);
 
     /* Set DC rectangle */
-    if (rcDcRect->left && rcDcRect->top && rcDcRect->right && rcDcRect->bottom)
+    if (rcDcRect)
     {
         pDC->rcDcRect = *rcDcRect;
-    }
-    else
-    {
+
+#if 0
         /* Set back to full screen */
         pDC->rcDcRect.top = 0;
         pDC->rcDcRect.left = 0;
         pDC->rcDcRect.right = pDC->szVportExt.cx;
         pDC->rcDcRect.top = pDC->szVportExt.cy;
-
-        DPRINT1("right/top %d %d\n", pDC->szVportExt.cx, pDC->szVportExt.cy);
+#endif
+    }
+
+    /* Set viewport rectangle */
+    if (rcVport)
+    {
+        pDC->rcVport = *rcVport;
     }
 
     /* Release the object */

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gdi/misc.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -88,10 +88,10 @@
     pt[1].x = x2; pt[1].y = y2;
 
     /* Add DC origin */
-    pt[0].x += pDC->ptVportOrg.x + pDC->rcDcRect.left;
-    pt[0].y += pDC->ptVportOrg.y + pDC->rcDcRect.top;
-    pt[1].x += pDC->ptVportOrg.x + pDC->rcDcRect.left;
-    pt[1].y += pDC->ptVportOrg.y + pDC->rcDcRect.top;
+    pt[0].x += pDC->rcVport.left + pDC->rcDcRect.left;
+    pt[0].y += pDC->rcVport.top + pDC->rcDcRect.top;
+    pt[1].x += pDC->rcVport.left + pDC->rcDcRect.left;
+    pt[1].y += pDC->rcVport.top + pDC->rcDcRect.top;
 
     GreLineTo(&pDC->pBitmap->SurfObj,
               pClipObj,

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/bitblt.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -172,10 +172,10 @@
     // FIXME: LP->DP missing!
     //IntLPtoDP(pDest, (LPPOINT)&DestRect, 2);
 
-    DestRect.left += pDest->ptVportOrg.x + pDest->rcDcRect.left;
-    DestRect.top += pDest->ptVportOrg.y + pDest->rcDcRect.top;
-    DestRect.right += pDest->ptVportOrg.x + pDest->rcDcRect.left;
-    DestRect.bottom += pDest->ptVportOrg.y + pDest->rcDcRect.top;
+    DestRect.left += pDest->rcVport.left + pDest->rcDcRect.left;
+    DestRect.top += pDest->rcVport.top + pDest->rcDcRect.top;
+    DestRect.right += pDest->rcVport.left + pDest->rcDcRect.left;
+    DestRect.bottom += pDest->rcVport.top + pDest->rcDcRect.top;
 
     SourcePoint.x = XSrc;
     SourcePoint.y = YSrc;
@@ -238,11 +238,10 @@
             DestRect.bottom = YLeft + 1;
         }
 
-        //IntLPtoDP(pDC, (LPPOINT)&DestRect, 2);
-        DestRect.left += pDC->ptVportOrg.x + pDC->rcDcRect.left;
-        DestRect.top += pDC->ptVportOrg.y + pDC->rcDcRect.top;
-        DestRect.right += pDC->ptVportOrg.x + pDC->rcDcRect.left;
-        DestRect.bottom += pDC->ptVportOrg.y + pDC->rcDcRect.top;
+        DestRect.left += pDC->rcVport.left + pDC->rcDcRect.left;
+        DestRect.top += pDC->rcVport.top + pDC->rcDcRect.top;
+        DestRect.right += pDC->rcVport.left + pDC->rcDcRect.left;
+        DestRect.bottom += pDC->rcVport.top + pDC->rcDcRect.top;
 
         //BrushOrigin.x = BrushObj->ptOrigin.x + pDC->ptVportOrg.x;
         //BrushOrigin.y = BrushObj->ptOrigin.y + pDC->ptVportOrg.y;
@@ -300,12 +299,12 @@
     DestRect.top    = YOriginDest;
     DestRect.right  = XOriginDest+WidthDest;
     DestRect.bottom = YOriginDest+HeightDest;
-    IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2);
-
-    DestRect.left   += DCDest->ptVportOrg.x + DCDest->rcDcRect.left;
-    DestRect.top    += DCDest->ptVportOrg.y + DCDest->rcDcRect.top;
-    DestRect.right  += DCDest->ptVportOrg.x + DCDest->rcDcRect.left;
-    DestRect.bottom += DCDest->ptVportOrg.y + DCDest->rcDcRect.top;
+    IntLPtoDP(DCDest, (LPPOINT)&DestRect, 2); // FIXME: Why?
+
+    DestRect.left   += DCDest->rcVport.left + DCDest->rcDcRect.left;
+    DestRect.top    += DCDest->rcVport.top + DCDest->rcDcRect.top;
+    DestRect.right  += DCDest->rcVport.left + DCDest->rcDcRect.left;
+    DestRect.bottom += DCDest->rcVport.top + DCDest->rcDcRect.top;
 
     SourceRect.left   = XOriginSrc;
     SourceRect.top    = YOriginSrc;
@@ -316,10 +315,10 @@
     {
         IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2);
 
-        SourceRect.left   += DCSrc->ptVportOrg.x + DCSrc->rcDcRect.left;
-        SourceRect.top    += DCSrc->ptVportOrg.y + DCSrc->rcDcRect.top;
-        SourceRect.right  += DCSrc->ptVportOrg.x + DCSrc->rcDcRect.left;
-        SourceRect.bottom += DCSrc->ptVportOrg.y + DCSrc->rcDcRect.top;
+        SourceRect.left   += DCSrc->rcVport.left + DCSrc->rcDcRect.left;
+        SourceRect.top    += DCSrc->rcVport.top + DCSrc->rcDcRect.top;
+        SourceRect.right  += DCSrc->rcVport.left + DCSrc->rcDcRect.left;
+        SourceRect.bottom += DCSrc->rcVport.top + DCSrc->rcDcRect.top;
     }
 
     BrushOrigin.x = 0;
@@ -348,8 +347,8 @@
     }
 
     /* Offset the brush */
-    BrushOrigin.x += DCDest->ptVportOrg.x + DCDest->rcDcRect.left;
-    BrushOrigin.y += DCDest->ptVportOrg.y + DCDest->rcDcRect.top;
+    BrushOrigin.x += DCDest->rcVport.left + DCDest->rcDcRect.left;
+    BrushOrigin.y += DCDest->rcVport.top + DCDest->rcDcRect.top;
 
     /* Make mask surface for source surface */
     if (BitmapSrc && DCMask)

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/font.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -9,7 +9,7 @@
 /* INCLUDES ******************************************************************/
 
 #include <win32k.h>
-//#define NDEBUG
+#define NDEBUG
 #include <debug.h>
 
 /* PRIVATE FUNCTIONS *********************************************************/
@@ -59,10 +59,14 @@
                 } while (bits & bitsMask);
                 rcBounds.left = xspan; rcBounds.top = y;
                 rcBounds.right = xspan+lenspan; rcBounds.bottom = y+1;
+                RECTL_vOffsetRect(&rcBounds, physDev->rcVport.left, physDev->rcVport.top);
                 GreLineTo(&physDev->pBitmap->SurfObj,
                     NULL,
                     &physDev->pLineBrush->BrushObj,
-                    xspan, y, xspan+lenspan, y,
+                    xspan + physDev->rcVport.left,
+                    y + physDev->rcVport.top,
+                    xspan + lenspan + physDev->rcVport.left,
+                    y + physDev->rcVport.top,
                     &rcBounds,
                     0);
                 xspan += lenspan;

Modified: branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/gre/rect.c [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -152,17 +152,6 @@
     }
 }
 
-
-VOID
-NTAPI
-RECTL_vSetEmptyRect(RECTL *prcl)
-{
-    prcl->left = 0;
-    prcl->top = 0;
-    prcl->right = 0;
-    prcl->bottom = 0;
-}
-
 BOOLEAN
 NTAPI
 RECTL_bIntersectRect(RECTL* prclDst, const RECTL* prcl1, const RECTL* prcl2)

Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/dc.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/dc.h?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/dc.h [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -17,11 +17,8 @@
     COLORREF     crBackgroundClr;
 
     /* Origins and extents */
-    SIZE  szVportExt;
-    POINT ptVportOrg;
-    SIZE  szWndExt;
-    POINT ptWndOrg;
-    RECT rcDcRect;
+    RECT rcDcRect; /* Relative to Vport */
+    RECT rcVport;
 
     /* Combined clipping region */
     CLIPOBJ *CombinedClip;

Modified: branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/include/gre.h [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -98,11 +98,53 @@
            const POINT *ptPoints,
            INT count);
 
-VOID NTAPI
-RECTL_vSetEmptyRect(RECTL *prcl);
-
 BOOLEAN NTAPI
 RECTL_bIntersectRect(RECTL* prclDst, const RECTL* prcl1, const RECTL* prcl2);
+
+VOID
+FORCEINLINE
+RECTL_vSetRect(RECTL *prcl, LONG left, LONG top, LONG right, LONG bottom)
+{
+    prcl->left = left;
+    prcl->top = top;
+    prcl->right = right;
+    prcl->bottom = bottom;
+}
+
+VOID
+FORCEINLINE
+RECTL_vSetEmptyRect(RECTL *prcl)
+{
+    prcl->left = 0;
+    prcl->top = 0;
+    prcl->right = 0;
+    prcl->bottom = 0;
+}
+
+VOID
+FORCEINLINE
+RECTL_vOffsetRect(RECTL *prcl, INT cx, INT cy)
+{
+    prcl->left += cx;
+    prcl->right += cx;
+    prcl->top += cy;
+    prcl->bottom += cy;
+}
+
+BOOL
+FORCEINLINE
+RECTL_bIsEmptyRect(const RECTL *prcl)
+{
+    return (prcl->left >= prcl->right || prcl->top >= prcl->bottom);
+}
+
+BOOL
+FORCEINLINE
+RECTL_bPointInRect(const RECTL *prcl, INT x, INT y)
+{
+    return (x >= prcl->left && x <= prcl->right &&
+            y >= prcl->top  && y <= prcl->bottom);
+}
 
 /* Private Eng functions */
 BOOL APIENTRY

Modified: branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db?rev=42097&r1=42096&r2=42097&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/w32ksvc.db [iso-8859-1] Mon Jul 20 15:33:16 2009
@@ -30,7 +30,7 @@
 RosGdiSetPixel                     4
 RosGdiSetPixelFormat               3
 RosGdiSetTextColor                 2
-RosGdiSetDcRect                    2
+RosGdiSetDcRects                   3
 RosGdiChoosePixelFormat            2
 RosGdiDescribePixelFormat          4
 RosGdiEnumDeviceFonts              4



More information about the Ros-diffs mailing list