gdi32: Only store a total visible region when it's a combination of other regions.
This commit is contained in:
parent
ddfe35867d
commit
fb37752f53
|
@ -71,12 +71,11 @@ BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src )
|
||||||
{
|
{
|
||||||
RECT clip;
|
RECT clip;
|
||||||
|
|
||||||
if (!GetRgnBox( get_dc_region(dc), &clip ))
|
if (get_dc_visrect( dc, &clip )) intersect_rect( dst, src, &clip );
|
||||||
{
|
else *dst = *src;
|
||||||
*dst = *src;
|
|
||||||
return !is_rect_empty( dst );
|
if (GetRgnBox( get_dc_region(dc), &clip )) intersect_rect( dst, dst, &clip );
|
||||||
}
|
return !is_rect_empty( dst );
|
||||||
return intersect_rect( dst, src, &clip );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -87,7 +86,6 @@ BOOL clip_visrect( DC *dc, RECT *dst, const RECT *src )
|
||||||
void CLIPPING_UpdateGCRegion( DC * dc )
|
void CLIPPING_UpdateGCRegion( DC * dc )
|
||||||
{
|
{
|
||||||
HRGN clip_rgn;
|
HRGN clip_rgn;
|
||||||
RECT visrect;
|
|
||||||
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetDeviceClipping );
|
PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetDeviceClipping );
|
||||||
|
|
||||||
/* update the intersection of meta and clip regions */
|
/* update the intersection of meta and clip regions */
|
||||||
|
@ -102,23 +100,17 @@ void CLIPPING_UpdateGCRegion( DC * dc )
|
||||||
dc->hMetaClipRgn = 0;
|
dc->hMetaClipRgn = 0;
|
||||||
}
|
}
|
||||||
clip_rgn = get_clip_region( dc );
|
clip_rgn = get_clip_region( dc );
|
||||||
if (dc->hVisRgn)
|
if (clip_rgn && dc->hVisRgn)
|
||||||
{
|
{
|
||||||
if (!dc->region) dc->region = CreateRectRgn( 0, 0, 0, 0 );
|
if (!dc->region) dc->region = CreateRectRgn( 0, 0, 0, 0 );
|
||||||
CombineRgn( dc->region, dc->hVisRgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
|
CombineRgn( dc->region, dc->hVisRgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY );
|
||||||
}
|
}
|
||||||
else if (get_dc_visrect( dc, &visrect ))
|
|
||||||
{
|
|
||||||
if (!dc->region) dc->region = CreateRectRgn( 0, 0, 0, 0 );
|
|
||||||
SetRectRgn( dc->region, visrect.left, visrect.top, visrect.right, visrect.bottom );
|
|
||||||
if (clip_rgn) CombineRgn( dc->region, dc->region, clip_rgn, RGN_AND );
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (dc->region) DeleteObject( dc->region );
|
if (dc->region) DeleteObject( dc->region );
|
||||||
dc->region = 0;
|
dc->region = 0;
|
||||||
}
|
}
|
||||||
physdev->funcs->pSetDeviceClipping( physdev, dc->region );
|
physdev->funcs->pSetDeviceClipping( physdev, get_dc_region( dc ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -132,11 +124,8 @@ static inline void create_default_clip_region( DC * dc )
|
||||||
|
|
||||||
if (dc->header.type == OBJ_MEMDC)
|
if (dc->header.type == OBJ_MEMDC)
|
||||||
{
|
{
|
||||||
BITMAP bitmap;
|
width = dc->vis_rect.right - dc->vis_rect.left;
|
||||||
|
height = dc->vis_rect.bottom - dc->vis_rect.top;
|
||||||
GetObjectW( dc->hBitmap, sizeof(bitmap), &bitmap );
|
|
||||||
width = bitmap.bmWidth;
|
|
||||||
height = bitmap.bmHeight;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -369,6 +358,7 @@ INT WINAPI IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom
|
||||||
BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
|
BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
|
||||||
{
|
{
|
||||||
POINT pt;
|
POINT pt;
|
||||||
|
RECT visrect;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
DC *dc = get_dc_ptr( hdc );
|
DC *dc = get_dc_ptr( hdc );
|
||||||
|
|
||||||
|
@ -379,7 +369,10 @@ BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
|
||||||
pt.y = y;
|
pt.y = y;
|
||||||
LPtoDP( hdc, &pt, 1 );
|
LPtoDP( hdc, &pt, 1 );
|
||||||
update_dc( dc );
|
update_dc( dc );
|
||||||
ret = PtInRegion( get_dc_region(dc), pt.x, pt.y );
|
ret = (get_dc_visrect( dc, &visrect ) &&
|
||||||
|
pt.x >= visrect.left && pt.x < visrect.right &&
|
||||||
|
pt.y >= visrect.top && pt.y < visrect.bottom);
|
||||||
|
if (ret && get_dc_region( dc )) ret = PtInRegion( get_dc_region( dc ), pt.x, pt.y );
|
||||||
release_dc_ptr( dc );
|
release_dc_ptr( dc );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -390,7 +383,7 @@ BOOL WINAPI PtVisible( HDC hdc, INT x, INT y )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
|
BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
|
||||||
{
|
{
|
||||||
RECT tmpRect;
|
RECT tmpRect, visrect;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
DC *dc = get_dc_ptr( hdc );
|
DC *dc = get_dc_ptr( hdc );
|
||||||
if (!dc) return FALSE;
|
if (!dc) return FALSE;
|
||||||
|
@ -400,7 +393,8 @@ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
|
||||||
LPtoDP( hdc, (POINT *)&tmpRect, 2 );
|
LPtoDP( hdc, (POINT *)&tmpRect, 2 );
|
||||||
|
|
||||||
update_dc( dc );
|
update_dc( dc );
|
||||||
ret = RectInRegion( get_dc_region(dc), &tmpRect );
|
ret = (get_dc_visrect( dc, &visrect ) && intersect_rect( &visrect, &visrect, &tmpRect ));
|
||||||
|
if (ret && get_dc_region( dc )) ret = RectInRegion( get_dc_region( dc ), &tmpRect );
|
||||||
release_dc_ptr( dc );
|
release_dc_ptr( dc );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -411,12 +405,20 @@ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect )
|
||||||
*/
|
*/
|
||||||
INT WINAPI GetClipBox( HDC hdc, LPRECT rect )
|
INT WINAPI GetClipBox( HDC hdc, LPRECT rect )
|
||||||
{
|
{
|
||||||
|
RECT visrect;
|
||||||
INT ret;
|
INT ret;
|
||||||
DC *dc = get_dc_ptr( hdc );
|
DC *dc = get_dc_ptr( hdc );
|
||||||
if (!dc) return ERROR;
|
if (!dc) return ERROR;
|
||||||
|
|
||||||
update_dc( dc );
|
update_dc( dc );
|
||||||
ret = GetRgnBox( get_dc_region(dc), rect );
|
if (get_dc_region( dc ))
|
||||||
|
{
|
||||||
|
ret = GetRgnBox( get_dc_region( dc ), rect );
|
||||||
|
if (get_dc_visrect( dc, &visrect ) && !intersect_rect( rect, rect, &visrect ))
|
||||||
|
ret = NULLREGION;
|
||||||
|
}
|
||||||
|
else ret = get_dc_visrect( dc, rect ) ? SIMPLEREGION : NULLREGION;
|
||||||
|
|
||||||
if (dc->layout & LAYOUT_RTL)
|
if (dc->layout & LAYOUT_RTL)
|
||||||
{
|
{
|
||||||
int tmp = rect->left;
|
int tmp = rect->left;
|
||||||
|
|
|
@ -227,7 +227,9 @@ static inline HRGN get_clip_region( DC * dc )
|
||||||
/* Return the total DC region (if any) */
|
/* Return the total DC region (if any) */
|
||||||
static inline HRGN get_dc_region( DC *dc )
|
static inline HRGN get_dc_region( DC *dc )
|
||||||
{
|
{
|
||||||
return dc->region;
|
if (dc->region) return dc->region;
|
||||||
|
if (dc->hVisRgn) return dc->hVisRgn;
|
||||||
|
return get_clip_region( dc );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dc.c */
|
/* dc.c */
|
||||||
|
|
Loading…
Reference in New Issue