mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +00:00
Clip region to be bitblt'ed against the valid source region. Fixes bug #152
svn path=/trunk/; revision=8060
This commit is contained in:
parent
ac2782d72e
commit
5ec14bf2bf
1 changed files with 52 additions and 7 deletions
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: bitblt.c,v 1.40 2004/01/17 01:04:45 gvg Exp $
|
/* $Id: bitblt.c,v 1.41 2004/02/06 20:36:31 gvg Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -433,19 +433,65 @@ IntEngBitBlt(SURFOBJ *DestObj,
|
||||||
BOOLEAN ret;
|
BOOLEAN ret;
|
||||||
SURFGDI *DestGDI;
|
SURFGDI *DestGDI;
|
||||||
SURFGDI *SourceGDI;
|
SURFGDI *SourceGDI;
|
||||||
|
RECTL InputClippedRect;
|
||||||
RECTL OutputRect;
|
RECTL OutputRect;
|
||||||
POINTL InputPoint;
|
POINTL InputPoint;
|
||||||
|
BOOLEAN UsesSource;
|
||||||
|
|
||||||
if (NULL != SourcePoint)
|
InputClippedRect = *DestRect;
|
||||||
|
if (InputClippedRect.right < InputClippedRect.left)
|
||||||
{
|
{
|
||||||
|
InputClippedRect.left = DestRect->right;
|
||||||
|
InputClippedRect.right = DestRect->left;
|
||||||
|
}
|
||||||
|
if (InputClippedRect.bottom < InputClippedRect.top)
|
||||||
|
{
|
||||||
|
InputClippedRect.top = DestRect->bottom;
|
||||||
|
InputClippedRect.bottom = DestRect->top;
|
||||||
|
}
|
||||||
|
UsesSource = ((Rop4 & 0xCC0000) >> 2) != (Rop4 & 0x330000);
|
||||||
|
if (UsesSource)
|
||||||
|
{
|
||||||
|
if (NULL == SourcePoint || NULL == SourceObj)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
InputPoint = *SourcePoint;
|
InputPoint = *SourcePoint;
|
||||||
|
SourceGDI = (SURFGDI*) AccessInternalObjectFromUserObject(SourceObj);
|
||||||
|
|
||||||
|
/* Make sure we don't try to copy anything outside the valid source region */
|
||||||
|
if (InputPoint.x < 0)
|
||||||
|
{
|
||||||
|
InputClippedRect.left -= InputPoint.x;
|
||||||
|
InputPoint.x = 0;
|
||||||
|
}
|
||||||
|
if (InputPoint.y < 0)
|
||||||
|
{
|
||||||
|
InputClippedRect.top -= InputPoint.y;
|
||||||
|
InputPoint.y = 0;
|
||||||
|
}
|
||||||
|
if (SourceObj->sizlBitmap.cx < InputPoint.x + InputClippedRect.right - InputClippedRect.left)
|
||||||
|
{
|
||||||
|
InputClippedRect.right = InputClippedRect.left + SourceObj->sizlBitmap.cx - InputPoint.x;
|
||||||
|
}
|
||||||
|
if (SourceObj->sizlBitmap.cy < InputPoint.y + InputClippedRect.bottom - InputClippedRect.top)
|
||||||
|
{
|
||||||
|
InputClippedRect.bottom = InputClippedRect.top + SourceObj->sizlBitmap.cy - InputPoint.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputClippedRect.right < InputClippedRect.left ||
|
||||||
|
InputClippedRect.bottom < InputClippedRect.top)
|
||||||
|
{
|
||||||
|
/* Everything clipped away, nothing to do */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clip against the bounds of the clipping region so we won't try to write
|
/* Clip against the bounds of the clipping region so we won't try to write
|
||||||
* outside the surface */
|
* outside the surface */
|
||||||
if (NULL != ClipRegion)
|
if (NULL != ClipRegion)
|
||||||
{
|
{
|
||||||
if (! EngIntersectRect(&OutputRect, DestRect, &ClipRegion->rclBounds))
|
if (! EngIntersectRect(&OutputRect, &InputClippedRect, &ClipRegion->rclBounds))
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -454,12 +500,11 @@ IntEngBitBlt(SURFOBJ *DestObj,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OutputRect = *DestRect;
|
OutputRect = InputClippedRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != SourceObj)
|
if (UsesSource)
|
||||||
{
|
{
|
||||||
SourceGDI = (SURFGDI*) AccessInternalObjectFromUserObject(SourceObj);
|
|
||||||
MouseSafetyOnDrawStart(SourceObj, SourceGDI, InputPoint.x, InputPoint.y,
|
MouseSafetyOnDrawStart(SourceObj, SourceGDI, InputPoint.x, InputPoint.y,
|
||||||
(InputPoint.x + abs(DestRect->right - DestRect->left)),
|
(InputPoint.x + abs(DestRect->right - DestRect->left)),
|
||||||
(InputPoint.y + abs(DestRect->bottom - DestRect->top)));
|
(InputPoint.y + abs(DestRect->bottom - DestRect->top)));
|
||||||
|
@ -489,7 +534,7 @@ IntEngBitBlt(SURFOBJ *DestObj,
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseSafetyOnDrawEnd(DestObj, DestGDI);
|
MouseSafetyOnDrawEnd(DestObj, DestGDI);
|
||||||
if (NULL != SourceObj)
|
if (UsesSource)
|
||||||
{
|
{
|
||||||
MouseSafetyOnDrawEnd(SourceObj, SourceGDI);
|
MouseSafetyOnDrawEnd(SourceObj, SourceGDI);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue