Author: tkreuzer
Date: Fri Oct 26 03:10:50 2007
New Revision: 29890
URL: 
http://svn.reactos.org/svn/reactos?rev=29890&view=rev
Log:
UserScrollDC:
- rename rcScroll to rcClip
- simplify calculation of source point
- fix calculation of invalidated region
Modified:
    trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/painting.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/nt…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/painting.c (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/painting.c Fri Oct 26 03:10:50 2007
@@ -1131,40 +1131,31 @@
              const RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate)
 {
    PDC pDC;
-   RECT rcScroll, rcSrc, rcDst;
-   SIZE szSrcOrg;
+   RECT rcClip, rcSrc, rcDst;
    INT Result;
-   IntGdiGetClipBox(hDC, &rcScroll);
+   IntGdiGetClipBox(hDC, &rcClip);
    if (prcClip)
    {
-      IntGdiIntersectRect(&rcScroll, &rcScroll, prcClip);
+      IntGdiIntersectRect(&rcClip, &rcClip, prcClip);
    }
    if (prcScroll)
    {
-      IntGdiIntersectRect(&rcSrc, &rcScroll, prcScroll);
+      IntGdiIntersectRect(&rcSrc, &rcClip, prcScroll);
    }
    else
    {
-      rcSrc = rcScroll;
+      rcSrc = rcClip;
    }
    rcDst = rcSrc;
    IntGdiOffsetRect(&rcDst, dx, dy);
-   if (rcDst.left < rcScroll.left)
-       szSrcOrg.cx = rcScroll.left - rcDst.left;
-   else
-       szSrcOrg.cx = 0;
-   if (rcDst.top < rcScroll.top)
-       szSrcOrg.cy = rcScroll.top - rcDst.top;
-   else
-       szSrcOrg.cy = 0;
-   IntGdiIntersectRect(&rcDst, &rcDst, &rcScroll);
+   IntGdiIntersectRect(&rcDst, &rcDst, &rcClip);
    if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top,
                     rcDst.right - rcDst.left, rcDst.bottom - rcDst.top,
-                    hDC, rcSrc.left + szSrcOrg.cx, rcSrc.top + szSrcOrg.cy, SRCCOPY, 0,
0))
+                    hDC, rcDst.left - dx, rcDst.top - dy, SRCCOPY, 0, 0))
    {
       return ERROR;
    }
@@ -1173,7 +1164,7 @@
       could not be copied, because it was not visible */
    if (hrgnUpdate || prcUpdate)
    {
-      HRGN hrgnOwn, hrgnVisible, hrgnDst;
+      HRGN hrgnOwn, hrgnVisible, hrgnTmp;
       pDC = DC_LockDc(hDC);
       if (!pDC)
@@ -1183,24 +1174,34 @@
       hrgnVisible = pDC->w.hVisRgn;  // pDC->w.hGCClipRgn?
       DC_UnlockDc(pDC);
+      /* Begin with the source rect */
       if (hrgnUpdate)
       {
          hrgnOwn = hrgnUpdate;
-         if (!NtGdiSetRectRgn(hrgnOwn, rcScroll.left, rcScroll.top, rcScroll.right,
rcScroll.bottom))
+         if (!NtGdiSetRectRgn(hrgnOwn, rcSrc.left, rcSrc.top, rcSrc.right, rcSrc.bottom))
          {
             return ERROR;
          }
       }
       else
       {
-         hrgnOwn = UnsafeIntCreateRectRgnIndirect(&rcScroll);
-      }
-
-      hrgnDst = UnsafeIntCreateRectRgnIndirect(&rcSrc);
-      NtGdiCombineRgn(hrgnDst, hrgnDst, hrgnVisible, RGN_AND);
-      NtGdiOffsetRgn(hrgnDst, dx, dy);
-      Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnDst, RGN_DIFF);
-      NtGdiDeleteObject(hrgnDst);
+         hrgnOwn = UnsafeIntCreateRectRgnIndirect(&rcSrc);
+      }
+
+      /* Substract the dest rect */
+      hrgnTmp = UnsafeIntCreateRectRgnIndirect(&rcDst);
+      NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF);
+
+      /* Add the part of the dest that wasn't visible in source */
+      NtGdiSetRectRgn(hrgnTmp, rcSrc.left, rcSrc.top, rcSrc.right, rcSrc.bottom);
+      Result = NtGdiCombineRgn(hrgnTmp, hrgnTmp, hrgnVisible, RGN_DIFF);
+      if (Result != NULLREGION && Result != ERROR)
+      {
+         NtGdiOffsetRgn(hrgnTmp, dx, dy);
+         NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_OR);
+      }
+
+      NtGdiDeleteObject(hrgnTmp);
       if (prcUpdate)
       {