windows-nt/Source/XPSP1/NT/drivers/video/ms/modex/disp/draw.c
2020-09-26 16:20:57 +08:00

209 lines
5.1 KiB
C

/******************************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);
}