209 lines
5.1 KiB
C
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);
|
|
}
|