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)
{