/*
* =====================================================================================
*
* Filename: build-table.cpp
*
* Description:
*
* Version: 1.0
* Created: 03/04/2011 22:11:22
* Revision: none
* Compiler: gcc
*
* Author: John Ryland (jryland), jryland@xiaofrog.com
* Company: InvertedLogic
*
* =====================================================================================
*/
#include <QApplication>
#include <QPixmap>
#include <QImage>
#include <stdio.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
printf("starting\n");
const int size = 65536*4;
int *rTableHCnt = (int*)malloc(size);
int *gTableHCnt = (int*)malloc(size);
int *bTableHCnt = (int*)malloc(size);
int *rTableH = (int*)malloc(size);
int *gTableH = (int*)malloc(size);
int *bTableH = (int*)malloc(size);
int *rTableLCnt = (int*)malloc(size);
int *gTableLCnt = (int*)malloc(size);
int *bTableLCnt = (int*)malloc(size);
int *rTableL = (int*)malloc(size);
int *gTableL = (int*)malloc(size);
int *bTableL = (int*)malloc(size);
printf("alloced mem\n");
memset(rTableL, 0, size);
memset(gTableL, 0, size);
memset(bTableL, 0, size);
memset(rTableLCnt, 0, size);
memset(gTableLCnt, 0, size);
memset(bTableLCnt, 0, size);
memset(rTableH, 0, size);
memset(gTableH, 0, size);
memset(bTableH, 0, size);
memset(rTableHCnt, 0, size);
memset(gTableHCnt, 0, size);
memset(bTableHCnt, 0, size);
printf("zeroed mem\n");
const int shift = 4;
for (int i = 1; i < 100; i++) {
QImage pix( QString("test/test%1%2.png").arg(i/10).arg(i%10) );
int w = pix.width();
int h = pix.height();
//printf("%i%i wxh: %i, %i\n", i/10, i%10, w, h);
for (int y = 1; y < h; y++) {
for (int x = 1; x < w-2; x++) {
QRgb p1 = pix.pixel(x-1,y-1);
QRgb p2 = pix.pixel(x,y-1);
QRgb p3 = pix.pixel(x+1,y-1);
QRgb p4 = pix.pixel(x-1,y);
QRgb p = pix.pixel(x,y);
int r1 = qRed(p1);
int r2 = qRed(p2);
int r3 = qRed(p3);
int r4 = qRed(p4);
int r = qRed(p);
int g1 = qGreen(p1);
int g2 = qGreen(p2);
int g3 = qGreen(p3);
int g4 = qGreen(p4);
int g = qGreen(p);
int b1 = qBlue(p1);
int b2 = qBlue(p2);
int b3 = qBlue(p3);
int b4 = qBlue(p4);
int b = qBlue(p);
int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;
rTableL[rLindex] += r&0xF;
rTableL[gLindex] += g&0xF;
rTableL[bLindex] += b&0xF;
rTableLCnt[rLindex]++;
rTableLCnt[gLindex]++;
rTableLCnt[bLindex]++;
r1 >>= shift;
r2 >>= shift;
r3 >>= shift;
r4 >>= shift;
g1 >>= shift;
g2 >>= shift;
g3 >>= shift;
g4 >>= shift;
b1 >>= shift;
b2 >>= shift;
b3 >>= shift;
b4 >>= shift;
int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;
rTableH[rindex] += r&0xF0;
rTableH[gindex] += g&0xF0;
rTableH[bindex] += b&0xF0;
rTableHCnt[rindex]++;
rTableHCnt[gindex]++;
rTableHCnt[bindex]++;
}
}
for (int y = h-2; y >= 0; y--) {
for (int x = w-2; x >= 1; x--) {
QRgb p1 = pix.pixel(x+1,y+1);
QRgb p2 = pix.pixel(x,y+1);
QRgb p3 = pix.pixel(x-1,y+1);
QRgb p4 = pix.pixel(x+1,y);
QRgb p = pix.pixel(x,y);
int r1 = qRed(p1);
int r2 = qRed(p2);
int r3 = qRed(p3);
int r4 = qRed(p4);
int r = qRed(p);
int g1 = qGreen(p1);
int g2 = qGreen(p2);
int g3 = qGreen(p3);
int g4 = qGreen(p4);
int g = qGreen(p);
int b1 = qBlue(p1);
int b2 = qBlue(p2);
int b3 = qBlue(p3);
int b4 = qBlue(p4);
int b = qBlue(p);
int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;
rTableL[rLindex] += r&0xF;
rTableL[gLindex] += g&0xF;
rTableL[bLindex] += b&0xF;
rTableLCnt[rLindex]++;
rTableLCnt[gLindex]++;
rTableLCnt[bLindex]++;
r1 >>= shift;
r2 >>= shift;
r3 >>= shift;
r4 >>= shift;
g1 >>= shift;
g2 >>= shift;
g3 >>= shift;
g4 >>= shift;
b1 >>= shift;
b2 >>= shift;
b3 >>= shift;
b4 >>= shift;
int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;
rTableH[rindex] += r&0xF0;
rTableH[gindex] += g&0xF0;
rTableH[bindex] += b&0xF0;
rTableHCnt[rindex]++;
rTableHCnt[gindex]++;
rTableHCnt[bindex]++;
}
}
for (int x = w-2; x >= 0; x--) {
for (int y = 1; y < h-2; y++) {
QRgb p1 = pix.pixel(x+1,y-1);
QRgb p2 = pix.pixel(x+1,y);
QRgb p3 = pix.pixel(x+1,y+1);
QRgb p4 = pix.pixel(x,y-1);
QRgb p = pix.pixel(x,y);
int r1 = qRed(p1);
int r2 = qRed(p2);
int r3 = qRed(p3);
int r4 = qRed(p4);
int r = qRed(p);
int g1 = qGreen(p1);
int g2 = qGreen(p2);
int g3 = qGreen(p3);
int g4 = qGreen(p4);
int g = qGreen(p);
int b1 = qBlue(p1);
int b2 = qBlue(p2);
int b3 = qBlue(p3);
int b4 = qBlue(p4);
int b = qBlue(p);
int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;
rTableL[rLindex] += r&0xF;
rTableL[gLindex] += g&0xF;
rTableL[bLindex] += b&0xF;
rTableLCnt[rLindex]++;
rTableLCnt[gLindex]++;
rTableLCnt[bLindex]++;
r1 >>= shift;
r2 >>= shift;
r3 >>= shift;
r4 >>= shift;
g1 >>= shift;
g2 >>= shift;
g3 >>= shift;
g4 >>= shift;
b1 >>= shift;
b2 >>= shift;
b3 >>= shift;
b4 >>= shift;
int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;
rTableH[rindex] += r&0xF0;
rTableH[gindex] += g&0xF0;
rTableH[bindex] += b&0xF0;
rTableHCnt[rindex]++;
rTableHCnt[gindex]++;
rTableHCnt[bindex]++;
}
}
for (int x = 1; x < w-1; x++) {
for (int y = h-2; y >= 1; y--) {
QRgb p1 = pix.pixel(x-1,y+1);
QRgb p2 = pix.pixel(x-1,y);
QRgb p3 = pix.pixel(x-1,y-1);
QRgb p4 = pix.pixel(x,y+1);
QRgb p = pix.pixel(x,y);
int r1 = qRed(p1);
int r2 = qRed(p2);
int r3 = qRed(p3);
int r4 = qRed(p4);
int r = qRed(p);
int g1 = qGreen(p1);
int g2 = qGreen(p2);
int g3 = qGreen(p3);
int g4 = qGreen(p4);
int g = qGreen(p);
int b1 = qBlue(p1);
int b2 = qBlue(p2);
int b3 = qBlue(p3);
int b4 = qBlue(p4);
int b = qBlue(p);
int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;
rTableL[rLindex] += r&0xF;
rTableL[gLindex] += g&0xF;
rTableL[bLindex] += b&0xF;
rTableLCnt[rLindex]++;
rTableLCnt[gLindex]++;
rTableLCnt[bLindex]++;
r1 >>= shift;
r2 >>= shift;
r3 >>= shift;
r4 >>= shift;
g1 >>= shift;
g2 >>= shift;
g3 >>= shift;
g4 >>= shift;
b1 >>= shift;
b2 >>= shift;
b3 >>= shift;
b4 >>= shift;
int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;
rTableH[rindex] += r&0xF0;
rTableH[gindex] += g&0xF0;
rTableH[bindex] += b&0xF0;
rTableHCnt[rindex]++;
rTableHCnt[gindex]++;
rTableHCnt[bindex]++;
}
}
}
printf("Red Table: ");
for (int i = 0; i < size/4; i++) {
if ( rTableHCnt[i] )
rTableH[i] /= rTableHCnt[i];
if ( gTableHCnt[i] )
gTableH[i] /= gTableHCnt[i];
if ( bTableHCnt[i] )
bTableH[i] /= bTableHCnt[i];
if ( rTableLCnt[i] )
rTableL[i] /= rTableLCnt[i];
if ( gTableLCnt[i] )
gTableL[i] /= gTableLCnt[i];
if ( bTableLCnt[i] )
bTableL[i] /= bTableLCnt[i];
//printf("%i, ", rTable[i]);
//rTableH[i] &= 0xF0;
//gTableH[i] &= 0xF0;
//bTableH[i] &= 0xF0;
rTableL[i] &= 0xF;
gTableL[i] &= 0xF;
bTableL[i] &= 0xF;
}
FILE *f = fopen("blah.out", "w");
int cnt2 = 0;
int cnt4 = 0;
int cnt8 = 0;
int cnt16 = 0;
int cnt32 = 0;
int cnt64 = 0;
int cnt128 = 0;
int cnt256 = 0;
for (int i = 1; i < 100; i++) {
QImage pix( QString("test/test%1%2.png").arg(i/10).arg(i%10) );
int w = pix.width();
int h = pix.height();
for (int y = 1; y < h; y++) {
for (int x = 1; x < w-2; x++) {
QRgb p1 = pix.pixel(x-1,y-1);
QRgb p2 = pix.pixel(x,y-1);
QRgb p3 = pix.pixel(x+1,y-1);
QRgb p4 = pix.pixel(x-1,y);
QRgb p = pix.pixel(x,y);
int r1 = qRed(p1);
int r2 = qRed(p2);
int r3 = qRed(p3);
int r4 = qRed(p4);
int r = qRed(p);
int g1 = qGreen(p1);
int g2 = qGreen(p2);
int g3 = qGreen(p3);
int g4 = qGreen(p4);
int g = qGreen(p);
int b1 = qBlue(p1);
int b2 = qBlue(p2);
int b3 = qBlue(p3);
int b4 = qBlue(p4);
int b = qBlue(p);
int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;
r1 >>= shift;
r2 >>= shift;
r3 >>= shift;
r4 >>= shift;
g1 >>= shift;
g2 >>= shift;
g3 >>= shift;
g4 >>= shift;
b1 >>= shift;
b2 >>= shift;
b3 >>= shift;
b4 >>= shift;
int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;
int pr = rTableH[rindex] | rTableL[rLindex];
int pg = rTableH[gindex] | rTableL[gLindex];
int pb = rTableH[bindex] | rTableL[bLindex];
//pr = (r1*10+r2*14+r3*10+r4*14)/48;
//pg = (g1*10+g2*14+g3*10+g4*14)/48;
//pb = (b1*10+b2*14+b3*10+b4*14)/48;
//printf(",%i,%i,%i", r-pr, g-pg, b-pb);
int ar = r-pr; if (ar<0) ar = -ar;
int ag = g-pg; if (ag<0) ag = -ag;
int ab = b-pb; if (ab<0) ab = -ab;
if ( ar < 2 )
cnt2++;
if ( ag < 2 )
cnt2++;
if ( ab < 2 )
cnt2++;
if ( ar >= 2 && ar < 4 )
cnt4++;
if ( ag >= 2 && ag < 4 )
cnt4++;
if ( ab >= 2 && ab < 4 )
cnt4++;
if ( ar >= 4 && ar < 8 )
cnt8++;
if ( ag >= 4 && ag < 8 )
cnt8++;
if ( ab >= 4 && ab < 8 )
cnt8++;
if ( ar >= 8 && ar < 16 )
cnt16++;
if ( ag >= 8 && ag < 16 )
cnt16++;
if ( ab >= 8 && ab < 16 )
cnt16++;
if ( ar >= 16 && ar < 32 )
cnt32++;
if ( ag >= 16 && ag < 32 )
cnt32++;
if ( ab >= 16 && ab < 32 )
cnt32++;
if ( ar >= 32 && ar < 64 )
cnt64++;
if ( ag >= 32 && ag < 64 )
cnt64++;
if ( ab >= 32 && ab < 64 )
cnt64++;
if ( ar >= 64 && ar < 128 )
cnt128++;
if ( ag >= 64 && ag < 128 )
cnt128++;
if ( ab >= 64 && ab < 128 )
cnt128++;
if ( ar >= 128 )
cnt256++;
if ( ag >= 128 )
cnt256++;
if ( ab >= 128 )
cnt256++;
unsigned char a1 = r-pr;
unsigned char a2 = g-pg;
unsigned char a3 = b-pb;
fwrite(&a1, 1, 1, f);
fwrite(&a2, 1, 1, f);
fwrite(&a3, 1, 1, f);
//fwrite(&r, 1, 1, f);
//fwrite(&g, 1, 1, f);
//fwrite(&b, 1, 1, f);
}
//printf("\n");
}
}
fclose(f);
printf("\n");
printf(" cnt 2 : %i\n", cnt2);
printf(" cnt 4 : %i\n", cnt4);
printf(" cnt 8 : %i\n", cnt8);
printf(" cnt 16 : %i\n", cnt16);
printf(" cnt 32 : %i\n", cnt32);
printf(" cnt 64 : %i\n", cnt64);
printf(" cnt 128 : %i\n", cnt128);
printf(" cnt 256 : %i\n", cnt256);
return 0;//app.exec();
}