--- CV/CV.xs 2005/02/08 12:51:12 1.14 +++ CV/CV.xs 2005/02/08 16:27:10 1.15 @@ -253,35 +253,36 @@ for (i = 0; i <= av_len (av); ++i) { - int bigst, j; + const int HISTSIZE = 64; + + int j; SV *sv = *av_fetch (av, i, 1); STRLEN len; char *buf = SvPVbyte (sv, len); - int tmphist[256]; - char *hist; + int tmphist[HISTSIZE]; + float *hist; - SV *histsv = newSV (257); + SV *histsv = newSV (HISTSIZE * sizeof (float) + 1); SvPOK_on (histsv); - SvCUR_set (histsv, 256); - hist = SvPVX (histsv); - - Zero (tmphist, 256, int); + SvCUR_set (histsv, HISTSIZE * sizeof (float)); + hist = (float *)SvPVX (histsv); - j = len; - - while (len--) - ++tmphist[(unsigned char)*buf++ & 0xda]; - - len = j; + Zero (tmphist, sizeof (tmphist), char); - bigst = 1; - for (j = 0; j < 256; ++j) - if (tmphist[j] > bigst) - bigst = tmphist[j]; + for (j = len; j--; ) + { + unsigned int idx + = ((*buf & 0xc0) >> 2) + | ((*buf & 0x18) >> 1) + | (*buf & 0x03); + + ++tmphist[idx]; + ++buf; + } - for (j = 0; j < 256; ++j) - hist[j] = tmphist[j] * 255 / (len == 0 ? 1 : len);//bigst; + for (j = 0; j < HISTSIZE; ++j) + hist[j] = (float)tmphist[j] / (len + 1e-30); av_push (result, histsv); }