mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[WIN32K] Implement RECTL_bClipRectBySize() and use it in IntEngBitBlt() to clip the target rect against the bounds of the target surface. Also clip the source rect against the source surface. Fixes remaining part of CORE-14463
This commit is contained in:
parent
79ad68ddc3
commit
2170901e6a
3 changed files with 45 additions and 10 deletions
|
@ -619,20 +619,26 @@ IntEngBitBlt(
|
||||||
BOOL bResult;
|
BOOL bResult;
|
||||||
RECTL rclClipped;
|
RECTL rclClipped;
|
||||||
RECTL rclSrc;
|
RECTL rclSrc;
|
||||||
|
RECTL rclSrcClipped;
|
||||||
POINTL ptlBrush;
|
POINTL ptlBrush;
|
||||||
PFN_DrvBitBlt pfnBitBlt;
|
PFN_DrvBitBlt pfnBitBlt;
|
||||||
|
|
||||||
|
/* Sanity checks */
|
||||||
|
ASSERT(IS_VALID_ROP4(Rop4));
|
||||||
ASSERT(psoTrg);
|
ASSERT(psoTrg);
|
||||||
|
|
||||||
psurfTrg = CONTAINING_RECORD(psoTrg, SURFACE, SurfObj);
|
psurfTrg = CONTAINING_RECORD(psoTrg, SURFACE, SurfObj);
|
||||||
|
|
||||||
/* FIXME: Should we really allow to pass non-well-ordered rects? */
|
/* Get the target rect and make it well ordered */
|
||||||
rclClipped = *prclTrg;
|
rclClipped = *prclTrg;
|
||||||
RECTL_vMakeWellOrdered(&rclClipped);
|
RECTL_vMakeWellOrdered(&rclClipped);
|
||||||
|
|
||||||
//DPRINT1("Rop4 : 0x%08x\n", Rop4);
|
/* Clip the target rect against the bounds of the target surface */
|
||||||
|
if (!RECTL_bClipRectBySize(&rclClipped, &rclClipped, &psoTrg->sizlBitmap))
|
||||||
/* Sanity check */
|
{
|
||||||
ASSERT(IS_VALID_ROP4(Rop4));
|
/* Nothing left */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (pco)
|
if (pco)
|
||||||
{
|
{
|
||||||
|
@ -660,7 +666,21 @@ IntEngBitBlt(
|
||||||
rclSrc.top = pptlSrc->y + rclClipped.top - prclTrg->top;
|
rclSrc.top = pptlSrc->y + rclClipped.top - prclTrg->top;
|
||||||
rclSrc.right = rclSrc.left + rclClipped.right - rclClipped.left;
|
rclSrc.right = rclSrc.left + rclClipped.right - rclClipped.left;
|
||||||
rclSrc.bottom = rclSrc.top + rclClipped.bottom - rclClipped.top;
|
rclSrc.bottom = rclSrc.top + rclClipped.bottom - rclClipped.top;
|
||||||
pptlSrc = (PPOINTL)&rclSrc;
|
|
||||||
|
/* Clip the source rect against the size of the source surface */
|
||||||
|
if (!RECTL_bClipRectBySize(&rclSrcClipped, &rclSrc, &psoSrc->sizlBitmap))
|
||||||
|
{
|
||||||
|
/* Nothing left */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fix up target rect */
|
||||||
|
rclClipped.left += (rclSrcClipped.left - rclSrc.left);
|
||||||
|
rclClipped.top += (rclSrcClipped.top - rclSrc.top);
|
||||||
|
rclClipped.right -= (rclSrc.right - rclSrcClipped.right);
|
||||||
|
rclClipped.bottom -= (rclSrc.bottom - rclSrcClipped.bottom);
|
||||||
|
|
||||||
|
pptlSrc = (PPOINTL)&rclSrcClipped;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -410,10 +410,11 @@ IntEngBitBlt(
|
||||||
ASSERT(prclTrg);
|
ASSERT(prclTrg);
|
||||||
|
|
||||||
/* Clip the target rect to the extents of the target surface */
|
/* Clip the target rect to the extents of the target surface */
|
||||||
rcClipped.left = max(prclTrg->left, 0);
|
if (!RECTL_bClipRectBySize(&rcClipped, prclTrg, &psoTrg->sizlBitmap))
|
||||||
rcClipped.top = max(prclTrg->top, 0);
|
{
|
||||||
rcClipped.right = min(prclTrg->right, psoTrg->sizlBitmap.cx);
|
/* Nothing left */
|
||||||
rcClipped.bottom = min(prclTrg->bottom, psoTrg->sizlBitmap.cy);
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* If no clip object is given, use trivial one */
|
/* If no clip object is given, use trivial one */
|
||||||
if (!pco) pco = (CLIPOBJ*)&gxcoTrivial;
|
if (!pco) pco = (CLIPOBJ*)&gxcoTrivial;
|
||||||
|
|
|
@ -67,6 +67,20 @@ RECTL_bIsWellOrdered(
|
||||||
(prcl->top <= prcl->bottom));
|
(prcl->top <= prcl->bottom));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FORCEINLINE
|
||||||
|
BOOL
|
||||||
|
RECTL_bClipRectBySize(
|
||||||
|
_Out_ RECTL *prclDst,
|
||||||
|
_In_ const RECTL *prclSrc,
|
||||||
|
_In_ const SIZEL *pszl)
|
||||||
|
{
|
||||||
|
prclDst->left = max(prclSrc->left, 0);
|
||||||
|
prclDst->top = max(prclSrc->top, 0);
|
||||||
|
prclDst->right = min(prclSrc->right, pszl->cx);
|
||||||
|
prclDst->bottom = min(prclSrc->bottom, pszl->cy);
|
||||||
|
return !RECTL_bIsEmptyRect(prclDst);
|
||||||
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
FASTCALL
|
FASTCALL
|
||||||
RECTL_bUnionRect(
|
RECTL_bUnionRect(
|
||||||
|
|
Loading…
Reference in a new issue