/******************************Module*Header*******************************\ * Module Name: draw.c * * The drawing guts of a portable 16-colour VGA driver for Windows NT. The * implementation herein may possibly be the simplest method of bringing * up a driver whose surface is not directly writable by GDI. One might * use the phrase "quick and dirty" when describing it. * * We create a 4bpp bitmap that is the size of the screen, and simply * have GDI do all the drawing to it. We update the screen directly * from the bitmap, based on the bounds of the drawing (basically * employing "dirty rectangles"). * * In total, the only hardware-specific code we had to write was the * initialization code, and a routine for doing aligned srccopy blts * from a DIB to the screen. * * Obvious Note: This approach is definitely not recommended if you want * to get decent performance. * * Copyright (c) 1994-1995 Microsoft Corporation \**************************************************************************/ #include "precomp.h" /******************************Public*Routine******************************\ * DrvStrokePath * \**************************************************************************/ BOOL DrvStrokePath( SURFOBJ* pso, PATHOBJ* ppo, CLIPOBJ* pco, XFORMOBJ* pxo, BRUSHOBJ* pbo, POINTL* pptlBrush, LINEATTRS* pla, MIX mix) { BOOL b; PDEV* ppdev; RECTFX rcfxBounds; RECTL rclBounds; ppdev = (PDEV*) pso->dhpdev; b = EngStrokePath(ppdev->pso, ppo, pco, pxo, pbo, pptlBrush, pla, mix); // Get the path bounds and make it lower-right exclusive: PATHOBJ_vGetBounds(ppo, &rcfxBounds); rclBounds.left = (rcfxBounds.xLeft >> 4); rclBounds.top = (rcfxBounds.yTop >> 4); rclBounds.right = (rcfxBounds.xRight >> 4) + 2; rclBounds.bottom = (rcfxBounds.yBottom >> 4) + 2; // Don't update the screen if we're currently showing an 'off-screen' // DirectDraw flip buffer: if (ppdev->fpScreenOffset == 0) { vUpdate(ppdev, &rclBounds, pco); } return(b); } /******************************Public*Routine******************************\ * DrvBitBlt * \**************************************************************************/ BOOL DrvBitBlt( SURFOBJ* psoDst, SURFOBJ* psoSrc, SURFOBJ* psoMask, CLIPOBJ* pco, XLATEOBJ* pxlo, RECTL* prclDst, POINTL* pptlSrc, POINTL* pptlMask, BRUSHOBJ* pbo, POINTL* pptlBrush, ROP4 rop4) { BOOL bUpdate; BOOL b; PDEV* ppdev; bUpdate = FALSE; if (psoDst->iType == STYPE_DEVICE) { bUpdate = TRUE; ppdev = (PDEV*) psoDst->dhpdev; psoDst = ppdev->pso; } if ((psoSrc != NULL) && (psoSrc->iType == STYPE_DEVICE)) { ppdev = (PDEV*) psoSrc->dhpdev; psoSrc = ppdev->pso; } b = EngBitBlt(psoDst, psoSrc, psoMask, pco, pxlo, prclDst, pptlSrc, pptlMask, pbo, pptlBrush, rop4); if (bUpdate) { // Don't update the screen if we're currently showing an 'off-screen' // DirectDraw flip buffer: if (ppdev->fpScreenOffset == 0) { vUpdate(ppdev, prclDst, pco); } } return(b); } /******************************Public*Routine******************************\ * DrvCopyBits * \**************************************************************************/ BOOL DrvCopyBits( SURFOBJ* psoDst, SURFOBJ* psoSrc, CLIPOBJ* pco, XLATEOBJ* pxlo, RECTL* prclDst, POINTL* pptlSrc) { BOOL bUpdate; BOOL b; PDEV* ppdev; return(DrvBitBlt(psoDst, psoSrc, NULL, pco, pxlo, prclDst, pptlSrc, NULL, NULL, NULL, 0xcccc)); } /******************************Public*Routine******************************\ * DrvTextOut * \**************************************************************************/ BOOL DrvTextOut( SURFOBJ* pso, STROBJ* pstro, FONTOBJ* pfo, CLIPOBJ* pco, RECTL* prclExtra, RECTL* prclOpaque, BRUSHOBJ* pboFore, BRUSHOBJ* pboOpaque, POINTL* pptlOrg, MIX mix) { BOOL b; PDEV* ppdev; ppdev = (PDEV*) pso->dhpdev; b = EngTextOut(ppdev->pso, pstro, pfo, pco, prclExtra, prclOpaque, pboFore, pboOpaque, pptlOrg, mix); // Don't update the screen if we're currently showing an 'off-screen' // DirectDraw flip buffer: if (ppdev->fpScreenOffset == 0) { vUpdate(ppdev, (prclOpaque != NULL) ? prclOpaque : &pstro->rclBkGround, pco); } return(b); } /******************************Public*Routine******************************\ * DrvPaint * \**************************************************************************/ BOOL DrvPaint( SURFOBJ* pso, CLIPOBJ* pco, BRUSHOBJ* pbo, POINTL* pptlBrush, MIX mix) { BOOL b; PDEV* ppdev; ppdev = (PDEV*) pso->dhpdev; b = EngPaint(ppdev->pso, pco, pbo, pptlBrush, mix); // Don't update the screen if we're currently showing an 'off-screen' // DirectDraw flip buffer: if (ppdev->fpScreenOffset == 0) { vUpdate(ppdev, &pco->rclBounds, pco); } return(b); }