/* makedata.c - enhancement to basic code to create data.c HAM file */ #include printcomments() { printf("/* data.c - table of data for HAM routines. */\n\n"); printf("/* color[16] - colormap containing rgb values fairly evenly */\n"); printf("/* spread throughout 16x16x16 space. */\n"); printf("/* near[4096] - table of distance. For each r,g,b */\n"); printf("/* address = (r<<8 | g<<4 | b) & 0xfff */\n"); printf("/* near>>4 gives the nearest color (index) and */\n"); printf("/* near & 0x0f gives the distance. */\n"); printf("/* nearmc[4096] - table of distance minus color */\n"); printf("/* This contains the nearest color ignoring a color */\n"); printf("/* (nearmc >> 8) & 0xf is for red, */\n"); printf("/* (nearmc >> 4) & 0xf is for green, */\n"); printf("/* and nearmc & 0xf is for blue */\n\n"); } struct color { int red, green, blue; }; struct color color[16] = { {0x0,0x0,0x0}, {0x4,0x6,0x6}, {0x3,0x7,0x2}, {0xc,0x2,0x3}, {0x3,0xd,0x3}, {0x3,0x2,0xc}, {0xc,0xc,0x2}, {0xc,0x3,0xd}, {0x3,0xc,0xd}, {0xc,0xd,0xc}, {0x0,0x8,0xa}, {0x8,0x0,0x8}, {0x8,0x8,0x0}, {0xf,0x7,0x7}, {0x8,0xf,0x8}, {0x8,0x8,0xf} }; main() { int r,g,b; int d,dd,n,i; int dr,dg,db, ddr,ddg,ddb, nr,ng,nb; printcomments(); printf("#include \n\n"); printf("UWORD colortable[16] = {\n"); for (i=0; i<15; i++) printf("\t0x%01x%01x%01x,\n", color[i].red,color[i].green,color[i].blue); printf("\t0x%01x%01x%01x\n", color[i].red,color[i].green,color[i].blue); printf("};\n\n"); printf("UBYTE near[4096] = {\n"); for (r = 0; r < 16; r++) { for (g = 0; g < 16; g++) { printf("\t"); for (b = 0; b < 16; b++) { d = 10000; for (i = 0; i < 16; i++) { dd = abs(r - color[i].red) + abs(g - color[i].green) + abs(b - color[i].blue); if (dd < d) { d = dd; n = i; } } printf("0x%01x%01x",n,d); if (b < 15) printf(", "); else if ((r < 15) || (g < 15)) printf(",\n"); else printf("\n"); if (b == 7) printf("\n\t"); } } } printf("};\n\n"); printf("UWORD nearmc[4096] = {\n"); for (r = 0; r < 16; r++) { for (g = 0; g < 16; g++) { printf("\t"); for (b = 0; b < 16; b++) { dr = 10000; dg = 10000; db = 10000; for (i = 0; i < 16; i++) { ddr = abs(g -color[i].green) + abs(b - color[i].blue ); ddg = abs(r -color[i].red ) + abs(b - color[i].blue ); ddb = abs(r -color[i].red ) + abs(g - color[i].green); if (ddr < dr) { dr = ddr; nr = i;} if (ddg < dg) { dg = ddg; ng = i;} if (ddb < db) { db = ddb; nb = i;} } printf("0x%01x%01x%01x",nr,ng,nb); if (b < 15) printf(", "); else if ((r < 15) || (g < 15)) printf(",\n"); else printf("\n"); if (b == 7) printf("\n\t"); } } } printf("};\n"); }