116 lines
3.8 KiB
C++
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
|