--- ray/src/px/neuclrtab.c 1994/07/01 15:03:37 2.4 +++ ray/src/px/neuclrtab.c 2003/06/30 14:59:12 2.10 @@ -1,17 +1,16 @@ -/* Copyright (c) 1994 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: neuclrtab.c,v 2.10 2003/06/30 14:59:12 schorsch Exp $"; #endif - /* * Neural-Net quantization algorithm based on work of Anthony Dekker */ -#include "standard.h" +#include "copyright.h" -#include "color.h" +#include +#include "standard.h" +#include "color.h" #include "random.h" #ifdef COMPAT_MODE @@ -51,7 +50,9 @@ static long skipcount; #define setskip(sp,n) ((sp)[0]=(n)>>16,(sp)[1]=((n)>>8)&255,(sp)[2]=(n)&255) +static cpyclrtab(); + neu_init(npixels) /* initialize our sample array */ long npixels; { @@ -132,7 +133,7 @@ int ncolors; cpyclrtab(); inxbuild(); /* we're done with our samples */ - free((char *)thesamples); + free((void *)thesamples); /* reset dithering function */ neu_dith_colrs((BYTE *)NULL, (COLR *)NULL, 0); /* return new color table size */ @@ -172,7 +173,7 @@ int n; if (n != N) { /* get error propogation array */ if (N) { - free((char *)cerr); + free((void *)cerr); cerr = NULL; } if (n) @@ -183,7 +184,7 @@ int n; return; } N = n; - bzero((char *)cerr, 3*N*sizeof(short)); + memset((char *)cerr, '\0', 3*N*sizeof(short)); } err[0] = err[1] = err[2] = 0; for (x = 0; x < n; x++) { @@ -208,12 +209,18 @@ int n; } /* The following was adapted and modified from the original (GW) */ + +/* cheater definitions (GW) */ +#define thepicture thesamples +#define lengthcount (nsamples*3) +#define samplefac 1 + /*----------------------------------------------------------------------*/ /* */ /* NeuQuant */ /* -------- */ /* */ -/* Copyright: Anthony Dekker, June 1994 */ +/* Copyright: Anthony Dekker, November 1994 */ /* */ /* This program performs colour quantization of graphics images (SUN */ /* raster files). It uses a Kohonen Neural Network. It produces */ @@ -246,96 +253,92 @@ int n; /* Email: tdekker@iscs.nus.sg */ /*----------------------------------------------------------------------*/ -#define bool int -#define false 0 -#define true 1 +#define bool int +#define false 0 +#define true 1 -#define initrad 32 -#define radiusdec 30 -#define alphadec 30 +/* network defs */ +#define netsize clrtabsiz /* number of colours - can change this */ +#define maxnetpos (netsize-1) +#define netbiasshift 4 /* bias for colour values */ +#define ncycles 100 /* no. of learning cycles */ /* defs for freq and bias */ -#define gammashift 10 -#define betashift gammashift -#define intbiasshift 16 -#define intbias (1<>betashift) +#define intbiasshift 16 /* bias for fractions */ +#define intbias (((int) 1)<>betashift) /* beta = 1/1024 */ #define betagamma (intbias<<(gammashift-betashift)) -#define gammaphi (intbias<<(gammashift-8)) -/* defs for rad and alpha */ -#define maxrad (initrad+1) -#define radiusbiasshift 6 -#define radiusbias (1<>3) /* for 256 cols, radius starts */ +#define radiusbiasshift 6 /* at 32.0 biased by 6 bits */ +#define radiusbias (((int) 1)<>1; - for (j=previous+1; j>1; + for (j=previouscol+1; j>1; - for (j=previous+1; j>1; + for (j=previouscol+1; j<256; j++) netindex[j] = maxnetpos; /* really 256 */ } -static int -inxsearch(b,g,r) /* accepts real BGR values after net is unbiased */ +int inxsearch(b,g,r) /* accepts real BGR values after net is unbiased */ register int b,g,r; { - register int i,j,best,x,y,bestd; + register int i,j,dist,a,bestd; register int *p; + int best; bestd = 1000; /* biggest possible dist is 256*3 */ best = -1; i = netindex[g]; /* index on g */ - j = i-1; + j = i-1; /* start at netindex[g] and work outwards */ - while ((i=0)) { - if (i=0)) { + if (i= bestd) i = clrtabsiz; /* stop iter */ + dist = p[1] - g; /* inx key */ + if (dist >= bestd) i = netsize; /* stop iter */ else { i++; - if (x<0) x = -x; - y = p[0] - b; - if (y<0) y = -y; - x += y; - if (x=0) { p = network[j]; - x = g - p[1]; /* inx key - reverse dif */ - if (x >= bestd) j = -1; /* stop iter */ + dist = g - p[1]; /* inx key - reverse dif */ + if (dist >= bestd) j = -1; /* stop iter */ else { j--; - if (x<0) x = -x; - y = p[0] - b; - if (y<0) y = -y; - x += y; - if (x> netbiasshift not needed if funnyshift used */ - if (x>funnyshift); /* y holds biasd */ - if (y> betashift); /* y holds beta*freq */ - *p -= y; - *q += (y<>(intbiasshift-netbiasshift)); + if (biasdist> betashift); + *f++ -= betafreq; + *p++ += (betafreq<clrtabsiz) hi=clrtabsiz; + lo = i-rad; if (lo<-1) lo= -1; + hi = i+rad; if (hi>netsize) hi=netsize; j = i+1; k = i-1; @@ -495,58 +511,44 @@ register int b,g,r; } -static -altersingle(alpha,j,b,g,r) /* accepts biased BGR values */ -register int alpha,j,b,g,r; -{ - register int *q; - - q = network[j]; /* alter hit neuron */ - *q -= (alpha*(*q - b)) / initalpha; - q++; - *q -= (alpha*(*q - g)) / initalpha; - q++; - *q -= (alpha*(*q - r)) / initalpha; -} - - -static learn() { register int i,j,b,g,r; - int radius,rad,alpha,step,delta,upto; + int radius,rad,alpha,step,delta,samplepixels; register unsigned char *p; unsigned char *lim; - upto = lengthcount/(3*samplefac); - delta = upto/ncycles; - lim = thepicture + lengthcount; + alphadec = 30 + ((samplefac-1)/3); p = thepicture; + lim = thepicture + lengthcount; + samplepixels = lengthcount/(3*samplefac); + delta = samplepixels/ncycles; alpha = initalpha; radius = initradius; + rad = radius >> radiusbiasshift; if (rad <= 1) rad = 0; for (i=0; i= lim) p -= lengthcount; @@ -563,26 +565,30 @@ learn() } } -static +/* unbias network to give 0..255 entries */ +/* which can then be used for colour map */ +/* and record position i to prepare for sort */ + unbiasnet() { int i,j; - for (i=0; i>= netbiasshift; network[i][3] = i; /* record colour no */ } } -/* Don't do this until the network has been unbiased */ + +/* Don't do this until the network has been unbiased (GW) */ static cpyclrtab() { register int i,j,k; - for (j=0; j