Retrieve the clipping region before setting the drawable and reset the

clipping region after.
This commit is contained in:
Francis Beaudet 1999-07-25 12:27:13 +00:00 committed by Alexandre Julliard
parent 565b2e0b5d
commit 278d0586dc

View File

@ -645,7 +645,7 @@ HDC16 WINAPI GetDCEx16( HWND16 hwnd, HRGN16 hrgnClip, DWORD flags )
*/ */
HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags ) HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
{ {
HRGN hrgnVisible = 0; HRGN hCopyClipRgn=0,hrgnVisible = 0;
HDC hdc = 0; HDC hdc = 0;
DCE * dce; DCE * dce;
DC * dc; DC * dc;
@ -792,9 +792,32 @@ HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
} }
bUpdateVisRgn = bUpdateVisRgn || (dc->w.flags & DC_DIRTY); bUpdateVisRgn = bUpdateVisRgn || (dc->w.flags & DC_DIRTY);
/* recompute visible region */ /*
* The pSetDrawable function might change the coordinate system (DCOrgX,DCOrgY)
* values. When it moves the origin, other data like the current clipping
* region will not be moved to that new origin. In the case of DCs that are class
* or window DCs that clipping region might be a valid value from a previous use
* of the DC and changing the origin of the DC without moving the clip region
* results in a clip region that is not placed properly in the DC.
* This code will retrieve the current clipping region, let the pSetDrawable
* modify the origin and reset the clipping. When the clipping is set, it is moved
* according to the new DC origin.
*/
if ( (wndPtr->class->style & (CS_OWNDC | CS_CLASSDC)) && (dc->w.hClipRgn > 0))
{
hCopyClipRgn=CreateRectRgn( 0, 0, 0, 0 );
GetClipRgn(hdc,hCopyClipRgn);
}
/* recompute visible region */
wndPtr->pDriver->pSetDrawable( wndPtr, dc, flags, bUpdateClipOrigin ); wndPtr->pDriver->pSetDrawable( wndPtr, dc, flags, bUpdateClipOrigin );
if (hCopyClipRgn)
{
SelectClipRgn(hdc,hCopyClipRgn);
DeleteObject(hCopyClipRgn);
}
if( bUpdateVisRgn ) if( bUpdateVisRgn )
{ {
TRACE("updating visrgn for %08x dce, hwnd [%04x]\n", (unsigned)dce, hwnd); TRACE("updating visrgn for %08x dce, hwnd [%04x]\n", (unsigned)dce, hwnd);