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
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
|
|
);
|
|
|