VOID FASTCALL IntUpdateBoundsRect(PDC pdc, PRECTL pRect) { if (pdc->fs & DC_ACCUM_APP) { RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, pRect); } if (pdc->fs & DC_ACCUM_WMGR) { RECTL_bUnionRect(&pdc->erclBounds, &pdc->erclBounds, pRect); } }
DWORD APIENTRY NtGdiSetBoundsRect( IN HDC hdc, IN LPRECT prc, IN DWORD flags) { DWORD ret; PDC pdc; RECTL rcl; /* Verify arguments */ if ((flags & DCB_ENABLE) && (flags & DCB_DISABLE)) return 0; /* Lock the DC */ if (!(pdc = DC_LockDc(hdc))) return 0; /* Get the return value */ ret = pdc->fs & DC_ACCUM_APP ? DCB_ENABLE : DCB_DISABLE; ret |= RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? DCB_RESET : DCB_SET; if (flags & DCB_RESET) { RECTL_vSetEmptyRect(&pdc->erclBoundsApp); } if (flags & DCB_ACCUMULATE && prc != NULL) { /* Capture the rect */ _SEH2_TRY { ProbeForRead(prc, sizeof(RECT), 1); rcl = *prc; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { DC_UnlockDc(pdc); _SEH2_YIELD(return 0;) } _SEH2_END; RECTL_vMakeWellOrdered(&rcl); RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, &rcl); }
DWORD APIENTRY NtGdiSetBoundsRect( IN HDC hdc, IN LPRECT prc, IN DWORD flags) { DWORD ret; PDC pdc; RECTL rcl; /* Verify arguments */ if ((flags & DCB_ENABLE) && (flags & DCB_DISABLE)) return 0; /* Lock the DC */ if (!(pdc = DC_LockDc(hdc))) return 0; /* Get the return value */ ret = DCB_RESET; /* we don't have device-specific bounds */ ret = (pdc->fs & (DC_ACCUM_APP|DC_ACCUM_WMGR) ? DCB_ENABLE : DCB_DISABLE) | (RECTL_bIsEmptyRect(&pdc->erclBoundsApp) ? ret & DCB_SET : DCB_SET ); ret |= (flags & DCB_WINDOWMGR); if (flags & DCB_RESET) { if (!(flags & DCB_WINDOWMGR)) { pdc->erclBoundsApp.left = pdc->erclBoundsApp.top = INT_MAX; pdc->erclBoundsApp.right = pdc->erclBoundsApp.bottom = INT_MIN; } else { pdc->erclBounds.left = pdc->erclBounds.top = INT_MAX; pdc->erclBounds.right = pdc->erclBounds.bottom = INT_MIN; } } if (flags & DCB_ACCUMULATE && prc != NULL) { /* Capture the rect */ _SEH2_TRY { ProbeForRead(prc, sizeof(RECT), 1); rcl = *prc; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { DC_UnlockDc(pdc); _SEH2_YIELD(return 0;) } _SEH2_END; RECTL_vMakeWellOrdered(&rcl); if (!(flags & DCB_WINDOWMGR)) { IntLPtoDP( pdc, (POINT *)&rcl, 2 ); RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp, &rcl); } else RECTL_bUnionRect(&pdc->erclBounds, &pdc->erclBounds, &rcl); }