mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 16:02:56 +00:00
UserScrollDC:
- rename rcScroll to rcClip - simplify calculation of source point - fix calculation of invalidated region svn path=/trunk/; revision=29890
This commit is contained in:
parent
bb72e4c3a3
commit
f95e0ccee8
1 changed files with 25 additions and 24 deletions
|
@ -1131,40 +1131,31 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECT *prcScroll,
|
||||||
const RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate)
|
const RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate)
|
||||||
{
|
{
|
||||||
PDC pDC;
|
PDC pDC;
|
||||||
RECT rcScroll, rcSrc, rcDst;
|
RECT rcClip, rcSrc, rcDst;
|
||||||
SIZE szSrcOrg;
|
|
||||||
INT Result;
|
INT Result;
|
||||||
|
|
||||||
IntGdiGetClipBox(hDC, &rcScroll);
|
IntGdiGetClipBox(hDC, &rcClip);
|
||||||
if (prcClip)
|
if (prcClip)
|
||||||
{
|
{
|
||||||
IntGdiIntersectRect(&rcScroll, &rcScroll, prcClip);
|
IntGdiIntersectRect(&rcClip, &rcClip, prcClip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prcScroll)
|
if (prcScroll)
|
||||||
{
|
{
|
||||||
IntGdiIntersectRect(&rcSrc, &rcScroll, prcScroll);
|
IntGdiIntersectRect(&rcSrc, &rcClip, prcScroll);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rcSrc = rcScroll;
|
rcSrc = rcClip;
|
||||||
}
|
}
|
||||||
|
|
||||||
rcDst = rcSrc;
|
rcDst = rcSrc;
|
||||||
IntGdiOffsetRect(&rcDst, dx, dy);
|
IntGdiOffsetRect(&rcDst, dx, dy);
|
||||||
if (rcDst.left < rcScroll.left)
|
IntGdiIntersectRect(&rcDst, &rcDst, &rcClip);
|
||||||
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);
|
|
||||||
|
|
||||||
if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top,
|
if (!NtGdiBitBlt(hDC, rcDst.left, rcDst.top,
|
||||||
rcDst.right - rcDst.left, rcDst.bottom - 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;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
@ -1173,7 +1164,7 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECT *prcScroll,
|
||||||
could not be copied, because it was not visible */
|
could not be copied, because it was not visible */
|
||||||
if (hrgnUpdate || prcUpdate)
|
if (hrgnUpdate || prcUpdate)
|
||||||
{
|
{
|
||||||
HRGN hrgnOwn, hrgnVisible, hrgnDst;
|
HRGN hrgnOwn, hrgnVisible, hrgnTmp;
|
||||||
|
|
||||||
pDC = DC_LockDc(hDC);
|
pDC = DC_LockDc(hDC);
|
||||||
if (!pDC)
|
if (!pDC)
|
||||||
|
@ -1183,24 +1174,34 @@ UserScrollDC(HDC hDC, INT dx, INT dy, const RECT *prcScroll,
|
||||||
hrgnVisible = pDC->w.hVisRgn; // pDC->w.hGCClipRgn?
|
hrgnVisible = pDC->w.hVisRgn; // pDC->w.hGCClipRgn?
|
||||||
DC_UnlockDc(pDC);
|
DC_UnlockDc(pDC);
|
||||||
|
|
||||||
|
/* Begin with the source rect */
|
||||||
if (hrgnUpdate)
|
if (hrgnUpdate)
|
||||||
{
|
{
|
||||||
hrgnOwn = 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;
|
return ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hrgnOwn = UnsafeIntCreateRectRgnIndirect(&rcScroll);
|
hrgnOwn = UnsafeIntCreateRectRgnIndirect(&rcSrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
hrgnDst = UnsafeIntCreateRectRgnIndirect(&rcSrc);
|
/* Substract the dest rect */
|
||||||
NtGdiCombineRgn(hrgnDst, hrgnDst, hrgnVisible, RGN_AND);
|
hrgnTmp = UnsafeIntCreateRectRgnIndirect(&rcDst);
|
||||||
NtGdiOffsetRgn(hrgnDst, dx, dy);
|
NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnTmp, RGN_DIFF);
|
||||||
Result = NtGdiCombineRgn(hrgnOwn, hrgnOwn, hrgnDst, RGN_DIFF);
|
|
||||||
NtGdiDeleteObject(hrgnDst);
|
/* 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)
|
if (prcUpdate)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue