INT nulldrv_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) { DC *dc = get_nulldrv_dc( dev ); RECT rect = get_clip_rect( dc, left, top, right, bottom ); INT ret; HRGN rgn; if (!(rgn = CreateRectRgnIndirect( &rect ))) return ERROR; if (!dc->hClipRgn) create_default_clip_region( dc ); ret = CombineRgn( dc->hClipRgn, dc->hClipRgn, rgn, RGN_DIFF ); DeleteObject( rgn ); if (ret != ERROR) update_dc_clipping( dc ); return ret; }
INT nulldrv_ExtSelectClipRgn( PHYSDEV dev, HRGN rgn, INT mode ) { DC *dc = get_nulldrv_dc( dev ); INT ret; if (!rgn) { switch (mode) { case RGN_COPY: if (dc->hClipRgn) DeleteObject( dc->hClipRgn ); dc->hClipRgn = 0; ret = SIMPLEREGION; break; case RGN_DIFF: return ERROR; default: FIXME("Unimplemented: hrgn NULL in mode: %d\n", mode); return ERROR; } } else { HRGN mirrored = 0; if (dc->layout & LAYOUT_RTL) { if (!(mirrored = CreateRectRgn( 0, 0, 0, 0 ))) return ERROR; mirror_region( mirrored, rgn, dc->vis_rect.right - dc->vis_rect.left ); rgn = mirrored; } if (!dc->hClipRgn) create_default_clip_region( dc ); if (mode == RGN_COPY) ret = CombineRgn( dc->hClipRgn, rgn, 0, mode ); else ret = CombineRgn( dc->hClipRgn, dc->hClipRgn, rgn, mode); if (mirrored) DeleteObject( mirrored ); } update_dc_clipping( dc ); return ret; }
/****************************************************************************** * ExtSelectClipRgn [GDI32.@] */ INT WINAPI ExtSelectClipRgn( HDC hdc, HRGN hrgn, INT fnMode ) { INT retval; RECT rect; DC * dc = get_dc_ptr( hdc ); if (!dc) return ERROR; TRACE("%p %p %d\n", hdc, hrgn, fnMode ); update_dc( dc ); if (dc->funcs->pExtSelectClipRgn) { retval = dc->funcs->pExtSelectClipRgn( dc->physDev, hrgn, fnMode ); release_dc_ptr( dc ); return retval; } if (!hrgn) { if (fnMode == RGN_COPY) { if (dc->hClipRgn) DeleteObject( dc->hClipRgn ); dc->hClipRgn = 0; } else { FIXME("Unimplemented: hrgn NULL in mode: %d\n", fnMode); release_dc_ptr( dc ); return ERROR; } } else { if (!dc->hClipRgn) create_default_clip_region( dc ); if(fnMode == RGN_COPY) CombineRgn( dc->hClipRgn, hrgn, 0, fnMode ); else CombineRgn( dc->hClipRgn, dc->hClipRgn, hrgn, fnMode); } CLIPPING_UpdateGCRegion( dc ); release_dc_ptr( dc ); return GetClipBox(hdc, &rect); }
/*********************************************************************** * ExcludeClipRect (GDI32.@) */ INT WINAPI ExcludeClipRect( HDC hdc, INT left, INT top, INT right, INT bottom ) { HRGN newRgn; INT ret; DC *dc = get_dc_ptr( hdc ); if (!dc) return ERROR; TRACE("%p %dx%d,%dx%d\n", hdc, left, top, right, bottom ); update_dc( dc ); if(dc->funcs->pExcludeClipRect) { ret = dc->funcs->pExcludeClipRect( dc->physDev, left, top, right, bottom ); /* FIXME: ret is just a success flag, we should return a proper value */ } else { POINT pt[2]; pt[0].x = left; pt[0].y = top; pt[1].x = right; pt[1].y = bottom; LPtoDP( hdc, pt, 2 ); if (!(newRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR; else { if (!dc->hClipRgn) create_default_clip_region( dc ); ret = CombineRgn( dc->hClipRgn, dc->hClipRgn, newRgn, RGN_DIFF ); DeleteObject( newRgn ); } if (ret != ERROR) CLIPPING_UpdateGCRegion( dc ); } release_dc_ptr( dc ); return ret; }