/*++ Copyright (c) 1990-1993 Microsoft Corporation Module Name: htalias.h Abstract: This module contains defines and structure for anti-aliasing Author: 09-Apr-1998 Thu 20:25:29 created -by- Daniel Chou (danielc) [Environment:] GDI Device Driver - Plotter. [Notes:] Revision History: --*/ #ifndef _HTALIAS_ #define _HTALIAS_ #define XCHG(a,b,t) { (t)=(a); (a)=(b); (b)=(t); } #define DI_R_SHIFT 13 #define DI_MAX_NUM (0x0001 << DI_R_SHIFT) #define DI_NUM_MASK (DI_MAX_NUM - 1) #define DI_MUL_SHIFT (DI_R_SHIFT >> 1) #define MUL_TABLE_SIZE (DI_MUL_SHIFT * 256 * sizeof(LONG)) #define AABF_MASK_IS_ORDER 0x01 #define AABF_SRC_IS_BGR8 0x02 #define AABF_SRC_IS_BGR_ALPHA 0x04 #define AABF_SRC_IS_RGB_ALPHA 0x08 typedef struct _AABFDATA { BYTE Flags; BYTE Format; BYTE MaskRGB[3]; BYTE LShiftRGB[3]; BYTE RShiftRGB[3]; BYTE cbSrcInc; } AABFDATA, *PAABFDATA; #define GET_FIRST_EDMUL(em, m, n, t) \ { \ (n) = ((LONGLONG)(m) * (LONGLONG)DI_MAX_NUM); \ (em) = (WORD)((n) / (LONGLONG)(t)); \ } #define GET_NEXT_EDMUL(em, m, n, t) \ { \ (n) = ((LONGLONG)(m) * (LONGLONG)DI_MAX_NUM) + ((n) % (LONGLONG)(t)); \ (em) = (WORD)((n) / (LONGLONG)(t)); \ } #define SDF_LARGE_MUL (0x0001 << (DI_R_SHIFT + 2)) #define SDF_DONE (0x0001 << (DI_R_SHIFT + 1)) #define SDF_MUL_MASK (0xFFFF >> (15 - DI_R_SHIFT)) #define GET_SDF_LARGE_MASK(m) (BYTE)((SHORT)(m) >> 15) #define GET_SDF_LARGE_INC(m) (UINT)((m) >> 15) #define GET_SDF_LARGE_OFF(m) (((UINT)(m) >> ((DI_R_SHIFT+2)-10)) & 0x400) typedef struct _SHRINKDATA { WORD Mul; } SHRINKDATA, *PSHRINKDATA; #define EDF_LOAD_PIXEL 0x8000 #define EDF_NO_NEWSRC 0x4000 typedef struct _EXPDATA { WORD Mul[4]; } EXPDATA, *PEXPDATA; #define AAIF_EXP_HAS_1ST_LEFT 0x0001 #define AAIF_EXP_NO_LAST_RIGHT 0x0002 #define AAIF_EXP_NO_SHARPEN 0x0004 typedef struct _REPDATA { WORD c; } REPDATA, *PREPDATA; typedef struct _SRCBLTINFO { LONG cIn; LONG cOut; LONG iBeg; LONG iSize; LONG iSrcBeg; LONG iSrcEnd; LONG iDstBeg; LONG iDstEnd; BYTE cPrevSrc; BYTE cNextSrc; BYTE cFirstSkip; BYTE cLastSkip; PREPDATA pRep; PREPDATA pRepEnd; DWORD cRep; } SRCBLTINFO, *PSRCBLTINFO; typedef struct _AAINFO { LONG cIn; // Input pixels Count LONG cOut; // Output Pixel Count WORD Flags; // AAIF_xxxx WORD PreSrcInc; // For shrinking WORD cPreLoad; // Preload WORD PreMul; // pre mul for shrinking DWORD cAAData; union { DWORD cAALoad; // for expand, blt DWORD cAADone; // for shrinking } DUMMYUNIONNAME2; union { PLONG pMapMul; // use by SHRINK DWORD cMaxMul; // use by EXPAND LONG iSrcBeg; // use by TILE (Offset for the first one) } DUMMYUNIONNAME3; LPBYTE pbExtra; // extra buffer allocated LPVOID pAAData; // either PEXPDATA or PSHRINKDATA SRCBLTINFO Src; SRCBLTINFO Mask; SRCBLTINFO AB; #if DBG DWORD cbAlloc; // allocating size #endif } AAINFO, *PAAINFO; typedef VOID (HTENTRY *AACXFUNC)(PAAINFO pAAInfo, PBGR8 pIn, PBGR8 pOut, LPBYTE pOutEnd, LONG OutInc); typedef LONG (HTENTRY *AACYFUNC)(struct _AAHEADER *pAAHdr); typedef PBGR8 (HTENTRY *AAINPUTFUNC)(struct _AASURFINFO *pAASI, PBGR8 pInBuf); #define XLATE_666_IDX_OR 0x01 #define XLATE_RGB_IDX_OR 0x02 #define XLATE_IDX_MASK (XLATE_RGB_IDX_OR | XLATE_666_IDX_OR) #define XLATE_IDX_MAX 3 typedef struct _BM8BPPDATA { BYTE pXlateIdx; BYTE bXor; BYTE bBlack; BYTE bWhite; } BM8BPPDATA, *PBM8BPPDATA; typedef union _BM8BPPINFO { DWORD dw; BYTE b4[4]; BM8BPPDATA Data; } BM8BPPINFO, *PBM8BPPINFO; typedef struct _AABGRINFO { BYTE Order; BYTE iR; BYTE iG; BYTE iB; } AABGRINFO; typedef struct AABITMASKINFO { BYTE cFirst; BYTE XorMask; BYTE LSFirst; BYTE cLast; } AABITMASKINFO; typedef struct _AAOUTPUTINFO { union { AABITMASKINFO bm; AABGRINFO bgri; BM8BPPINFO bm8i; LPBYTE pXlate8BPP; PCMY8BPPMASK pCMY8BPPMask; BYTE b4[4]; WORD w2[2]; DWORD dw; } DUMMYUNIONNAME; } AAOUTPUTINFO, *PAAOUTPUTINFO; typedef VOID (HTENTRY *AAOUTPUTFUNC)(struct _AAHEADER *pAAHdr, PBGRF pInBeg, PBGRF pInEnd, LPBYTE pDst, PLONG pIdxBGR, LPBYTE pbPat, LPBYTE pbPatEnd, LONG cbWrapBGR, AAOUTPUTINFO AAOutputInfo); typedef VOID (HTENTRY *AAMASKFUNC)(struct _AAHEADER *pAAHdr); #define FAST_MAX_CX 5 #define FAST_MAX_CY 5 #define AAHF_FLIP_X 0x00000001 #define AAHF_FLIP_Y 0x00000002 #define AAHF_ADDITIVE 0x00000004 #define AAHF_DO_SRC_CLR_MAPPING 0x00000008 #define AAHF_DO_DST_CLR_MAPPING 0x00000010 #define AAHF_GET_LAST_SCAN 0x00000020 #define AAHF_DO_FIXUPDIB 0x00000040 #define AAHF_HAS_MASK 0x00000080 #define AAHF_INVERT_MASK 0x00000100 #define AAHF_BBPF_AA_OFF 0x00000200 #define AAHF_TILE_SRC 0x00000400 #define AAHF_ALPHA_BLEND 0x00000800 #define AAHF_CONST_ALPHA 0x00001000 #define AAHF_OR_AV 0x00002000 #define AAHF_FAST_EXP_AA 0x00004000 #define AAHF_SHRINKING 0x00080000 #define AAHF_AB_DEST 0x00100000 #define AAHF_USE_DCI_DATA 0x80000000 #define AAHF_DO_CLR_MAPPING (AAHF_DO_SRC_CLR_MAPPING | \ AAHF_DO_DST_CLR_MAPPING) #define PBGRF_MASK_FLAG 0xFF #define PBGRF_END_FLAG 0xED #define PBGRF_HAS_MASK(p) ((p)->f) typedef struct _FIXUPDIBINFO { PBGR8 prgbD[6]; DWORD cbbgr; LONG cyIn; #if DBG LONG cCorner; LONG cChecker; #endif } FIXUPDIBINFO; #define AASIF_TILE_SRC 0x01 #define AASIF_INC_PB 0x02 #define AASIF_GRAY 0x04 #define AASIF_AB_PREMUL_SRC 0x08 typedef struct _AASURFINFO { BYTE Flags; BYTE BitOffset; WORD cClrTable; PLONG pIdxBGR; AAINPUTFUNC InputFunc; LPBYTE pbOrg; LONG cyOrg; LPBYTE pb; LONG cx; LONG cy; LONG cbCX; LONG cyNext; AABFDATA AABFData; PRGB4B pClrTable; } AASURFINFO, *PAASURFINFO; typedef struct _AAHEADER { DWORD Flags; BYTE MaskBitOff; BYTE bReserved[3]; AASURFINFO SrcSurfInfo; AASURFINFO DstSurfInfo; AAMASKFUNC AAMaskCXFunc; AAMASKFUNC AAMaskCYFunc; LONG cbMaskSrc; LPBYTE pMaskSrc; LPBYTE pMaskIn; LONG cyMaskNext; LONG cyMaskIn; AAMASKFUNC GetAVCXFunc; AAMASKFUNC GetAVCYFunc; PBGRF pbgrfAB; LONG cybgrfAB; LONG cyABNext; LPBYTE pbFixupDIB; AAOUTPUTFUNC AAOutputFunc; AAOUTPUTINFO AAOutputInfo; AACXFUNC AACXFunc; AACYFUNC AACYFunc; PAAINFO pAAInfoCX; PAAINFO pAAInfoCY; LPBYTE pOutLast; POINTL ptlBrushOrg; LPBYTE pAlphaBlendBGR; LPBYTE pSrcAV; LPBYTE pSrcAVBeg; LPBYTE pSrcAVEnd; LONG SrcAVInc; PRGBLUTAA prgbLUT; PLONG pIdxBGR; PBGR8 pBGRMapTable; LPBYTE pXlate8BPP; AAPATINFO AAPI; FIXUPDIBINFO FUDI; PBGR8 pInputBeg; // For input the source PBGRF pRealOutBeg; // original output buffer begin PBGRF pRealOutEnd; // original output buffer end PBGRF pOutputBeg; // for output to the destination the PBGRF pOutputEnd; // pOutputEnd (will be modified) PBGRF pAABufBeg; // for temporary anti-aliasing storage PBGRF pAABufEnd; // This is exclusive LONG AABufInc; // Buffer increment (may be negative) #if DBG DWORD cbAlloc; LPBYTE pOutBeg; LPBYTE pOutEnd; #endif } AAHEADER, *PAAHEADER; typedef PAAINFO (HTENTRY *AABUILDFUNC)(PDEVICECOLORINFO pDCI, DWORD AAHFlags, PLONG piSrcBeg, PLONG piSrcEnd, LONG SrcSize, LONG cOut, LONG IdxDst, PLONG piDstBeg, PLONG piDstEnd, LONG cbExtra); #define AACYMODE_TILE 0 #define AACYMODE_BLT 1 #define AACYMODE_SHRINK 2 #define AACYMODE_SHRINK_SRKCX 3 #define AACYMODE_EXPAND 4 #define AACYMODE_EXPAND_EXPCX 5 #define AACYMODE_NONE 0xFF #define AACXMODE_BLT 0 #define AACXMODE_SHRINK 1 #define AACXMODE_EXPAND 2 typedef struct _AABBP { DWORD AAHFlags; BYTE CYFuncMode; BYTE CXFuncMode; WORD wReserved; AACXFUNC AACXFunc; AABUILDFUNC AABuildCXFunc; AABUILDFUNC AABuildCYFunc; AAMASKFUNC AAMaskCXFunc; AAMASKFUNC AAMaskCYFunc; AAMASKFUNC GetAVCXFunc; AAMASKFUNC GetAVCYFunc; RECTL rclSrc; // original source, not well ordered RECTL rclDst; // Final destination, well ordered RECTL rclDstOrg; // Original Destination, well ordered POINTL ptlFlip; // flipping's substraction LONG cxDst; LONG cyDst; POINTL ptlBrushOrg; POINTL ptlMask; // Final source mask offset } AABBP, *PAABBP; // // Function prototype // VOID HTENTRY SetGrayColorTable( PLONG pIdxBGR, PAASURFINFO pAASI ); VOID HTENTRY GetColorTable( PHTSURFACEINFO pSrcSI, PAAHEADER pAAHdr, PBFINFO pBFInfo ); VOID HTENTRY ComputeInputColorInfo( LPBYTE pSrcTable, UINT cPerTable, UINT PrimaryOrder, PBFINFO pBFInfo, PAASURFINFO pAASI ); LONG HTENTRY SetupAAHeader( PHALFTONERENDER pHR, PDEVICECOLORINFO pDCI, PAAHEADER pAAHdr, AACYFUNC *pAACYFunc ); #endif // _HTALIAS_