/******************************Module*Header*******************************\ * Module Name: misc.c * * Miscellaneous common routines. * * Copyright (c) 1992-1995 Microsoft Corporation * \**************************************************************************/ #include "precomp.h" /******************************Public*Routine******************************\ * VOID vResetClipping \**************************************************************************/ VOID vResetClipping( PDEV* ppdev) { BYTE* pjBase; pjBase = ppdev->pjBase; CP_WAIT(ppdev, pjBase); CP_ABS_WMIN(ppdev, pjBase, 0, 0); CP_ABS_WMAX(ppdev, pjBase, MAX_COORD, MAX_COORD); } /******************************Public*Routine******************************\ * VOID vSetClipping \**************************************************************************/ VOID vSetClipping( PDEV* ppdev, RECTL* prclClip) // In relative coordinates { BYTE* pjBase; pjBase = ppdev->pjBase; CP_WAIT(ppdev, pjBase); CP_WMIN(ppdev, pjBase, prclClip->left, prclClip->top); CP_WMAX(ppdev, pjBase, prclClip->right - 1, prclClip->bottom - 1); } /******************************Public*Routine******************************\ * VOID vGetBits * * Copies the bits to the given surface from the screen, using the memory * aperture. Must be pre-clipped. * \**************************************************************************/ VOID vGetBits( PDEV* ppdev, SURFOBJ* psoDst, RECTL* prclDst, // Absolute coordinates! POINTL* pptlSrc) // Absolute coordinates! { LONG lSrcDelta; LONG lDstDelta; BYTE* pjSrc; BYTE* pjDst; LONG cjScan; LONG cyScan; LONG cjStartPhase; LONG cjMiddle; LONG i; CP_WAIT(ppdev, ppdev->pjBase); lSrcDelta = ppdev->lDelta; pjSrc = ppdev->pjScreen + (pptlSrc->y * lSrcDelta) + (pptlSrc->x * ppdev->cjPel); lDstDelta = psoDst->lDelta; pjDst = (BYTE*) psoDst->pvScan0 + (prclDst->top * lDstDelta) + (prclDst->left * ppdev->cjPel); cjScan = (prclDst->right - prclDst->left) * ppdev->cjPel; cyScan = (prclDst->bottom - prclDst->top); // We want to do aligned dword reads from the frame buffer: cjStartPhase = (LONG)((0 - (LONG_PTR)pjSrc) & 3); cjMiddle = cjScan - cjStartPhase; if (cjMiddle < 0) { cjStartPhase += cjMiddle; cjMiddle = 0; } lSrcDelta -= cjStartPhase; lDstDelta -= cjStartPhase; do { for (i = cjStartPhase; i > 0; i--) { *pjDst++ = *pjSrc++; } memcpy(pjDst, pjSrc, cjMiddle); pjDst += lDstDelta; pjSrc += lSrcDelta; } while (--cyScan != 0); } /******************************Public*Routine******************************\ * VOID vPutBits * * Copies the bits from the given surface to the screen, using the memory * aperture. Must be pre-clipped. * \**************************************************************************/ VOID vPutBits( PDEV* ppdev, SURFOBJ* psoSrc, RECTL* prclDst, // Absolute coordinates! POINTL* pptlSrc) // Absolute coordinates! { LONG lSrcDelta; LONG lDstDelta; BYTE* pjSrc; BYTE* pjDst; LONG cjScan; LONG cyScan; LONG cjStartPhase; LONG cjMiddle; LONG i; CP_WAIT(ppdev, ppdev->pjBase); lSrcDelta = psoSrc->lDelta; pjSrc = (BYTE*) psoSrc->pvScan0 + (pptlSrc->y * lSrcDelta) + (pptlSrc->x * ppdev->cjPel); lDstDelta = ppdev->lDelta; pjDst = ppdev->pjScreen + (prclDst->top * lDstDelta) + (prclDst->left * ppdev->cjPel); cjScan = (prclDst->right - prclDst->left) * ppdev->cjPel; cyScan = (prclDst->bottom - prclDst->top); // We want to do aligned dword reads from the frame buffer: cjStartPhase = (LONG)((0 - (LONG_PTR)pjDst) & 3); cjMiddle = cjScan - cjStartPhase; if (cjMiddle < 0) { cjStartPhase += cjMiddle; cjMiddle = 0; } lSrcDelta -= cjStartPhase; lDstDelta -= cjStartPhase; // Account for start do { for (i = cjStartPhase; i > 0; i--) { *pjDst++ = *pjSrc++; } memcpy(pjDst, pjSrc, cjMiddle); pjSrc += lSrcDelta; pjDst += lDstDelta; } while (--cyScan != 0); } /******************************Public*Routine******************************\ * VOID DrvSynchronize * * Waits for all accelerator functions to finish so that GDI can draw * on the frame buffer. \**************************************************************************/ VOID DrvSynchronize( DHPDEV dhpdev, RECTL* prcl) { PDEV* ppdev; ppdev = (PDEV*) dhpdev; // !!! Don't think this is true! // // We have to synchronize for off-screen device bitmaps as well as the // screen. Unfortunately, GDI only gives us a 'dhpdev,' not a SURFOBJ // pointer, so we don't know whether it device bitmap is in off-screen, // or has been moved to a DIB (because we obviously don't have to // synchronize the hardware to draw to a DIB). So we'll do extra, // unneeded synchronization. if (ppdev->bEnabled) { CP_WAIT(ppdev, ppdev->pjBase); } }