Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

476 lines
13 KiB

/******************************Module*Header*******************************\
* Module Name: alphablt.hxx
*
* This contains the prototypes for the alpha blending and gradient fill
*
* Created: 22-Feb-1997
* Author: Mark Enstrom
*
* Copyright (c) 1997-1999 Microsoft Corporation
*
\**************************************************************************/
//
// alpha blending DEBUG messages
//
#if DBG
extern ULONG DbgAlpha;
#define ALPHAMSG(level,s) \
if (DbgAlpha >= level) \
{ \
DbgPrint("%s\n",s); \
}
#else
#define ALPHAMSG(level,s)
#endif
//
// 5,6,5 and 5,5,5 bytes to rgb565 and rgb555
//
#define rgb555(r,g,b) (((WORD)(r) << 10) | ((WORD)(g) << 5) | (WORD)(b))
#define rgb565(r,g,b) (((WORD)(r) << 11) | ((WORD)(g) << 5) | (WORD)(b))
#define rgb565_to_r(p) (BYTE)((p & 0xf800) >> 11)
#define rgb565_to_g(p) (BYTE)((p & 0x07e0) >> 5)
#define rgb565_to_b(p) (BYTE)((p & 0x001f))
#define rgb555_to_r(p) (BYTE)((p & 0x7c00) >> 10)
#define rgb555_to_g(p) (BYTE)((p & 0x03e0) >> 5)
#define rgb555_to_b(p) (BYTE)((p & 0x001f))
//
// alpha blending color input/output and conversion
//
VOID vLoadAndConvert1ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvert4ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvert8ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvert16BitfieldsToBGRA(PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvertRGB16_555ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvertRGB16_565ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvertRGB24ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvertBGR24ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvert32BitfieldsToBGRA(PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vLoadAndConvertRGB32ToBGRA (PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
typedef VOID (*PFN_PIXLOAD_AND_CONVERT)(PULONG,PBYTE,LONG,LONG,XLATEOBJ*);
VOID vConvertAndSaveBGRATo1 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRATo4 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRATo8 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToRGB16_565 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToRGB16_555 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToRGB16Bitfields(PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToRGB24 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToBGR24 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRATo32Bitfields (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
VOID vConvertAndSaveBGRAToRGB32 (PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
typedef VOID(*PFN_PIXCONVERT_AND_STORE)(PBYTE,PULONG,LONG,LONG,XLATEOBJ *,XEPALOBJ,XEPALOBJ);
extern "C"
{
VOID vAlphaPerPixelAndConst(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID vAlphaPerPixelOnly(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID vAlphaConstOnly(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID vAlphaConstOnly16_555(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID vAlphaConstOnly16_565(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID vAlphaConstOnly24(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
}
#if defined (_X86_)
VOID mmxAlphaPerPixelOnly(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID mmxAlphaPerPixelAndConst(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID mmxAlphaConstOnly24(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID mmxAlphaConstOnly16_555(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
VOID mmxAlphaConstOnly16_565(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
#endif
typedef VOID (* PFN_GENERALBLEND)(PALPHAPIX,PALPHAPIX,LONG,BLENDFUNCTION);
//
// alpha blending call data
//
typedef struct _ALPHA_DISPATCH_FORMAT
{
ULONG ulDstBitsPerPixel;
ULONG ulSrcBitsPerPixel;
PFN_PIXLOAD_AND_CONVERT pfnLoadSrcAndConvert;
PFN_PIXLOAD_AND_CONVERT pfnLoadDstAndConvert;
PFN_PIXCONVERT_AND_STORE pfnConvertAndStore;
PFN_GENERALBLEND pfnGeneralBlend;
BLENDFUNCTION BlendFunction;
BOOL bUseMMX;
}ALPHA_DISPATCH_FORMAT,*PALPHA_DISPATCH_FORMAT;
//
// prototypes
//
PSURFACE
psSetupDstSurface(
PSURFACE pSurfDst,
PRECTL prclDst,
SURFMEM &surfTmpDst,
BOOL bForceDstAlloc,
BOOL bCopyFromDst
);
#define SOURCE_ALPHA 0
#define SOURCE_TRAN 1
PSURFACE
psSetupTransparentSrcSurface(
PSURFACE pSurfSrc,
PSURFACE pSurfDst,
PRECTL prclDst,
XLATEOBJ *pxloSrcTo32,
PRECTL prclSrc,
SURFMEM &surfTmpSrc,
ULONG ulSourceType,
ULONG ulTranColor
);
PSURFACE
psurfCreateDIBSurface(
HDC hdcDest,
LPBYTE pInitBits,
LPBITMAPINFO pInfoHeader,
DWORD iUsage,
UINT cjMaxInfo,
UINT cjMaxBits
);
//
// blend routines
//
BOOL
AlphaScanLineBlend(
PBYTE,
PRECTL,
LONG,
PBYTE,
LONG,
PPOINTL,
XLATEOBJ*,
XLATEOBJ*,
XLATEOBJ*,
XEPALOBJ,
XEPALOBJ,
PALPHA_DISPATCH_FORMAT
);
//
// GradientFill
//
extern LONG DitherMatrix[];
extern BOOL gbMMXProcessor;
BOOL bIsMMXProcessor(VOID);
PSURFACE
psSetupDstSurface(
PSURFACE pSurfDst,
PRECTL prclDst,
SURFMEM &surfTmpDst,
BOOL bForceDstAlloc,
BOOL *bAllocDstSurf
);
#define SOURCE_ALPHA 0
#define SOURCE_TRAN 1
PSURFACE
psSetupTransparentSrcSurface(
PSURFACE pSurfSrc,
PSURFACE pSurfDst,
PRECTL prclDst,
XLATEOBJ *pxloSrcTo32,
PRECTL prclSrc,
SURFMEM &surfTmpSrc,
BOOL *bAllocSrcSurf,
ULONG ulSourceType,
ULONG ulTranColor
);
/**************************************************************************\
* GRADIENTRECTDATA
*
*
* color gradient information for gradient fill rectangles
*
*
* History:
*
* 2/11/1997 Mark Enstrom [marke]
*
\**************************************************************************/
typedef struct _GRADIENTRECTDATA
{
RECTL rclClip;
RECTL rclGradient;
POINTL ptDraw;
SIZEL szDraw;
ULONGLONG llRed;
ULONGLONG llGreen;
ULONGLONG llBlue;
ULONGLONG llAlpha;
LONGLONG lldRdY;
LONGLONG lldGdY;
LONGLONG lldBdY;
LONGLONG lldAdY;
LONGLONG lldRdX;
LONGLONG lldGdX;
LONGLONG lldBdX;
LONGLONG lldAdX;
POINTL ptDitherOrg;
ULONG ulMode;
XLATEOBJ *pxlo;
XEPALOBJ *ppalDstSurf;
LONG xScanAdjust;
LONG yScanAdjust;
}GRADIENTRECTDATA,*PGRADIENTRECTDATA;
/**************************************************************************\
* COLOR_INTERP
*
* Color interpolation is done in fixed point 8.56 (tri) or 8.48 (rect)
* This union makes it faster to get int pixel.
*
\**************************************************************************/
typedef union _COLOR_INTERP
{
ULONGLONG ullColor;
ULONG ul[2];
BYTE b[8];
}COLOR_INTERP,*PCOLOR_INTERP;
/**************************************************************************\
* TRIEDGE
*
* Tirangle gradient fill: record left and right edge of each scan
* line. Also record starting color for left edge of scan line. Color
* gradient is stored in TRIANGLEDATA
*
* History:
*
* 2/20/1997 Mark Enstrom [marke]
*
\**************************************************************************/
typedef struct _TRIEDGE
{
LONG xLeft;
LONG xRight;
LONGLONG llRed;
LONGLONG llGreen;
LONGLONG llBlue;
LONGLONG llAlpha;
}TRIEDGE,*PTRIEDGE;
/**************************************************************************\
* TRIANGLEDATA
*
* Color gradient and scan line information needed to gradient fill
* triangle
*
* History:
*
* 2/20/1997 Mark Enstrom [marke]
*
\**************************************************************************/
typedef struct _TRIANGLEDATA
{
RECTL rcl;
LONGLONG lldRdX;
LONGLONG lldGdX;
LONGLONG lldBdX;
LONGLONG lldAdX;
LONGLONG lldRdY;
LONGLONG lldGdY;
LONGLONG lldBdY;
LONGLONG lldAdY;
LONGLONG llRA;
LONGLONG llGA;
LONGLONG llBA;
LONGLONG llAA;
LONG y0;
LONG y1;
LONGLONG Area;
POINTL ptDitherOrg;
POINTL ptColorCalcOrg;
LONG DrawMode;
XLATEOBJ *pxlo;
XEPALOBJ *ppalDstSurf;
TRIEDGE TriEdge[1];
}TRIANGLEDATA,*PTRIANGLEDATA;
/**************************************************************************\
* TRIANGLEDATA
*
* This structure contains stuff common to all the triangle interpolations
*
*
* x1 -
* x2 -
* y1 -
* y2 -
* m - min(x_i - x_0) + min(y_i - y_0);
* d - determinant
* Q - floor(D/abs(d));
* R - D mod abs(d);
*
* History:
*
* 5/20/1997 Kirko
*
\**************************************************************************/
typedef struct _GRADSTRUCT {
LONG x1;
LONG x2;
LONG y1;
LONG y2;
LONG m;
LONG d;
LONGLONG Q;
LONGLONG R;
} GRADSTRUCT;
//
// constant in triangle color gradient calc
//
#define TWO_TO_THE_48TH 0x0001000000000000
//
// maximum edge of triangle before it must be split
//
// 2^16
//
#define MAX_EDGE_LENGTH 16384
/**************************************************************************\
* TRIDDA - data to run line DDAs for generating triangle endpoints
*
*
* History:
*
* 2/20/1997 Mark Enstrom [marke]
*
\**************************************************************************/
typedef struct _TRIDDA
{
LONG M0; // Initial X Device space
LONG N0; // Initial Y Device spave
LONG dM; // Delta X
LONG dN; // Delta Y
LONGLONG C; // Initial Error Constant
LONG dL; // Interger component of delta X
LONG dR; // Remainder component of delta X
LONG R; // Remainder
LONG Rb; // Remainder used to compare with 0
LONG L; // Temp
LONG j; // Temp
LONG Linc; // X inc (pos or neg)
LONG yIndex; // Current index into line array
LONG NumScanLines; // Number of scan lines to run
LONG t0; // place holder
LONGLONG llRed; // Current Color
LONGLONG llGreen; // Current Color
LONGLONG llBlue; // Current Color
LONGLONG llAlpha; // Current Color
LONGLONG lldxyRed; // Combined integer change for step in x and y
LONGLONG lldxyGreen; // Combined integer change for step in x and y
LONGLONG lldxyBlue; // Combined integer change for step in x and y
LONGLONG lldxyAlpha; // Combined integer change for step in x and y
}TRIDDA,*PTRIDDA;
#define SWAP_VERTEX(pv0,pv1,pvt) \
{ \
pvt = pv0; \
pv0 = pv1; \
pv1 = pvt; \
}
VOID vGradientFillGeneric(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill1(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill4(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill8(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill16_565(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill16_555(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill16Bitfields(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill24RGB(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill24BGR(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill24Bitfields(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill32BGRA(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill32RGB(SURFACE *,PTRIANGLEDATA);
VOID vGradientFill32Bitfields(SURFACE *,PTRIANGLEDATA);
typedef VOID (*PFN_GRADIENT)(SURFACE *,PTRIANGLEDATA);
VOID vFillGRectDIB32BGRA(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB32RGB(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB32Bitfields(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB24RGB(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB24BGR(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB24Bitfields(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB16_565(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB16_555(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB16Bitfields(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB8(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB4(SURFACE *,PGRADIENTRECTDATA);
VOID vFillGRectDIB1(SURFACE *,PGRADIENTRECTDATA);
typedef VOID (*PFN_GRADRECT)(SURFACE *,PGRADIENTRECTDATA);
BOOL
bDoGradient(
LONGLONG *pA,
LONGLONG *pB,
LONGLONG *pC,
LONG g0,
LONG g1,
LONG g2,
GRADSTRUCT *pg
);
BOOL
bIsSourceBGRA(
PSURFACE pSurf
);