Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImage/NNQuantizer.cpp view on Meta::CPAN
// 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;
for (i = 0; i < netsize; i++) {
p = network[i];
p[FI_RGBA_BLUE] = p[FI_RGBA_GREEN] = p[FI_RGBA_RED] = (i << (netbiasshift+8))/netsize;
freq[i] = intbias/netsize; /* 1/netsize */
bias[i] = 0;
}
}
///////////////////////////////////////////////////////////////////////////////////////
// Unbias network to give byte values 0..255 and record position i to prepare for sort
// ------------------------------------------------------------------------------------
void NNQuantizer::unbiasnet() {
int i, j, temp;
for (i = 0; i < netsize; i++) {
for (j = 0; j < 3; j++) {
// OLD CODE: network[i][j] >>= netbiasshift;
// Fix based on bug report by Juergen Weigert jw@suse.de
temp = (network[i][j] + (1 << (netbiasshift - 1))) >> netbiasshift;
if (temp > 255) temp = 255;
network[i][j] = temp;
}
network[i][3] = i; // record colour no
}
}
//////////////////////////////////////////////////////////////////////////////////
// Insertion sort of network and building of netindex[0..255] (to do after unbias)
// -------------------------------------------------------------------------------
void NNQuantizer::inxbuild() {
int i,j,smallpos,smallval;
int *p,*q;
int previouscol,startpos;
previouscol = 0;
startpos = 0;
for (i = 0; i < netsize; i++) {
p = network[i];
smallpos = i;
smallval = p[FI_RGBA_GREEN]; // index on g
( run in 0.552 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )