summaryrefslogtreecommitdiff
path: root/quantize.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantize.c')
-rw-r--r--quantize.c810
1 files changed, 405 insertions, 405 deletions
diff --git a/quantize.c b/quantize.c
index 3f7418b..e0f307d 100644
--- a/quantize.c
+++ b/quantize.c
@@ -21,85 +21,85 @@ cQuantize::~cQuantize() {
}
cQuantizeFixed::cQuantizeFixed() {
- redLevelCount = 7;
- greenLevelCount = 9;
- blueLevelCount = 4;
-
- redLevels[0] = 0;
- redLevels[redLevelCount - 1] = 255;
- for (int i = 1; i < redLevelCount - 1; i++) {
- redLevels[i] = (256 * i) / (redLevelCount - 1);
- }
-
- greenLevels[0] = 0;
- greenLevels[greenLevelCount - 1] = 255;
- for (int i = 1; i < greenLevelCount - 1; i++) {
- greenLevels[i] = (256 * i) / (greenLevelCount - 1);
- }
-
- blueLevels[0] = 0;
- blueLevels[blueLevelCount - 1] = 255;
- for (int i = 1; i < blueLevelCount - 1; i++) {
- blueLevels[i] = (256 * i) / (blueLevelCount - 1);
- }
-
- for (int r = 0; r < redLevelCount; r++) {
- for (int g = 0; g < greenLevelCount; g++) {
- for (int b = 0; b < blueLevelCount; b++) {
- paletteOutput[r * greenLevelCount * blueLevelCount + g * blueLevelCount + b] =
- (redLevels[r] << 16) | (greenLevels[g] << 8) | blueLevels[b];
- }
- }
- }
+ redLevelCount = 7;
+ greenLevelCount = 9;
+ blueLevelCount = 4;
+
+ redLevels[0] = 0;
+ redLevels[redLevelCount - 1] = 255;
+ for (int i = 1; i < redLevelCount - 1; i++) {
+ redLevels[i] = (256 * i) / (redLevelCount - 1);
+ }
+
+ greenLevels[0] = 0;
+ greenLevels[greenLevelCount - 1] = 255;
+ for (int i = 1; i < greenLevelCount - 1; i++) {
+ greenLevels[i] = (256 * i) / (greenLevelCount - 1);
+ }
+
+ blueLevels[0] = 0;
+ blueLevels[blueLevelCount - 1] = 255;
+ for (int i = 1; i < blueLevelCount - 1; i++) {
+ blueLevels[i] = (256 * i) / (blueLevelCount - 1);
+ }
+
+ for (int r = 0; r < redLevelCount; r++) {
+ for (int g = 0; g < greenLevelCount; g++) {
+ for (int b = 0; b < blueLevelCount; b++) {
+ paletteOutput[r * greenLevelCount * blueLevelCount + g * blueLevelCount + b] =
+ (redLevels[r] << 16) | (greenLevels[g] << 8) | blueLevels[b];
+ }
+ }
+ }
}
cQuantizeFixed::~cQuantizeFixed() {
}
int cQuantizeFixed::Quantize(unsigned char * input, int size, int colors) {
- imageInput = input;
- imageSize = size;
-
- unsigned int * imagePtr = (unsigned int *) imageInput;
- int diff, diffOld;
- unsigned int value;
- unsigned char redValue;
- unsigned char greenValue;
- unsigned char blueValue;
- int r, g, b;
- for (int i = 0; i < imageSize; i++) {
- value = *imagePtr;
- redValue = value;
- greenValue = value >> 8;
- blueValue = value >> 16;
- diffOld = 256;
- for (r = 0; r < redLevelCount; r++) {
- diff = abs(redLevels[r] - redValue);
- if (diff > diffOld)
- break;
- diffOld = diff;
- }
- diffOld = 256;
- for (g = 0; g < greenLevelCount; g++) {
- diff = abs(greenLevels[g] - greenValue);
- if (diff > diffOld)
- break;
- diffOld = diff;
- }
- diffOld = 256;
- for (b = 0; b < blueLevelCount; b++) {
- diff = abs(blueLevels[b] - blueValue);
- if (diff > diffOld)
- break;
- diffOld = diff;
- }
- r--;
- g--;
- b--;
- imageOutput[i] = r * greenLevelCount * blueLevelCount + g * blueLevelCount + b;
- imagePtr++;
- }
- return 0;
+ imageInput = input;
+ imageSize = size;
+
+ unsigned int * imagePtr = (unsigned int *) imageInput;
+ int diff, diffOld;
+ unsigned int value;
+ unsigned char redValue;
+ unsigned char greenValue;
+ unsigned char blueValue;
+ int r, g, b;
+ for (int i = 0; i < imageSize; i++) {
+ value = *imagePtr;
+ redValue = value;
+ greenValue = value >> 8;
+ blueValue = value >> 16;
+ diffOld = 256;
+ for (r = 0; r < redLevelCount; r++) {
+ diff = abs(redLevels[r] - redValue);
+ if (diff > diffOld)
+ break;
+ diffOld = diff;
+ }
+ diffOld = 256;
+ for (g = 0; g < greenLevelCount; g++) {
+ diff = abs(greenLevels[g] - greenValue);
+ if (diff > diffOld)
+ break;
+ diffOld = diff;
+ }
+ diffOld = 256;
+ for (b = 0; b < blueLevelCount; b++) {
+ diff = abs(blueLevels[b] - blueValue);
+ if (diff > diffOld)
+ break;
+ diffOld = diff;
+ }
+ r--;
+ g--;
+ b--;
+ imageOutput[i] = r * greenLevelCount * blueLevelCount + g * blueLevelCount + b;
+ imagePtr++;
+ }
+ return 0;
}
cQuantizeWu::cQuantizeWu()
@@ -110,139 +110,139 @@ cQuantizeWu::~cQuantizeWu()
{
}
-#define WEIG //>>2
+#define WEIG //>>2
int cQuantizeWu::Quantize(unsigned char * input, int size, int colors)
{
- struct box cube[MAXCOLOR];
+ struct box cube[MAXCOLOR];
int next;
- int i;
- int j;
- int k;
- int l;
- float vv[MAXCOLOR];
- float temp;
- unsigned char * tag;
- long weight;
-
- imageInput = input;
- imageSize = size;
- palSize = colors;
-
- for (j = 0; j < BOX; j++)
- for (k = 0; k < BOX; k++)
- for (l = 0; l < BOX; l++)
- {
- wt[j][k][l] = 0;
- mr[j][k][l] = 0;
- mg[j][k][l] = 0;
- mb[j][k][l] = 0;
- m2[j][k][l] = 0.0;
- }
-
- Qadd = new unsigned short[imageSize * sizeof(unsigned short)];
+ int i;
+ int j;
+ int k;
+ int l;
+ float vv[MAXCOLOR];
+ float temp;
+ unsigned char * tag;
+ long weight;
+
+ imageInput = input;
+ imageSize = size;
+ palSize = colors;
+
+ for (j = 0; j < BOX; j++)
+ for (k = 0; k < BOX; k++)
+ for (l = 0; l < BOX; l++)
+ {
+ wt[j][k][l] = 0;
+ mr[j][k][l] = 0;
+ mg[j][k][l] = 0;
+ mb[j][k][l] = 0;
+ m2[j][k][l] = 0.0;
+ }
+
+ Qadd = new unsigned short[imageSize * sizeof(unsigned short)];
Hist3d((long *)&wt, (long *)&mr, (long *)&mg, (long *)&mb, (float *)&m2);
Momt3d((long *)&wt, (long *)&mr, (long *)&mg, (long *)&mb, (float *)&m2);
cube[0].r0 = cube[0].g0 = cube[0].b0 = 0;
cube[0].r1 = cube[0].g1 = cube[0].b1 = 32;
- next = 0;
- for (i = 1; i < palSize; i++)
- {
- if (Cut(&cube[next], &cube[i]))
- {
- vv[next] = (cube[next].vol > 1) ? Var(&cube[next]) : 0.0;
- vv[i] = (cube[i].vol > 1) ? Var(&cube[i]) : 0.0;
- }
- else
- {
- vv[next] = 0.0;
- i--;
- }
- next = 0;
- temp = vv[0];
- for (k = 1; k <= i; k++)
- if (vv[k] > temp)
- {
- temp = vv[k];
- next = k;
- }
- if (temp <= 0.0)
- {
- palSize = i + 1;
- break;
- }
- }
+ next = 0;
+ for (i = 1; i < palSize; i++)
+ {
+ if (Cut(&cube[next], &cube[i]))
+ {
+ vv[next] = (cube[next].vol > 1) ? Var(&cube[next]) : 0.0;
+ vv[i] = (cube[i].vol > 1) ? Var(&cube[i]) : 0.0;
+ }
+ else
+ {
+ vv[next] = 0.0;
+ i--;
+ }
+ next = 0;
+ temp = vv[0];
+ for (k = 1; k <= i; k++)
+ if (vv[k] > temp)
+ {
+ temp = vv[k];
+ next = k;
+ }
+ if (temp <= 0.0)
+ {
+ palSize = i + 1;
+ break;
+ }
+ }
tag = new unsigned char[BOX * BOX * BOX];
- unsigned char * palette = (unsigned char *) paletteOutput;
- for (k = 0; k < palSize; ++k)
- {
- Mark(&cube[k], k, tag);
- weight = Vol(&cube[k], wt);
- if (weight)
- {
+ unsigned char * palette = (unsigned char *) paletteOutput;
+ for (k = 0; k < palSize; ++k)
+ {
+ Mark(&cube[k], k, tag);
+ weight = Vol(&cube[k], wt);
+ if (weight)
+ {
#ifdef NOINVERT
- palette[k * 4 + 2] = (Vol(&cube[k], mb) / weight) WEIG;
- palette[k * 4 + 0] = (Vol(&cube[k], mr) / weight) WEIG;
+ palette[k * 4 + 2] = (Vol(&cube[k], mb) / weight) WEIG;
+ palette[k * 4 + 0] = (Vol(&cube[k], mr) / weight) WEIG;
#else
- palette[k * 4 + 0] = (Vol(&cube[k], mb) / weight) WEIG;
- palette[k * 4 + 2] = (Vol(&cube[k], mr) / weight) WEIG;
+ palette[k * 4 + 0] = (Vol(&cube[k], mb) / weight) WEIG;
+ palette[k * 4 + 2] = (Vol(&cube[k], mr) / weight) WEIG;
#endif
- palette[k * 4 + 1] = (Vol(&cube[k], mg) / weight) WEIG;
- }
- else
- {
- palette[k * 4 + 0] = 0;
- palette[k * 4 + 1] = 0;
- palette[k * 4 + 2] = 0;
- }
- }
-
- for (i = 0; i < imageSize; i++)
- {
- imageOutput[i] = tag[Qadd[i]];
- }
-
- delete[] tag;
- delete[] Qadd;
-
- return 0;
+ palette[k * 4 + 1] = (Vol(&cube[k], mg) / weight) WEIG;
+ }
+ else
+ {
+ palette[k * 4 + 0] = 0;
+ palette[k * 4 + 1] = 0;
+ palette[k * 4 + 2] = 0;
+ }
+ }
+
+ for (i = 0; i < imageSize; i++)
+ {
+ imageOutput[i] = tag[Qadd[i]];
+ }
+
+ delete[] tag;
+ delete[] Qadd;
+
+ return 0;
}
// build 3-D color histogram of counts, r/g/b, c^2
void cQuantizeWu::Hist3d(long *vwt, long *vmr, long *vmg, long *vmb, float *m_2)
{
- int ind;
- int r;
- int g;
- int b;
+ int ind;
+ int r;
+ int g;
+ int b;
int inr;
- int ing;
- int inb;
- int table[256];
- int i;
-
- for (i = 0; i < 256; i++)
- table[i] = i * i;
-
- for (i = 0; i < imageSize; i++)
- {
- r = imageInput[i*4];
- g = imageInput[i*4+1];
- b = imageInput[i*4+2];
-
- inr = (r >> 3) + 1;
- ing = (g >> 3) + 1;
- inb = (b >> 3) + 1;
- Qadd[i] = ind = (inr << 10) + (inr << 6) + inr + (ing << 5) + ing + inb;
-
- vwt[ind]++;
- vmr[ind] += r;
- vmg[ind] += g;
- vmb[ind] += b;
- m_2[ind] += (float) (table[r] + table[g] + table[b]);
+ int ing;
+ int inb;
+ int table[256];
+ int i;
+
+ for (i = 0; i < 256; i++)
+ table[i] = i * i;
+
+ for (i = 0; i < imageSize; i++)
+ {
+ r = imageInput[i*4];
+ g = imageInput[i*4+1];
+ b = imageInput[i*4+2];
+
+ inr = (r >> 3) + 1;
+ ing = (g >> 3) + 1;
+ inb = (b >> 3) + 1;
+ Qadd[i] = ind = (inr << 10) + (inr << 6) + inr + (ing << 5) + ing + inb;
+
+ vwt[ind]++;
+ vmr[ind] += r;
+ vmg[ind] += g;
+ vmb[ind] += b;
+ m_2[ind] += (float) (table[r] + table[g] + table[b]);
}
}
@@ -250,265 +250,265 @@ void cQuantizeWu::Hist3d(long *vwt, long *vmr, long *vmg, long *vmb, float *m_2)
// the sums of the above quantities over any desired box.
void cQuantizeWu::Momt3d(long *vwt, long *vmr, long *vmg, long *vmb, float *m_2)
{
- unsigned short ind1;
- unsigned short ind2;
- unsigned char i;
- unsigned char r;
- unsigned char g;
- unsigned char b;
- long line;
- long line_r;
- long line_g;
- long line_b;
- long area[BOX];
- long area_r[BOX];
- long area_g[BOX];
- long area_b[BOX];
+ unsigned short ind1;
+ unsigned short ind2;
+ unsigned char i;
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ long line;
+ long line_r;
+ long line_g;
+ long line_b;
+ long area[BOX];
+ long area_r[BOX];
+ long area_g[BOX];
+ long area_b[BOX];
float line2;
- float area2[BOX];
-
- for (r = 1; r <= 32; ++r)
- {
- for (i = 0; i <= 32; ++i)
- area2[i] = area[i] = area_r[i] = area_g[i] = area_b[i] = 0;
- for (g = 1; g <= 32; ++g)
- {
- line2 = line = line_r = line_g = line_b = 0;
- for (b = 1; b <= 32; ++b)
- {
- ind1 = (r << 10) + (r << 6) + r + (g << 5) + g + b;
- line += vwt[ind1];
- line_r += vmr[ind1];
- line_g += vmg[ind1];
- line_b += vmb[ind1];
- line2 += m_2[ind1];
- area[b] += line;
- area_r[b] += line_r;
- area_g[b] += line_g;
- area_b[b] += line_b;
- area2[b] += line2;
- ind2 = ind1 - 1089; /* [r-1][g][b] */
- vwt[ind1] = vwt[ind2] + area[b];
- vmr[ind1] = vmr[ind2] + area_r[b];
- vmg[ind1] = vmg[ind2] + area_g[b];
- vmb[ind1] = vmb[ind2] + area_b[b];
- m_2[ind1] = m_2[ind2] + area2[b];
- }
- }
- }
+ float area2[BOX];
+
+ for (r = 1; r <= 32; ++r)
+ {
+ for (i = 0; i <= 32; ++i)
+ area2[i] = area[i] = area_r[i] = area_g[i] = area_b[i] = 0;
+ for (g = 1; g <= 32; ++g)
+ {
+ line2 = line = line_r = line_g = line_b = 0;
+ for (b = 1; b <= 32; ++b)
+ {
+ ind1 = (r << 10) + (r << 6) + r + (g << 5) + g + b;
+ line += vwt[ind1];
+ line_r += vmr[ind1];
+ line_g += vmg[ind1];
+ line_b += vmb[ind1];
+ line2 += m_2[ind1];
+ area[b] += line;
+ area_r[b] += line_r;
+ area_g[b] += line_g;
+ area_b[b] += line_b;
+ area2[b] += line2;
+ ind2 = ind1 - 1089; /* [r-1][g][b] */
+ vwt[ind1] = vwt[ind2] + area[b];
+ vmr[ind1] = vmr[ind2] + area_r[b];
+ vmg[ind1] = vmg[ind2] + area_g[b];
+ vmb[ind1] = vmb[ind2] + area_b[b];
+ m_2[ind1] = m_2[ind2] + area2[b];
+ }
+ }
+ }
}
int cQuantizeWu::Cut(struct box * set1, struct box * set2)
{
- unsigned char dir;
- int cutr;
- int cutg;
- int cutb;
- float maxr;
- float maxg;
- float maxb;
- long whole_r;
- long whole_g;
- long whole_b;
- long whole_w;
-
- whole_r = Vol(set1, mr);
- whole_g = Vol(set1, mg);
- whole_b = Vol(set1, mb);
- whole_w = Vol(set1, wt);
-
- maxr = Maximize(set1, RED, set1->r0 + 1, set1->r1, &cutr,
- whole_r, whole_g, whole_b, whole_w);
+ unsigned char dir;
+ int cutr;
+ int cutg;
+ int cutb;
+ float maxr;
+ float maxg;
+ float maxb;
+ long whole_r;
+ long whole_g;
+ long whole_b;
+ long whole_w;
+
+ whole_r = Vol(set1, mr);
+ whole_g = Vol(set1, mg);
+ whole_b = Vol(set1, mb);
+ whole_w = Vol(set1, wt);
+
+ maxr = Maximize(set1, RED, set1->r0 + 1, set1->r1, &cutr,
+ whole_r, whole_g, whole_b, whole_w);
maxg = Maximize(set1, GREEN, set1->g0 + 1, set1->g1, &cutg,
- whole_r, whole_g, whole_b, whole_w);
+ whole_r, whole_g, whole_b, whole_w);
maxb = Maximize(set1, BLUE, set1->b0 + 1, set1->b1, &cutb,
- whole_r, whole_g, whole_b, whole_w);
+ whole_r, whole_g, whole_b, whole_w);
- if ((maxr >= maxg) && (maxr >= maxb))
- {
- dir = RED;
- if (cutr < 0)
- return 0; /* can't split the box */
+ if ((maxr >= maxg) && (maxr >= maxb))
+ {
+ dir = RED;
+ if (cutr < 0)
+ return 0; /* can't split the box */
}
- else if ((maxg >= maxr) && (maxg >= maxb))
- dir = GREEN;
- else
- dir = BLUE;
+ else if ((maxg >= maxr) && (maxg >= maxb))
+ dir = GREEN;
+ else
+ dir = BLUE;
- set2->r1 = set1->r1;
- set2->g1 = set1->g1;
- set2->b1 = set1->b1;
+ set2->r1 = set1->r1;
+ set2->g1 = set1->g1;
+ set2->b1 = set1->b1;
- switch (dir)
- {
+ switch (dir)
+ {
case RED:
- set2->r0 = set1->r1 = cutr;
- set2->g0 = set1->g0;
- set2->b0 = set1->b0;
- break;
- case GREEN:
- set2->g0 = set1->g1 = cutg;
- set2->r0 = set1->r0;
- set2->b0 = set1->b0;
- break;
+ set2->r0 = set1->r1 = cutr;
+ set2->g0 = set1->g0;
+ set2->b0 = set1->b0;
+ break;
+ case GREEN:
+ set2->g0 = set1->g1 = cutg;
+ set2->r0 = set1->r0;
+ set2->b0 = set1->b0;
+ break;
case BLUE:
- set2->b0 = set1->b1 = cutb;
- set2->r0 = set1->r0;
- set2->g0 = set1->g0;
- break;
+ set2->b0 = set1->b1 = cutb;
+ set2->r0 = set1->r0;
+ set2->g0 = set1->g0;
+ break;
}
- set1->vol = (set1->r1 - set1->r0) * (set1->g1 - set1->g0) * (set1->b1 - set1->b0);
- set2->vol = (set2->r1 - set2->r0) * (set2->g1 - set2->g0) * (set2->b1 - set2->b0);
+ set1->vol = (set1->r1 - set1->r0) * (set1->g1 - set1->g0) * (set1->b1 - set1->b0);
+ set2->vol = (set2->r1 - set2->r0) * (set2->g1 - set2->g0) * (set2->b1 - set2->b0);
return 1;
}
long cQuantizeWu::Vol(struct box * cube, long mmt[BOX][BOX][BOX])
{
- return (mmt[cube->r1][cube->g1][cube->b1]
- - mmt[cube->r1][cube->g1][cube->b0]
- - mmt[cube->r1][cube->g0][cube->b1]
- + mmt[cube->r1][cube->g0][cube->b0]
- - mmt[cube->r0][cube->g1][cube->b1]
- + mmt[cube->r0][cube->g1][cube->b0]
- + mmt[cube->r0][cube->g0][cube->b1]
- - mmt[cube->r0][cube->g0][cube->b0]);
+ return (mmt[cube->r1][cube->g1][cube->b1]
+ - mmt[cube->r1][cube->g1][cube->b0]
+ - mmt[cube->r1][cube->g0][cube->b1]
+ + mmt[cube->r1][cube->g0][cube->b0]
+ - mmt[cube->r0][cube->g1][cube->b1]
+ + mmt[cube->r0][cube->g1][cube->b0]
+ + mmt[cube->r0][cube->g0][cube->b1]
+ - mmt[cube->r0][cube->g0][cube->b0]);
}
float cQuantizeWu::Maximize(struct box * cube, unsigned char dir, int first, int last, int * cut, long whole_r, long whole_g, long whole_b, long whole_w)
{
- long half_r;
- long half_g;
- long half_b;
- long half_w;
- long base_r;
- long base_g;
- long base_b;
- long base_w;
- int i;
- float temp;
- float max;
-
- base_r = Bottom(cube, dir, mr);
- base_g = Bottom(cube, dir, mg);
- base_b = Bottom(cube, dir, mb);
- base_w = Bottom(cube, dir, wt);
- max = 0.0;
- *cut = -1;
- for (i = first; i < last; i++)
- {
- half_r = base_r + Top(cube, dir, i, mr);
- half_g = base_g + Top(cube, dir, i, mg);
- half_b = base_b + Top(cube, dir, i, mb);
- half_w = base_w + Top(cube, dir, i, wt);
- // now half_x is sum over lower half of box, if split at i
- if (half_w == 0)
- {
- // subbox could be empty of pixels!
- continue; // never split into an empty box
- }
- else
- temp = ((float) half_r * half_r + (float) half_g * half_g + (float) half_b * half_b) / half_w;
-
- half_r = whole_r - half_r;
- half_g = whole_g - half_g;
- half_b = whole_b - half_b;
- half_w = whole_w - half_w;
- if (half_w == 0)
- {
- // subbox could be empty of pixels!
- continue; // never split into an empty box
- }
- else
- temp += ((float) half_r * half_r + (float) half_g * half_g + (float) half_b * half_b) / half_w;
-
- if (temp > max)
- {
- max = temp;
- *cut = i;
- }
- }
- return (max);
+ long half_r;
+ long half_g;
+ long half_b;
+ long half_w;
+ long base_r;
+ long base_g;
+ long base_b;
+ long base_w;
+ int i;
+ float temp;
+ float max;
+
+ base_r = Bottom(cube, dir, mr);
+ base_g = Bottom(cube, dir, mg);
+ base_b = Bottom(cube, dir, mb);
+ base_w = Bottom(cube, dir, wt);
+ max = 0.0;
+ *cut = -1;
+ for (i = first; i < last; i++)
+ {
+ half_r = base_r + Top(cube, dir, i, mr);
+ half_g = base_g + Top(cube, dir, i, mg);
+ half_b = base_b + Top(cube, dir, i, mb);
+ half_w = base_w + Top(cube, dir, i, wt);
+ // now half_x is sum over lower half of box, if split at i
+ if (half_w == 0)
+ {
+ // subbox could be empty of pixels!
+ continue; // never split into an empty box
+ }
+ else
+ temp = ((float) half_r * half_r + (float) half_g * half_g + (float) half_b * half_b) / half_w;
+
+ half_r = whole_r - half_r;
+ half_g = whole_g - half_g;
+ half_b = whole_b - half_b;
+ half_w = whole_w - half_w;
+ if (half_w == 0)
+ {
+ // subbox could be empty of pixels!
+ continue; // never split into an empty box
+ }
+ else
+ temp += ((float) half_r * half_r + (float) half_g * half_g + (float) half_b * half_b) / half_w;
+
+ if (temp > max)
+ {
+ max = temp;
+ *cut = i;
+ }
+ }
+ return (max);
}
float cQuantizeWu::Var(struct box * cube)
{
- float dr;
- float dg;
- float db;
- float xx;
-
- dr = Vol(cube, mr);
- dg = Vol(cube, mg);
- db = Vol(cube, mb);
- xx = m2[cube->r1][cube->g1][cube->b1]
- - m2[cube->r1][cube->g1][cube->b0]
- - m2[cube->r1][cube->g0][cube->b1]
- + m2[cube->r1][cube->g0][cube->b0]
- - m2[cube->r0][cube->g1][cube->b1]
- + m2[cube->r0][cube->g1][cube->b0]
- + m2[cube->r0][cube->g0][cube->b1]
- - m2[cube->r0][cube->g0][cube->b0];
-
- return (xx - (dr * dr + dg * dg + db * db) / (float) Vol(cube, wt));
+ float dr;
+ float dg;
+ float db;
+ float xx;
+
+ dr = Vol(cube, mr);
+ dg = Vol(cube, mg);
+ db = Vol(cube, mb);
+ xx = m2[cube->r1][cube->g1][cube->b1]
+ - m2[cube->r1][cube->g1][cube->b0]
+ - m2[cube->r1][cube->g0][cube->b1]
+ + m2[cube->r1][cube->g0][cube->b0]
+ - m2[cube->r0][cube->g1][cube->b1]
+ + m2[cube->r0][cube->g1][cube->b0]
+ + m2[cube->r0][cube->g0][cube->b1]
+ - m2[cube->r0][cube->g0][cube->b0];
+
+ return (xx - (dr * dr + dg * dg + db * db) / (float) Vol(cube, wt));
}
long cQuantizeWu::Bottom(struct box * cube, unsigned char dir, long mmt[BOX][BOX][BOX])
{
- switch (dir)
- {
- case RED:
- return (-mmt[cube->r0][cube->g1][cube->b1]
- + mmt[cube->r0][cube->g1][cube->b0]
- + mmt[cube->r0][cube->g0][cube->b1]
- - mmt[cube->r0][cube->g0][cube->b0]);
- case GREEN:
- return (-mmt[cube->r1][cube->g0][cube->b1]
- + mmt[cube->r1][cube->g0][cube->b0]
- + mmt[cube->r0][cube->g0][cube->b1]
- - mmt[cube->r0][cube->g0][cube->b0]);
- case BLUE:
- return (-mmt[cube->r1][cube->g1][cube->b0]
- + mmt[cube->r1][cube->g0][cube->b0]
- + mmt[cube->r0][cube->g1][cube->b0]
- - mmt[cube->r0][cube->g0][cube->b0]);
- }
- printf("error in Bottom()");
- return 0;
+ switch (dir)
+ {
+ case RED:
+ return (-mmt[cube->r0][cube->g1][cube->b1]
+ + mmt[cube->r0][cube->g1][cube->b0]
+ + mmt[cube->r0][cube->g0][cube->b1]
+ - mmt[cube->r0][cube->g0][cube->b0]);
+ case GREEN:
+ return (-mmt[cube->r1][cube->g0][cube->b1]
+ + mmt[cube->r1][cube->g0][cube->b0]
+ + mmt[cube->r0][cube->g0][cube->b1]
+ - mmt[cube->r0][cube->g0][cube->b0]);
+ case BLUE:
+ return (-mmt[cube->r1][cube->g1][cube->b0]
+ + mmt[cube->r1][cube->g0][cube->b0]
+ + mmt[cube->r0][cube->g1][cube->b0]
+ - mmt[cube->r0][cube->g0][cube->b0]);
+ }
+ printf("error in Bottom()");
+ return 0;
}
long cQuantizeWu::Top(struct box * cube, unsigned char dir, int pos, long mmt[BOX][BOX][BOX])
{
- switch (dir)
- {
- case RED:
- return (mmt[pos][cube->g1][cube->b1]
- - mmt[pos][cube->g1][cube->b0]
- - mmt[pos][cube->g0][cube->b1]
- + mmt[pos][cube->g0][cube->b0]);
- case GREEN:
- return (mmt[cube->r1][pos][cube->b1]
- - mmt[cube->r1][pos][cube->b0]
- - mmt[cube->r0][pos][cube->b1]
- + mmt[cube->r0][pos][cube->b0]);
- case BLUE:
- return (mmt[cube->r1][cube->g1][pos]
- - mmt[cube->r1][cube->g0][pos]
- - mmt[cube->r0][cube->g1][pos]
- + mmt[cube->r0][cube->g0][pos]);
- }
+ switch (dir)
+ {
+ case RED:
+ return (mmt[pos][cube->g1][cube->b1]
+ - mmt[pos][cube->g1][cube->b0]
+ - mmt[pos][cube->g0][cube->b1]
+ + mmt[pos][cube->g0][cube->b0]);
+ case GREEN:
+ return (mmt[cube->r1][pos][cube->b1]
+ - mmt[cube->r1][pos][cube->b0]
+ - mmt[cube->r0][pos][cube->b1]
+ + mmt[cube->r0][pos][cube->b0]);
+ case BLUE:
+ return (mmt[cube->r1][cube->g1][pos]
+ - mmt[cube->r1][cube->g0][pos]
+ - mmt[cube->r0][cube->g1][pos]
+ + mmt[cube->r0][cube->g0][pos]);
+ }
printf("error in Top()");
- return 0;
+ return 0;
}
void cQuantizeWu::Mark(struct box * cube, int label, unsigned char * tag)
{
- int r;
- int g;
- int b;
-
- for (r = cube->r0 + 1; r <= cube->r1; r++)
- for (g = cube->g0 + 1; g <= cube->g1; g++)
- for (b = cube->b0 + 1; b <= cube->b1; b++)
- tag[(r << 10) + (r << 6) + r + (g << 5) + g + b] = label;
+ int r;
+ int g;
+ int b;
+
+ for (r = cube->r0 + 1; r <= cube->r1; r++)
+ for (g = cube->g0 + 1; g <= cube->g1; g++)
+ for (b = cube->b0 + 1; b <= cube->b1; b++)
+ tag[(r << 10) + (r << 6) + r + (g << 5) + g + b] = label;
}