Windows2003-3790/windows/advcore/gdiplus/test/simpsons/palmap.h
2020-09-30 16:53:55 +02:00

116 lines
3.8 KiB
C++

#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