Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/NNQuantizer.cpp view on Meta::CPAN
// NeuQuant Neural-Net Quantization Algorithm
// ------------------------------------------
//
// Copyright (c) 1994 Anthony Dekker
//
// NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994.
// See "Kohonen neural networks for optimal colour quantization"
// in "Network: Computation in Neural Systems" Vol. 5 (1994) pp 351-367.
// for a discussion of the algorithm.
//
// Any party obtaining a copy of these files from the author, directly or
// indirectly, is granted, free of charge, a full and unrestricted irrevocable,
// world-wide, paid up, royalty-free, nonexclusive right and license to deal
// in this software and documentation files (the "Software"), including without
// limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons who receive
// copies from any such party to do so, with the only requirement being
// that this copyright notice remain intact.
///////////////////////////////////////////////////////////////////////
// History
// -------
// January 2001: Adaptation of the Neural-Net Quantization Algorithm
// 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)
// April 2004: Algorithm rewritten as a C++ class.
// Fixed a bug in the algorithm with handling of 4-byte boundary alignment.
// Author: Hervé Drolon (drolon@infonie.fr)
///////////////////////////////////////////////////////////////////////
#include "Quantizers.h"
#include "FreeImage.h"
#include "Utilities.h"
// Four primes near 500 - assume no image has a length so large
// that it is divisible by all four primes
// ==========================================================
#define prime1 499
#define prime2 491
#define prime3 487
#define prime4 503
// ----------------------------------------------------------------
NNQuantizer::NNQuantizer(int PaletteSize)
{
netsize = PaletteSize;
maxnetpos = netsize - 1;
initrad = netsize < 8 ? 1 : (netsize >> 3);
initradius = (initrad * radiusbias);
network = NULL;
network = (pixel *)malloc(netsize * sizeof(pixel));
bias = (int *)malloc(netsize * sizeof(int));
freq = (int *)malloc(netsize * sizeof(int));
radpower = (int *)malloc(initrad * sizeof(int));
if( !network || !bias || !freq || !radpower ) {
if(network) free(network);
if(bias) free(bias);
if(freq) free(freq);
if(radpower) free(radpower);
throw FI_MSG_ERROR_MEMORY;
}
}
NNQuantizer::~NNQuantizer()
{
if(network) free(network);
if(bias) free(bias);
if(freq) free(freq);
if(radpower) free(radpower);
}
///////////////////////////////////////////////////////////////////////////
// Initialise network in range (0,0,0) to (255,255,255) and set parameters
// -----------------------------------------------------------------------
void NNQuantizer::initnet() {
int i, *p;
( run in 0.481 second using v1.01-cache-2.11-cpan-ceb78f64989 )