86 lines
2.5 KiB
C
86 lines
2.5 KiB
C
|
/* === C R E D I T S & D I S C L A I M E R S ==============
|
||
|
* Permission is given by the author to freely redistribute and include
|
||
|
* this code in any program as long as this credit is given where due.
|
||
|
*
|
||
|
* CQuantizer (c) 1996-1997 Jeff Prosise
|
||
|
*
|
||
|
* 31/08/2003 Davide Pizzolato - www.xdp.it
|
||
|
* - fixed minor bug in ProcessImage when bpp<=8
|
||
|
* - better color reduction to less than 16 colors
|
||
|
*
|
||
|
* COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT
|
||
|
* WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
|
||
|
* LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS,
|
||
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
|
||
|
* RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU.
|
||
|
* SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL
|
||
|
* DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
|
||
|
* SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
|
||
|
* ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED
|
||
|
* HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||
|
*
|
||
|
* Use at your own risk!
|
||
|
* ==========================================================
|
||
|
*
|
||
|
* Modified for use with Haiku by David Powell & Stephan Aßmus.
|
||
|
*/
|
||
|
#ifndef COLOR_QUANTIZER_H
|
||
|
#define COLOR_QUANTIZER_H
|
||
|
|
||
|
|
||
|
#include <SupportDefs.h>
|
||
|
|
||
|
|
||
|
namespace BPrivate {
|
||
|
|
||
|
typedef struct _RGBA {
|
||
|
uint8 b;
|
||
|
uint8 g;
|
||
|
uint8 r;
|
||
|
uint8 a;
|
||
|
} RGBA;
|
||
|
|
||
|
class BColorQuantizer {
|
||
|
public:
|
||
|
BColorQuantizer(uint32 maxColors,
|
||
|
uint32 bitsPerColor);
|
||
|
virtual ~BColorQuantizer();
|
||
|
|
||
|
bool ProcessImage(const uint8* const * rowPtrs, int width,
|
||
|
int height);
|
||
|
|
||
|
uint32 GetColorCount() const;
|
||
|
void GetColorTable(RGBA* table) const;
|
||
|
|
||
|
private:
|
||
|
struct Node;
|
||
|
|
||
|
private:
|
||
|
void _AddColor(Node** _node, uint8 r, uint8 g, uint8 b,
|
||
|
uint8 a, uint32 bitsPerColor, uint32 level,
|
||
|
uint32* _leafCount, Node** reducibleNodes);
|
||
|
Node* _CreateNode(uint32 level, uint32 bitsPerColor,
|
||
|
uint32* _leafCount, Node** reducibleNodes);
|
||
|
void _ReduceTree(uint32 bitsPerColor, uint32* _leafCount,
|
||
|
Node** reducibleNodes);
|
||
|
void _DeleteTree(Node** _node);
|
||
|
|
||
|
void _GetPaletteColors(Node* node, RGBA* table,
|
||
|
uint32* pIndex, uint32* pSum) const;
|
||
|
|
||
|
private:
|
||
|
Node* fTree;
|
||
|
uint32 fLeafCount;
|
||
|
Node* fReducibleNodes[9];
|
||
|
uint32 fMaxColors;
|
||
|
uint32 fOutputMaxColors;
|
||
|
uint32 fBitsPerColor;
|
||
|
};
|
||
|
|
||
|
} // namespace BPrivate
|
||
|
|
||
|
using BPrivate::BColorQuantizer;
|
||
|
using BPrivate::RGBA;
|
||
|
|
||
|
#endif // COLOR_QUANTIZER_H
|