#include "precomp.h" // // BA.CPP // Bounds Accumulator // // Copyright(c) Microsoft 1997- // #define MLZ_FILE_ZONE ZONE_CORE // // BA_SyncOutgoing() // Reset rect count // void ASHost::BA_SyncOutgoing(void) { DebugEntry(ASHost::BA_SyncOutgoing); m_baNumRects = 0; DebugExitVOID(ASHost::BA_SyncOutgoing); } // // BA_AddRect() // void ASHost::BA_AddRect(LPRECT pRect) { DebugEntry(ASHost::BA_AddRect); // // Make sure that we don't have too many rects // if (m_baNumRects >= BA_NUM_RECTS) { ERROR_OUT(( "Too many rectangles")); DC_QUIT; } if(pRect == NULL) { DC_QUIT; } // // Check that the caller has passed a valid rectangle. If not, do a // trace alert, and then return immediately (as an invalid rectangle // shouldn't contribute to the accumulated bounds) - but report an OK // return code, so we keep running. // if ((pRect->right < pRect->left) || (pRect->bottom < pRect->top)) { WARNING_OUT(("BA_AddRect: empty rect {%04d, %04d, %04d, %04d}", pRect->left, pRect->top, pRect->right, pRect->bottom )); DC_QUIT; } // // Add the rect to the bounds. // m_abaRects[m_baNumRects++] = *pRect; DC_EXIT_POINT: DebugExitVOID(ASHost::BA_AddRect); } // // BA_QueryAccumulation() // UINT ASHost::BA_QueryAccumulation(void) { UINT totalSDA; LPBA_FAST_DATA lpbaFast; DebugEntry(ASHost::BA_QueryAccumulation); lpbaFast = BA_FST_START_WRITING; // // Get the current setting and clear the previous one. // totalSDA = lpbaFast->totalSDA; lpbaFast->totalSDA = 0; BA_FST_STOP_WRITING; DebugExitDWORD(ASHost::BA_QueryAccumulation, totalSDA); return(totalSDA); } // // // BA_FetchBounds() // // void ASHost::BA_FetchBounds(void) { BA_BOUNDS_INFO boundsInfo; UINT i; DebugEntry(ASHost::BA_FetchBounds); // // Clear our copy of the bounds // m_baNumRects = 0; // // Get the driver's latest bounds rects // OSI_FunctionRequest(BA_ESC_GET_BOUNDS, (LPOSI_ESCAPE_HEADER)&boundsInfo, sizeof(boundsInfo)); // // Add the driver's bounds into our array // TRACE_OUT(( "Retreived %d rects from driver", boundsInfo.numRects)); for (i = 0; i < boundsInfo.numRects; i++) { TRACE_OUT(( "Rect %d, (%d, %d) (%d, %d)", i, boundsInfo.rects[i].left, boundsInfo.rects[i].top, boundsInfo.rects[i].right, boundsInfo.rects[i].bottom)); BA_AddRect((LPRECT)&boundsInfo.rects[i]); } DebugExitVOID(ASHost::BA_FetchBounds); } // // BA_ReturnBounds() // void ASHost::BA_ReturnBounds(void) { BA_BOUNDS_INFO boundsInfo; DebugEntry(ASHost::BA_ReturnBounds); // // Copy the share core's bounds into the structure which we pass to the // driver. This will also clear the share core's copy of the bounds. // BA_CopyBounds((LPRECT)boundsInfo.rects, (LPUINT)&boundsInfo.numRects, TRUE); // // Now set up for, and then call into the driver to fetch the driver's // bounds. // TRACE_OUT(( "Passing %d rects to driver", boundsInfo.numRects)); OSI_FunctionRequest(BA_ESC_RETURN_BOUNDS, (LPOSI_ESCAPE_HEADER)&boundsInfo, sizeof(boundsInfo)); DebugExitVOID(ASHost::BA_ReturnBounds); } // // BA_CopyBounds() // void ASHost::BA_CopyBounds(LPRECT pRects, LPUINT pNumRects, BOOL fReset) { DebugEntry(ASHost::BA_CopyBounds); if (*pNumRects = m_baNumRects) { TRACE_OUT(( "num rects : %d", m_baNumRects)); memcpy(pRects, m_abaRects, m_baNumRects * sizeof(RECT)); if (fReset) { m_baNumRects = 0; } } DebugExitVOID(ASHost::BA_CopyBounds); }