1/* === C R E D I T S & D I S C L A I M E R S ============== 2 * Permission is given by the author to freely redistribute and include 3 * this code in any program as long as this credit is given where due. 4 * 5 * CQuantizer (c) 1996-1997 Jeff Prosise 6 * 7 * 31/08/2003 Davide Pizzolato - www.xdp.it 8 * - fixed minor bug in ProcessImage when bpp<=8 9 * - better color reduction to less than 16 colors 10 * 11 * COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT 12 * WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT 13 * LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, 14 * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE 15 * RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. 16 * SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL 17 * DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY 18 * SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN 19 * ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED 20 * HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 21 * 22 * Use at your own risk! 23 * ========================================================== 24 * 25 * Modified for use with Haiku by David Powell & Stephan Aßmus. 26 */ 27#ifndef COLOR_QUANTIZER_H 28#define COLOR_QUANTIZER_H 29 30 31#include <SupportDefs.h> 32 33 34namespace BPrivate { 35 36typedef struct _RGBA { 37 uint8 b; 38 uint8 g; 39 uint8 r; 40 uint8 a; 41} RGBA; 42 43class BColorQuantizer { 44public: 45 BColorQuantizer(uint32 maxColors, 46 uint32 bitsPerColor); 47 virtual ~BColorQuantizer(); 48 49 bool ProcessImage(const uint8* const * rowPtrs, int width, 50 int height); 51 52 uint32 GetColorCount() const; 53 void GetColorTable(RGBA* table) const; 54 55private: 56 struct Node; 57 58private: 59 void _AddColor(Node** _node, uint8 r, uint8 g, uint8 b, 60 uint8 a, uint32 bitsPerColor, uint32 level, 61 uint32* _leafCount, Node** reducibleNodes); 62 Node* _CreateNode(uint32 level, uint32 bitsPerColor, 63 uint32* _leafCount, Node** reducibleNodes); 64 void _ReduceTree(uint32 bitsPerColor, uint32* _leafCount, 65 Node** reducibleNodes); 66 void _DeleteTree(Node** _node); 67 68 void _GetPaletteColors(Node* node, RGBA* table, 69 uint32* pIndex, uint32* pSum) const; 70 71private: 72 Node* fTree; 73 uint32 fLeafCount; 74 Node* fReducibleNodes[9]; 75 uint32 fMaxColors; 76 uint32 fOutputMaxColors; 77 uint32 fBitsPerColor; 78}; 79 80} // namespace BPrivate 81 82using BPrivate::BColorQuantizer; 83using BPrivate::RGBA; 84 85#endif // COLOR_QUANTIZER_H 86