/* add region to window update region*/ BOOL WINAPI InvalidateRgn(HWND hwnd, HRGN hrgn, BOOL bErase) { if(hwnd) { if(!hrgn) /* add client area to update region*/ return InvalidateRect(hwnd, NULL, bErase); /* passed region is in client coords, convert to screen*/ GdOffsetRegion(((MWRGNOBJ *)hrgn)->rgn, hwnd->clirect.left, hwnd->clirect.top); GdUnionRegion(hwnd->update, hwnd->update, ((MWRGNOBJ *)hrgn)->rgn); GdOffsetRegion(((MWRGNOBJ *)hrgn)->rgn, -hwnd->clirect.left, -hwnd->clirect.top); /* if update region not empty, mark as needing painting*/ if(hwnd->update->numRects != 0) if(hwnd->gotPaintMsg == PAINT_PAINTED) hwnd->gotPaintMsg = PAINT_NEEDSPAINT; if( bErase ) hwnd->nEraseBkGnd++; } return TRUE; }
/* * Note: The behavior is correct even if src and dest regions are the same. */ INT WINAPI CombineRgn(HRGN hDest, HRGN hSrc1, HRGN hSrc2, INT mode) { MWRGNOBJ *destObj = (MWRGNOBJ *) GDI_GetObjPtr( hDest, OBJ_REGION); INT result = ERRORREGION; /*TRACE(region, " %04x,%04x -> %04x mode=%x\n", hSrc1, hSrc2, hDest,mode);*/ if (destObj) { MWRGNOBJ *src1Obj = (MWRGNOBJ *) GDI_GetObjPtr( hSrc1, OBJ_REGION); if (src1Obj) { /*TRACE(region, "dump:\n"); if(TRACE_ON(region)) REGION_DumpRegion(src1Obj->rgn);*/ if (mode == RGN_COPY) { GdCopyRegion( destObj->rgn, src1Obj->rgn ); result = destObj->rgn->type; } else { MWRGNOBJ *src2Obj = (MWRGNOBJ *) GDI_GetObjPtr( hSrc2, OBJ_REGION); if (src2Obj) { /*TRACE(region, "dump:\n"); if(TRACE_ON(region)) REGION_DumpRegion(src2Obj->rgn);*/ switch (mode) { case RGN_AND: GdIntersectRegion( destObj->rgn, src1Obj->rgn, src2Obj->rgn); break; case RGN_OR: GdUnionRegion( destObj->rgn, src1Obj->rgn, src2Obj->rgn ); break; case RGN_XOR: GdXorRegion( destObj->rgn, src1Obj->rgn, src2Obj->rgn ); break; case RGN_DIFF: GdSubtractRegion( destObj->rgn, src1Obj->rgn, src2Obj->rgn ); break; } result = destObj->rgn->type; } } } /*TRACE(region, "dump:\n"); if(TRACE_ON(region)) REGION_DumpRegion(destObj->rgn);*/ } return result; }