#if !defined(QUANTIZER_H_) #define QUANTIZER_H_ struct NODE { BOOL bIsLeaf; long nPixelCount; long nRedSum; long nGreenSum; long nBlueSum; UINT nColorIndex; NODE* pChild[8]; NODE* pNext; }; class CQuantizer { public: CQuantizer(UINT nMaxColors, UINT nColorBits); ~CQuantizer(); BOOL ProcessImage(HANDLE hImage); UINT GetColorCount(); void SetColorTable(RGBQUAD* prgb); BOOL GetColorIndex(BYTE r, BYTE g, BYTE b, UINT* pColorIndex); protected: void AddColor(NODE** ppNode, BYTE r, BYTE g, BYTE b, UINT nColorBits, UINT nLevel, UINT* pLeafCount, NODE** pReducibleNodes); void* CreateNode(UINT nLevel, UINT nColorBits, UINT* pLeafCount, NODE** pReducibleNodes); void ReduceTree(UINT nColorBits, UINT* pLeafCount, NODE** pReducibleNodes); void DeleteTree(NODE** ppNode); void GetPaletteColors(NODE* pTree, RGBQUAD* prgb, UINT* pIndex); BOOL FindColorIndex(NODE* pNode, BYTE r, BYTE g, BYTE b, int nLevel, UINT* pColorIndex); BYTE GetPixelIndex(long x, long y, int nbit, long effwdt, BYTE* pimage); int m_nColorBits; UINT m_nLeafCount; int m_nMaxColors; NODE* m_pTree; NODE* m_pReducibleNodes[9]; }; class CRGBQuantizer : public CQuantizer { public: CRGBQuantizer(UINT nMaxColors, UINT nColorBits); BOOL ProcessImageRGB(BYTE* pRGBData, UINT nWidth, UINT nHeight); }; class CBitmapQuantizer : public CQuantizer { public: CBitmapQuantizer(UINT nMaxColors, UINT nColorBits); BOOL ProcessImageBitmap(HBITMAP hBmp); }; #endif