uGIF.NeuQuant.Learn C# (CSharp) Method

Learn() private method

private Learn ( ) : void
return void
        void Learn()
        {
            int i, j, b, g, r;
            int radius, rad, alpha, step, delta, samplepixels;

            int pix, lim;

            if (lengthcount < minpicturebytes)
                samplefac = 1;
            alphadec = 30 + ((samplefac - 1) / 3);
            var p = thepicture;
            pix = 0;
            lim = lengthcount;
            samplepixels = lengthcount / (3 * samplefac);
            delta = samplepixels / ncycles;
            alpha = initalpha;
            radius = initradius;

            rad = radius >> radiusbiasshift;
            if (rad <= 1)
                rad = 0;
            for (i = 0; i < rad; i++)
                radpower [i] =
                    alpha * (((rad * rad - i * i) * radbias) / (rad * rad));

            //fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);

            if (lengthcount < minpicturebytes)
                step = 3;
            else if ((lengthcount % prime1) != 0)
                step = 3 * prime1;
            else {
                if ((lengthcount % prime2) != 0)
                    step = 3 * prime2;
                else {
                    if ((lengthcount % prime3) != 0)
                        step = 3 * prime3;
                    else
                        step = 3 * prime4;
                }
            }

            i = 0;
            while (i < samplepixels) {
                b = (p [pix].r & 0xff) << netbiasshift;
                g = (p [pix].g & 0xff) << netbiasshift;
                r = (p [pix].b & 0xff) << netbiasshift;
                j = Contest (b, g, r);

                Altersingle (alpha, j, b, g, r);
                if (rad != 0)
                    Alterneigh (rad, j, b, g, r); /* alter neighbours */

                pix += step;
                if (pix >= lim)
                    pix -= lengthcount;

                i++;
                if (delta == 0)
                    delta = 1;
                if (i % delta == 0) {
                    alpha -= alpha / alphadec;
                    radius -= radius / radiusdec;
                    rad = radius >> radiusbiasshift;
                    if (rad <= 1)
                        rad = 0;
                    for (j = 0; j < rad; j++)
                        radpower [j] =
                            alpha * (((rad * rad - j * j) * radbias) / (rad * rad));
                }
            }
        }