73 lines
5.7 KiB
C
73 lines
5.7 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
unsigned int clut[] = {0x22222222, 0x33333333, 0x44444444, 0x55555555, 0x66666666, 0x77777777, 0x1144EE55, 0x11337755, 0x2244EE66, 0x22447755, 0x3355EE66, 0x22335544, 0x33446655, 0x44557766, 0x1133EE66, 0x2233EE77, 0x22337766, 0x3344EE77, 0x22336655, 0x33447766, 0x4455EE77, 0x3333EEEE, 0x33337777, 0x33336666, 0x44447777, 0x33335555, 0x44446666, 0x55557777, 0x33334444, 0x44445555, 0x55556666, 0x66667777, 0x443377EE, 0x44336677, 0x554477EE, 0x553366EE, 0x44335566, 0x55446677, 0x665577EE, 0x55335577, 0x664466EE, 0x44334455, 0x55445566, 0x66556677, 0x663355EE, 0x55334466, 0x66445577, 0x775566EE, 0x773344EE, 0x66334477, 0x774455EE, 0x77333377, 0x66333366, 0x77444477, 0x55333355, 0x66444466, 0x77555577, 0x44333344, 0x55444455, 0x66555566, 0x77666677, 0xEE331166, 0xEE332277, 0x77332266, 0x66332255, 0x77443366, 0xEE330055, 0x77330044, 0xEE441155, 0x77331155, 0xEE442266, 0x66331144, 0x77442255, 0x55332244, 0x66443355, 0x77554466, 0xEE440044, 0x66330033, 0x77441144, 0xEE552255, 0x55331133, 0x66442244, 0x77553355, \
|
|
0x44332233, 0x55443344, 0x66554455, 0x77665566, 0xEE550033, 0x77440033, 0xEE551144, 0x77551133, 0xEE662244, 0x66441133, 0x77552244, 0x55442233, 0x66553344, 0x77664455, 0xEE660022, 0x77550022, 0xEE661133, 0x77661122, 0x66551122, 0x77662233, 0x55441122, 0x66552233, 0x77663344, 0x66661111, 0x66662222, 0x55552222, 0x66663333, 0x44442222, 0x55553333, 0x66664444, 0x33332222, 0x44443333, 0x55554444, 0x66665555, 0x55662211, 0x44552211, 0x55663322, 0x44662200, 0x44663311, 0x33442211, 0x44553322, 0x55664433, 0x33663300, 0x33553311, 0x44664422, 0x33443322, 0x44554433, 0x55665544, 0x22664400, 0x22553300, 0x33664411, 0x22443311, 0x33554422, 0x44665533, 0x22665511, 0x22554411, 0x33665522, 0x22666622, 0x22555522, 0x33666633, 0x22444422, 0x33555533, 0x44666644, 0x22333322, 0x33444433, 0x44555544, 0x55666655, 0x1166EE33, 0x11667722, 0x22667733, 0x22556633, 0x33667744, 0x1155EE44, 0x11557733, 0x2266EE44, 0x22557744, 0x3366EE55, 0x22445533, 0x33556644, 0x44667755, 0x11447744, 0x2255EE55, 0x22446644, 0x33557755, 0x4466EE66, \
|
|
0x22334433, 0x33445544, 0x44556655, 0x55667766};
|
|
int red[] = {-1, 0, 51, 102, 153, 204, 255, 17, 8, 59, 49, 100, 29, 80, 131, 17, 59, 49, 100, 39, 90, 141, 100, 90, 80, 131, 71, 122, 173, 61, 112, 163, 214, 131, 122, 173, 163, 112, 163, 214, 153, 204, 102, 153, 204, 194, 143, 194, 245, 226, 184, 235, 216, 175, 226, 133, 184, 235, 92, 143, 194, 245, 238, 247, 206, 165, 216, 228, 187, 238, 196, 247, 155, 206, 124, 175, 226, 228, 145, 196, 247, 114, 165, 216, 82, 133, 184, 235, 228, 187, 238, 196, 247, 155, 206, 124, 175, 226, 228, 187, 238, 196, 155, 206, 114, 165, 216, 155, 165, 124, 175, 82, 133, 184, 41, 92, 143, 194, 124, 82, 133, 82, 92, 41, 92, 143, 51, 51, 102, 51, 102, 153, 20, 10, 61, 10, 61, 112, 29, 20, 71, 39, 29, 80, 20, 71, 122, 10, 61, 112, 163, 17, 8, 49, 39, 90, 17, 8, 59, 49, 100, 29, 80, 131, 8, 59, 39, 90, 141, 20, 71, 122, 173, -1};
|
|
int grn[] = {-1, 0, 51, 102, 153, 204, 255, 189, 161, 212, 173, 224, 106, 157, 208, 200, 223, 184, 235, 145, 196, 247, 246, 207, 168, 219, 129, 180, 231, 90, 141, 192, 243, 230, 191, 242, 214, 152, 203, 254, 175, 226, 113, 164, 215, 198, 136, 187, 238, 182, 159, 210, 143, 120, 171, 97, 148, 199, 74, 125, 176, 227, 88, 127, 104, 81, 132, 49, 26, 77, 65, 116, 42, 93, 58, 109, 160, 38, 3, 54, 105, 19, 70, 121, 35, 86, 137, 188, 27, 15, 66, 43, 94, 31, 82, 47, 98, 149, 16, 4, 55, 32, 20, 71, 8, 59, 110, 9, 48, 36, 87, 24, 75, 126, 12, 63, 114, 165, 25, 13, 64, 2, 41, 1, 52, 103, 18, 29, 80, 40, 91, 142, 34, 6, 57, 17, 68, 119, 73, 45, 96, 112, 84, 135, 56, 107, 158, 28, 79, 130, 181, 167, 128, 151, 123, 174, 178, 139, 190, 162, 213, 95, 146, 197, 150, 201, 134, 185, 236, 67, 118, 169, 220, -1};
|
|
int blu[] = {-1, 0, 51, 102, 153, 204, 255, 99, 46, 97, 99, 150, 48, 99, 150, 43, 41, 43, 94, 46, 97, 148, 38, 41, 43, 94, 46, 97, 148, 48, 99, 150, 201, 38, 41, 92, 38, 43, 94, 145, 41, 92, 46, 97, 148, 38, 43, 94, 145, 38, 41, 92, 41, 43, 94, 46, 97, 148, 48, 99, 150, 201, 43, 41, 43, 46, 97, 46, 48, 99, 46, 97, 48, 99, 48, 99, 150, 102, 51, 102, 153, 51, 102, 153, 51, 102, 153, 204, 158, 105, 156, 158, 209, 105, 156, 105, 156, 207, 214, 161, 212, 214, 161, 212, 107, 158, 209, 217, 214, 161, 212, 107, 158, 209, 54, 105, 156, 207, 217, 163, 214, 219, 217, 110, 161, 212, 219, 163, 214, 107, 158, 209, 219, 166, 217, 110, 161, 212, 217, 163, 214, 214, 161, 212, 107, 158, 209, 54, 105, 156, 207, 212, 214, 212, 158, 209, 156, 158, 209, 156, 207, 105, 156, 207, 102, 153, 102, 153, 204, 51, 102, 153, 204, -1};
|
|
int num[256];
|
|
char iline[1024];
|
|
|
|
|
|
void main( void )
|
|
{
|
|
int x, y, r, g, b, i, j, m, n;
|
|
unsigned char *ptr, *dat;
|
|
|
|
if ( ( ptr = dat = malloc( 2<<16 ) ) == NULL )
|
|
return;
|
|
|
|
for ( i = 0; i < 256; i++ )
|
|
num[i] = 0;
|
|
|
|
fgets( iline, 1024, stdin );
|
|
if ( strncmp( iline, "P3", 2 ) )
|
|
return;
|
|
fgets( iline, 1024, stdin );
|
|
fscanf( stdin, "%d %d\n", &x, &y );
|
|
fgets( iline, 1024, stdin );
|
|
while( !feof( stdin ) )
|
|
{
|
|
fscanf( stdin, "%d %d %d", &r, &g, &b );
|
|
if ( feof( stdin ) )
|
|
break;
|
|
if ( red[0] < 0 )
|
|
{
|
|
red[0] = r; grn[0] = g; blu[0] = b;
|
|
}
|
|
for ( i = 0; red[i] >=0; i++ )
|
|
{
|
|
m = (red[i]-r)*(red[i]-r)+(grn[i]-g)*(grn[i]-g)+(blu[i]-b)*(blu[i]-b);
|
|
if ( i == 0 || m < n )
|
|
{
|
|
j = i; n = m;
|
|
}
|
|
}
|
|
num[j]++;
|
|
*ptr++ = j;
|
|
}
|
|
for ( j = i = 0; i < 256; i++ )
|
|
{
|
|
if ( num[i] )
|
|
{
|
|
num[i] = j++;
|
|
if ( i > 0 )
|
|
fprintf( stdout, "%08X\n", clut[i-1] );
|
|
}
|
|
}
|
|
for ( i = 0; dat < ptr; dat++)
|
|
if ( ++i == x )
|
|
{
|
|
fprintf( stdout, "%2d\n", num[*dat] );
|
|
i = 0;
|
|
}
|
|
else
|
|
{
|
|
fprintf( stdout, "%2d, ", num[*dat] );
|
|
}
|
|
fprintf( stdout, "\n" );
|
|
}
|