266 lines
7.4 KiB
C++
266 lines
7.4 KiB
C++
/******************************Module*Header*******************************\
|
||
* Module Name: bltlnk.hxx
|
||
*
|
||
* This contains the structures used in StinkBlt
|
||
*
|
||
* Created: 16-Aug-1993
|
||
* Author: Mark Enstrom Marke
|
||
*
|
||
* Copyright (c) 1993-1999 Microsoft Corporation
|
||
\**************************************************************************/
|
||
|
||
// We pass a pointer to this data struct for every rectangle we blt to.
|
||
|
||
typedef struct _BLTLNKINFO
|
||
{
|
||
//
|
||
// These first fields are all constant. They are set in StinkerBlt
|
||
// and don't change for each clip rect.
|
||
//
|
||
|
||
RECTL rclDst; // Target offset and extent
|
||
SURFACE *pdioDst; // Target surface
|
||
SURFACE *pdioSrc; // Source surface
|
||
SURFACE *pdioMsk; // Mask
|
||
ECLIPOBJ *pco; // Clip through this
|
||
XLATE *pxlo; // Color translation
|
||
EBRUSHOBJ *pdbrush; // Brush data (from cbRealizeBrush)
|
||
BYTE rop3; // Raster operation
|
||
|
||
LONG iDir; // Tells which way to enumerate the rects
|
||
LONG xDir; // This tells which direction we go
|
||
LONG yDir; // This tells which direction we go
|
||
PBYTE pjSrc; // This is pdioSrc->pvBitsInt(), top scanline
|
||
PBYTE pjDst; // This is pdioDst->pvBitsInt(), top scanline
|
||
PBYTE pjMsk; // This is pdioMsk->pvBitsInt(), top scanline
|
||
// or the msk from a brush.
|
||
PBYTE pjPat; // This is pdioPat->pvBitsInt(), top scanline
|
||
LONG lDeltaSrc; // How many bytes to jump down 1 scanline
|
||
LONG lDeltaDst; // How many bytes to jump down 1 scanline
|
||
LONG lDeltaPat; // How many bytes to jump down 1 scanline
|
||
LONG lDeltaMsk; // How many bytes to jump down 1 scanline
|
||
|
||
//
|
||
// The next four all have yDir taken into account.
|
||
//
|
||
|
||
LONG lDeltaSrcDir; // How many bytes to jump yDir scanline
|
||
LONG lDeltaDstDir; // How many bytes to jump yDir scanline
|
||
LONG lDeltaPatDir; // How many bytes to jump yDir scanline
|
||
LONG lDeltaMskDir; // How many bytes to jump yDir scanline
|
||
|
||
//
|
||
// This is the Src information
|
||
//
|
||
|
||
ULONG xSrcOrg;
|
||
ULONG ySrcOrg;
|
||
|
||
//
|
||
// This is the Pat information.
|
||
//
|
||
|
||
ULONG iSolidColor; // if not 0xFFFFFFFF then the color of the brush
|
||
ULONG cxPat; // width of brush
|
||
ULONG cyPat; // height of brush
|
||
LONG xPatOrg; // Where the brush origin is
|
||
LONG yPatOrg; // Where the brush origin is
|
||
|
||
//
|
||
// This is the Msk information.
|
||
//
|
||
|
||
ULONG cxMsk; // width of mask
|
||
LONG cyMsk; // height of mask
|
||
LONG xMskOrg; // Where the mask origin is
|
||
LONG yMskOrg; // Where the mask origin is
|
||
BYTE NegateMsk; // If 0xFF then negate mask when deciding whether to store
|
||
|
||
LONG xDstStart; // This is the number of pels in to start
|
||
LONG xSrcStart; // number of pels in to start, inclusive
|
||
LONG xSrcEnd; // the pel to stop at, exclusive
|
||
LONG xSrc; // left edge in src
|
||
LONG ySrc; // top edge in src
|
||
|
||
//
|
||
// This is the Rop info
|
||
//
|
||
|
||
ULONG RopSrc;
|
||
ULONG RopDst;
|
||
|
||
BOOL bNeedSrc;
|
||
BOOL bNeedDst;
|
||
BOOL bNeedPat;
|
||
BOOL bNeedMsk;
|
||
|
||
} BLTLNKINFO,*PBLTLNKINFO;
|
||
|
||
typedef struct _BLTLNK_MASKINFO {
|
||
PBYTE pjMsk;
|
||
PBYTE pjMskBase;
|
||
LONG cyMsk;
|
||
LONG iyMsk;
|
||
LONG cxMsk;
|
||
LONG ixMsk;
|
||
LONG lDeltaMskDir;
|
||
BYTE NegateMsk;
|
||
} BLTLNK_MASKINFO,*PBLTLNK_MASKINFO;
|
||
|
||
#define BB_RECT_LIMIT 20
|
||
|
||
BOOL
|
||
BltLnk(
|
||
SURFACE *pdioDst, // Target surface
|
||
SURFACE *pdioSrc, // Source surface
|
||
SURFACE *pdioMsk, // Mask
|
||
ECLIPOBJ *pco, // Clip through this
|
||
XLATE *pxlo, // Color translation
|
||
PRECTL prclDst, // Target offset and extent
|
||
PPOINTL pptlSrc, // Source offset
|
||
PPOINTL pptlMask, // Mask offset
|
||
BRUSHOBJ *pdbrush, // Brush data (from cbRealizeBrush)
|
||
PPOINTL pptlBrush, // Brush offset (origin)
|
||
ROP4 rop4 // Raster operation
|
||
);
|
||
|
||
typedef VOID (*PFN_BLTLNKROP)(PULONG,PULONG,PULONG,ULONG);
|
||
|
||
|
||
VOID
|
||
vRop2Function0(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function1(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function2(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function3(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function4(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function5(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function6(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function7(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function8(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2Function9(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionA(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionB(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionC(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionD(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionE(PULONG,PULONG,PULONG,ULONG);
|
||
VOID
|
||
vRop2FunctionF(PULONG,PULONG,PULONG,ULONG);
|
||
|
||
VOID
|
||
BltLnkSrcCopyMsk1(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
VOID
|
||
BltLnkSrcCopyMsk4(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
VOID
|
||
BltLnkSrcCopyMsk8(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
VOID
|
||
BltLnkSrcCopyMsk16(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
VOID
|
||
BltLnkSrcCopyMsk24(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
VOID
|
||
BltLnkSrcCopyMsk32(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
|
||
VOID
|
||
BltLnkPatMaskCopy1(PBLTINFO,ULONG,PULONG,BYTE);
|
||
VOID
|
||
BltLnkPatMaskCopy4(PBLTINFO,ULONG,PULONG,BYTE);
|
||
VOID
|
||
BltLnkPatMaskCopy8(PBLTINFO,ULONG,PULONG,BYTE);
|
||
VOID
|
||
BltLnkPatMaskCopy16(PBLTINFO,ULONG,PULONG,BYTE);
|
||
VOID
|
||
BltLnkPatMaskCopy24(PBLTINFO,ULONG,PULONG,BYTE);
|
||
VOID
|
||
BltLnkPatMaskCopy32(PBLTINFO,ULONG,PULONG,BYTE);
|
||
|
||
VOID
|
||
BltLnkRect(
|
||
PBLTLNKINFO pBlt,
|
||
PRECTL prcl
|
||
);
|
||
|
||
VOID BltLnkRead(
|
||
PULONG pulDst,
|
||
PULONG pulSrc,
|
||
ULONG cx
|
||
);
|
||
|
||
VOID BltLnkReadPat(
|
||
PBYTE pjDst,
|
||
ULONG ixDst,
|
||
PBYTE pjPat,
|
||
ULONG cxPat,
|
||
ULONG ixPat,
|
||
ULONG PixelCount,
|
||
ULONG BytesPerPixel
|
||
);
|
||
|
||
VOID
|
||
BltLnkReadPat1 (
|
||
PBYTE pjDst,
|
||
ULONG ixDst,
|
||
PBYTE pjPat,
|
||
ULONG cxPat,
|
||
ULONG ixPat,
|
||
ULONG PixelCount,
|
||
ULONG BytesPerPixel
|
||
);
|
||
VOID
|
||
BltLnkReadPat4 (
|
||
PBYTE pjDst,
|
||
ULONG ixDst,
|
||
PBYTE pjPat,
|
||
ULONG cxPat,
|
||
ULONG ixPat,
|
||
ULONG PixelCount,
|
||
ULONG BytesPerPixel
|
||
);
|
||
|
||
VOID
|
||
BltLnkAccel6666 (
|
||
PBYTE pjSrcStart,
|
||
PBYTE pjDstStart,
|
||
LONG lDeltaSrcDir,
|
||
LONG lDeltaDstDir,
|
||
LONG cx,
|
||
LONG cy
|
||
);
|
||
|
||
VOID
|
||
BltLnkAccel8888 (
|
||
PBYTE pjSrcStart,
|
||
PBYTE pjDstStart,
|
||
LONG lDeltaSrcDir,
|
||
LONG lDeltaDstDir,
|
||
LONG cx,
|
||
LONG cy
|
||
);
|
||
|
||
VOID
|
||
BltLnkAccelEEEE (
|
||
PBYTE pjSrcStart,
|
||
PBYTE pjDstStart,
|
||
LONG lDeltaSrcDir,
|
||
LONG lDeltaDstDir,
|
||
LONG cx,
|
||
LONG cy
|
||
);
|
||
|
||
typedef VOID (*PFN_SRCCOPYMASK)(PBLTINFO,PBLTLNK_MASKINFO,PULONG,PULONG);
|
||
typedef VOID (*PFN_READPAT)(PBYTE,ULONG,PBYTE,ULONG,ULONG,ULONG,ULONG);
|
||
|
||
typedef VOID (*PFN_PATMASKCOPY)(PBLTINFO,ULONG,PULONG,BYTE);
|
||
|