#ifndef shaveXPM_h #define shaveXPM_h // Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 #include #if MAYA_API_VERSION < 20180000 class MString; #endif class shaveXPM { public: struct Colour { unsigned char r; unsigned char g; unsigned char b; }; static bool write( int width, int height, const unsigned char* rgba, const MString& filename ); static MString toHex(unsigned char val); protected: class Node { public: Node( unsigned char irmin, unsigned char igmin, unsigned char ibmin, unsigned char irmax, unsigned char igmax, unsigned char ibmax ); static void addPixel( unsigned char r, unsigned char g, unsigned char b ); static void cleanup(); static void getColours(struct Colour* colours); static unsigned long getIndex( unsigned char r, unsigned char g, unsigned char b ); static void init(); static unsigned long numColours(); static unsigned long prune(unsigned long minError); protected: void doAddPixel( unsigned char r, unsigned char g, unsigned char b, unsigned short level ); void doCleanup(); void doGetColours(struct Colour* colours); unsigned long doGetIndex( unsigned char r, unsigned char g, unsigned char b ); bool doPrune(unsigned long minError, bool force); unsigned long index; unsigned long numPixels; unsigned long numLeafPixels; unsigned long sumLeafR; unsigned long sumLeafG; unsigned long sumLeafB; unsigned long quantError; unsigned char rmax; unsigned char rmid; unsigned char rmin; unsigned char gmax; unsigned char gmid; unsigned char gmin; unsigned char bmax; unsigned char bmid; unsigned char bmin; Node* child[8]; static Node* head; static unsigned long newMinError; static unsigned long nextIndex; static unsigned long numLeafNodes; }; }; inline unsigned long shaveXPM::Node::numColours() { return numLeafNodes; } #endif