#ifndef _PalMap_h #define _PalMap_h // File: PalMap.h // Author: Michael Marr (mikemarr) // // Description: // This class helps perform on-the-fly pixel conversions. // // History: // -@- 11/18/96 (mikemarr) created // -@- 12/05/96 (mikemarr) modified // added code for translating all palettes to 8, 16, 24, and 32 bit; // transparency/alpha stuff is not yet implemented // -@- 06/24/97 (mikemarr) modified // removed PixelInfo // -@- 09/23/97 (mikemarr) copied to DXCConv from d2d\mmimage // // Notes: // REVIEW: // I probably will never support a 4 bit mode, since 4 bit stuff might // as well be stored as 8 bit since the space savings is small. However, // 2 and 1 bit stuff should still be considered, since the space savings // could be substantial. Further, 1 and 2 bit surfaces represent a large // class of content - line art, text, FAX, etc. (2 bits buys BGW + // transparency for example). This type of content tends to be much larger // in dimension -- so we need an efficient representation. #ifndef _PixInfo_h #include "PixInfo.h" #endif typedef WORD MapEntry16; typedef DWORD MapEntry24; typedef DWORD MapEntry32; #define flagTRANSPARENT 0x1 #define flagPALETTIZED 0x2 #define nMAXPALETTEENTRIES 256 typedef enum ConvertCode { cvc4To8 = 0, cvc4To16, cvc4To24, cvc4To32, cvc8To8, cvc8To16, cvc8To24, cvc8To32, cvcInvalid, cvcNumCodes } ConvertCode; typedef HRESULT (*ConvertFunction)(const BYTE *pSrcPixels, long nSrcPitch, BYTE *pDstPixels, long nDstPitch, DWORD nWidth, DWORD nHeight, const BYTE *pIndexMap); typedef DWORD (*GetColorFunction)(DWORD dwSrcColor, const BYTE *pIndexMap); extern ConvertFunction g_rgConvertFunctions[cvcNumCodes]; class CPaletteMap { public: CPaletteMap(); ~CPaletteMap(); HRESULT CreateMap(BYTE nBPPSrcPixels, BYTE nBPPSrcPalette, LPPALETTEENTRY rgpeSrc, const CPixelInfo &pixiDst, LPDIRECTDRAWPALETTE pddpDst); HRESULT CreateMap(LPDIRECTDRAWPALETTE pddpSrc, const CPixelInfo &pixiDst, LPDIRECTDRAWPALETTE pddpDst); // HRESULT CreateSortedMap(BYTE nBPP, const RGB *rgrgbSrc, BYTE nBPPUsed, DWORD iTransColor, // DWORD dwFlags, LPPALETTEENTRY rgpeDst); HRESULT BltFast(LPDIRECTDRAWSURFACE pddsSrc, LPRECT prSrc, LPDIRECTDRAWSURFACE pddsDst, DWORD nXPos, DWORD nYPos, DWORD dwFlags) const; // REVIEW: this is not "clip-safe" HRESULT BltFast(const BYTE *pSrcPixels, long nSrcPitch, BYTE *pDstPixels, long nDstPitch, DWORD nWidth, DWORD nHeight); DWORD GetIndexMapping(DWORD iSrcColor) const; DWORD GetSrcBPP() const { return m_cSrcBPP; } DWORD GetDstBPP() const { return m_cDstBPP; } BOOL IsIdentity() const { return m_bIdentity; } private: HRESULT DoPalTo16BitMap(BYTE nSrcBPP, const CPixelInfo &pixiDst, const PALETTEENTRY *ppeSrc); HRESULT DoPalTo24BitMap(BYTE nSrcBPP, const CPixelInfo &pixiDst, const PALETTEENTRY *ppeSrc); HRESULT DoPalTo32BitMap(BYTE nSrcBPP, const CPixelInfo &pixiDst, const PALETTEENTRY *ppeSrc); HRESULT DoPalToPalMap(BYTE nSrcBPP, BYTE nDstBPP, const PALETTEENTRY *ppeSrc, const PALETTEENTRY *ppeDst); static int GetConvertCode(DWORD nSrcBPP, DWORD nDstBPP); private: BYTE * m_rgIndexMap; BYTE m_nConvertCode; // REVIEW: we don't need to store the src and dst info ==> implicit in ConvertCode BYTE m_cSrcBPP, m_cDstBPP; BYTE m_bIdentity; }; inline HRESULT CPaletteMap::BltFast(const BYTE *pSrcPixels, long nSrcPitch, BYTE *pDstPixels, long nDstPitch, DWORD nWidth, DWORD nHeight) { ConvertFunction pfnConvertFunction = g_rgConvertFunctions[m_nConvertCode]; if (pfnConvertFunction) return pfnConvertFunction(pSrcPixels, nSrcPitch, pDstPixels, nDstPitch, nWidth, nHeight, m_rgIndexMap); return E_NOTIMPL; } #endif