Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/WuQuantizer.cpp view on Meta::CPAN
///////////////////////////////////////////////////////////////////////
// C Implementation of Wu's Color Quantizer (v. 2)
// (see Graphics Gems vol. II, pp. 126-133)
//
// Author: Xiaolin Wu
// Dept. of Computer Science
// Univ. of Western Ontario
// London, Ontario N6A 5B7
// wu@csd.uwo.ca
//
// Algorithm: Greedy orthogonal bipartition of RGB space for variance
// minimization aided by inclusion-exclusion tricks.
// For speed no nearest neighbor search is done. Slightly
// better performance can be expected by more sophisticated
// but more expensive versions.
//
// The author thanks Tom Lane at Tom_Lane@G.GP.CS.CMU.EDU for much of
// additional documentation and a cure to a previous bug.
//
// Free to distribute, comments and suggestions are appreciated.
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// History
// -------
// July 2000: C++ Implementation of Wu's Color Quantizer
// and adaptation for the FreeImage 2 Library
// Author: Hervé Drolon (drolon@infonie.fr)
// March 2004: Adaptation for the FreeImage 3 library (port to big endian processors)
// Author: Hervé Drolon (drolon@infonie.fr)
///////////////////////////////////////////////////////////////////////
#include "Quantizers.h"
#include "FreeImage.h"
#include "Utilities.h"
///////////////////////////////////////////////////////////////////////
// Size of a 3D array : 33 x 33 x 33
#define SIZE_3D 35937
// 3D array indexation
#define INDEX(r, g, b) ((r << 10) + (r << 6) + r + (g << 5) + g + b)
#define MAXCOLOR 256
// Constructor / Destructor
WuQuantizer::WuQuantizer(FIBITMAP *dib) {
width = FreeImage_GetWidth(dib);
height = FreeImage_GetHeight(dib);
pitch = FreeImage_GetPitch(dib);
m_dib = dib;
gm2 = NULL;
wt = mr = mg = mb = NULL;
Qadd = NULL;
// Allocate 3D arrays
gm2 = (float*)malloc(SIZE_3D * sizeof(float));
wt = (LONG*)malloc(SIZE_3D * sizeof(LONG));
mr = (LONG*)malloc(SIZE_3D * sizeof(LONG));
mg = (LONG*)malloc(SIZE_3D * sizeof(LONG));
mb = (LONG*)malloc(SIZE_3D * sizeof(LONG));
// Allocate Qadd
Qadd = (WORD *)malloc(sizeof(WORD) * width * height);
if(!gm2 || !wt || !mr || !mg || !mb || !Qadd) {
if(gm2) free(gm2);
if(wt) free(wt);
if(mr) free(mr);
if(mg) free(mg);
if(mb) free(mb);
if(Qadd) free(Qadd);
throw FI_MSG_ERROR_MEMORY;
}
memset(gm2, 0, SIZE_3D * sizeof(float));
memset(wt, 0, SIZE_3D * sizeof(LONG));
memset(mr, 0, SIZE_3D * sizeof(LONG));
memset(mg, 0, SIZE_3D * sizeof(LONG));
memset(mb, 0, SIZE_3D * sizeof(LONG));
memset(Qadd, 0, sizeof(WORD) * width * height);
}
WuQuantizer::~WuQuantizer() {
if(gm2) free(gm2);
if(wt) free(wt);
if(mr) free(mr);
( run in 1.279 second using v1.01-cache-2.11-cpan-ceb78f64989 )