/*********************************************************************** * IntersectVisRect (GDI.98) */ INT16 WINAPI IntersectVisRect16( HDC16 hdc16, INT16 left, INT16 top, INT16 right, INT16 bottom ) { HRGN tempRgn; INT16 ret; POINT pt[2]; HDC hdc = HDC_32( hdc16 ); DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; pt[0].x = left; pt[0].y = top; pt[1].x = right; pt[1].y = bottom; LPtoDP( hdc, pt, 2 ); TRACE("%p %ld,%ld - %ld,%ld\n", hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y); if (!(tempRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR; else { ret = CombineRgn( dc->hVisRgn, dc->hVisRgn, tempRgn, RGN_AND ); DeleteObject( tempRgn ); } if (ret != ERROR) CLIPPING_UpdateGCRegion( dc ); GDI_ReleaseObj( hdc ); return ret; }
/*********************************************************************** * OffsetVisRgn (GDI.102) */ INT16 WINAPI OffsetVisRgn16( HDC16 hdc16, INT16 x, INT16 y ) { INT16 retval; HDC hdc = HDC_32( hdc16 ); DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; TRACE("%p %d,%d\n", hdc, x, y ); retval = OffsetRgn( dc->hVisRgn, x, y ); CLIPPING_UpdateGCRegion( dc ); GDI_ReleaseObj( hdc ); return retval; }
/****************************************************************************** * ExtSelectClipRgn [GDI32.@] */ INT WINAPI ExtSelectClipRgn( HDC hdc, HRGN hrgn, INT fnMode ) { INT retval; RECT rect; DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; TRACE("%p %p %d\n", hdc, hrgn, fnMode ); if (dc->funcs->pExtSelectClipRgn) { retval = dc->funcs->pExtSelectClipRgn( dc->physDev, hrgn, fnMode ); GDI_ReleaseObj( hdc ); 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); GDI_ReleaseObj( hdc ); 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 ); GDI_ReleaseObj( hdc ); return GetClipBox(hdc, &rect); }
/*********************************************************************** * IntersectClipRect (GDI32.@) */ INT WINAPI IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom ) { INT ret; DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; TRACE("%p %d,%d - %d,%d\n", hdc, left, top, right, bottom ); if(dc->funcs->pIntersectClipRect) { ret = dc->funcs->pIntersectClipRect( 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 (!dc->hClipRgn) { dc->hClipRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ); ret = SIMPLEREGION; } else { HRGN newRgn; if (!(newRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR; else { ret = CombineRgn( dc->hClipRgn, dc->hClipRgn, newRgn, RGN_AND ); DeleteObject( newRgn ); } } if (ret != ERROR) CLIPPING_UpdateGCRegion( dc ); } GDI_ReleaseObj( hdc ); return ret; }
/*********************************************************************** * GetClipBox (GDI32.@) */ INT WINAPI GetClipBox( HDC hdc, LPRECT rect ) { INT ret; HRGN clip; DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; if ((clip = get_clip_region(dc))) { HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 ); CombineRgn( hrgn, dc->hVisRgn, clip, RGN_AND ); ret = GetRgnBox( hrgn, rect ); DeleteObject( hrgn ); } else ret = GetRgnBox( dc->hVisRgn, rect ); DPtoLP( hdc, (LPPOINT)rect, 2 ); GDI_ReleaseObj( hdc ); return ret; }
/*********************************************************************** * PtVisible (GDI32.@) */ BOOL WINAPI PtVisible( HDC hdc, INT x, INT y ) { POINT pt; BOOL ret; HRGN clip; DC *dc = DC_GetDCUpdate( hdc ); TRACE("%p %d,%d\n", hdc, x, y ); if (!dc) return FALSE; pt.x = x; pt.y = y; LPtoDP( hdc, &pt, 1 ); ret = PtInRegion( dc->hVisRgn, pt.x, pt.y ); if (ret && (clip = get_clip_region(dc))) ret = PtInRegion( clip, pt.x, pt.y ); GDI_ReleaseObj( hdc ); return ret; }
/*********************************************************************** * OffsetClipRgn (GDI32.@) */ INT WINAPI OffsetClipRgn( HDC hdc, INT x, INT y ) { INT ret = SIMPLEREGION; DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; TRACE("%p %d,%d\n", hdc, x, y ); if(dc->funcs->pOffsetClipRgn) { ret = dc->funcs->pOffsetClipRgn( dc->physDev, x, y ); /* FIXME: ret is just a success flag, we should return a proper value */ } else if (dc->hClipRgn) { ret = OffsetRgn( dc->hClipRgn, MulDiv( x, dc->vportExtX, dc->wndExtX ), MulDiv( y, dc->vportExtY, dc->wndExtY ) ); CLIPPING_UpdateGCRegion( dc ); } GDI_ReleaseObj( hdc ); return ret; }
/*********************************************************************** * SelectObject (GDI32.@) */ HGDIOBJ WINAPI SelectObject( HDC hdc, HGDIOBJ handle ) { HGDIOBJ ret = 0; DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return 0; TRACE("hdc=%04x %04x\n", hdc, handle ); /* Fonts get a rather different treatment so we'll handle them separately */ if(GetObjectType(handle) == OBJ_FONT) ret = FONT_SelectObject(dc, handle); else if (dc->funcs->pSelectObject) ret = dc->funcs->pSelectObject( dc, handle ); GDI_ReleaseObj( hdc ); if (ret && ret != handle) { inc_ref_count( handle ); dec_ref_count( ret ); } return ret; }
/*********************************************************************** * SaveVisRgn (GDI.129) */ HRGN16 WINAPI SaveVisRgn16( HDC16 hdc16 ) { struct saved_visrgn *saved; HDC hdc = HDC_32( hdc16 ); DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return 0; TRACE("%p\n", hdc ); if (!(saved = HeapAlloc( GetProcessHeap(), 0, sizeof(*saved) ))) goto error; if (!(saved->hrgn = CreateRectRgn( 0, 0, 0, 0 ))) goto error; CombineRgn( saved->hrgn, dc->hVisRgn, 0, RGN_COPY ); saved->next = dc->saved_visrgn; dc->saved_visrgn = saved; GDI_ReleaseObj( hdc ); return HRGN_16(saved->hrgn); error: GDI_ReleaseObj( hdc ); HeapFree( GetProcessHeap(), 0, saved ); return 0; }
/*********************************************************************** * RectVisible (GDI32.@) */ BOOL WINAPI RectVisible( HDC hdc, const RECT* rect ) { RECT tmpRect; BOOL ret; HRGN clip; DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return FALSE; TRACE("%p %ld,%ldx%ld,%ld\n", hdc, rect->left, rect->top, rect->right, rect->bottom ); tmpRect = *rect; LPtoDP( hdc, (POINT *)&tmpRect, 2 ); if ((clip = get_clip_region(dc))) { HRGN hrgn = CreateRectRgn( 0, 0, 0, 0 ); CombineRgn( hrgn, dc->hVisRgn, clip, RGN_AND ); ret = RectInRegion( hrgn, &tmpRect ); DeleteObject( hrgn ); } else ret = RectInRegion( dc->hVisRgn, &tmpRect ); GDI_ReleaseObj( hdc ); return ret; }