| 1 | /*
|
|---|
| 2 |
|
|---|
| 3 | _gbmtrun.c - Calculate the quick 'closest-colour' lookup table for gbmtrunc.c
|
|---|
| 4 |
|
|---|
| 5 | */
|
|---|
| 6 |
|
|---|
| 7 | #include <stdio.h>
|
|---|
| 8 | #include "gbm.h"
|
|---|
| 9 |
|
|---|
| 10 | /*...sVGA palette:0:*/
|
|---|
| 11 | static GBMRGB gbmrgb_vga[] =
|
|---|
| 12 | {
|
|---|
| 13 | 0, 0, 0,
|
|---|
| 14 | 128, 0, 0,
|
|---|
| 15 | 0,128, 0,
|
|---|
| 16 | 128,128, 0,
|
|---|
| 17 | 0, 0,128,
|
|---|
| 18 | 128, 0,128,
|
|---|
| 19 | 0,128,128,
|
|---|
| 20 | 128,128,128,
|
|---|
| 21 | 204,204,204,
|
|---|
| 22 | 255, 0, 0,
|
|---|
| 23 | 0,255, 0,
|
|---|
| 24 | 255,255, 0,
|
|---|
| 25 | 0, 0,255,
|
|---|
| 26 | 255, 0,255,
|
|---|
| 27 | 0,255,255,
|
|---|
| 28 | 255,255,255,
|
|---|
| 29 | };
|
|---|
| 30 | /*...e*/
|
|---|
| 31 | /*...scalc_nearest:0:*/
|
|---|
| 32 | /*
|
|---|
| 33 | This function, when given am RGB colour, finds the VGA palette entry closest
|
|---|
| 34 | to it. We deliberately bias away from the two grey palette entries.
|
|---|
| 35 | */
|
|---|
| 36 |
|
|---|
| 37 | static byte calc_nearest(byte r, byte g, byte b)
|
|---|
| 38 | {
|
|---|
| 39 | long min_dist = 3L * 256L * 256L * 10L;
|
|---|
| 40 | byte bi, bi_min;
|
|---|
| 41 |
|
|---|
| 42 | for ( bi = 0; bi < 0x10; bi++ )
|
|---|
| 43 | {
|
|---|
| 44 | long b_dist = ((long) b - (long) gbmrgb_vga[bi].b);
|
|---|
| 45 | long g_dist = ((long) g - (long) gbmrgb_vga[bi].g);
|
|---|
| 46 | long r_dist = ((long) r - (long) gbmrgb_vga[bi].r);
|
|---|
| 47 | long dist = r_dist * r_dist + g_dist * g_dist + b_dist * b_dist;
|
|---|
| 48 |
|
|---|
| 49 | if ( dist < min_dist )
|
|---|
| 50 | {
|
|---|
| 51 | min_dist = dist;
|
|---|
| 52 | bi_min = bi;
|
|---|
| 53 | }
|
|---|
| 54 | }
|
|---|
| 55 | return ( bi_min );
|
|---|
| 56 | }
|
|---|
| 57 | /*...e*/
|
|---|
| 58 |
|
|---|
| 59 | static char *dw_casings[] =
|
|---|
| 60 | {
|
|---|
| 61 | "\t%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,",
|
|---|
| 62 | "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,", "%d,\n",
|
|---|
| 63 | };
|
|---|
| 64 |
|
|---|
| 65 | int main(void)
|
|---|
| 66 | {
|
|---|
| 67 | byte r, r0, r1, g, g0, g1, b, b0, b1, i = 0;
|
|---|
| 68 |
|
|---|
| 69 | printf("static byte quick_tab[16][16][16] =\n\t{\n");
|
|---|
| 70 |
|
|---|
| 71 | for ( r = 0, r0 = 0, r1 = 15; r < 16; r++, r0 += 16, r1 += 16 )
|
|---|
| 72 | for ( g = 0, g0 = 0, g1 = 15; g < 16; g++, g0 += 16, g1 += 16 )
|
|---|
| 73 | for ( b = 0, b0 = 0, b1 = 15; b < 16; b++, b0 += 16, b1 += 16 )
|
|---|
| 74 | /*...sanalyse cube:32:*/
|
|---|
| 75 | {
|
|---|
| 76 | byte n = calc_nearest(r0, g0, b0);
|
|---|
| 77 | byte inx;
|
|---|
| 78 |
|
|---|
| 79 | if ( n == calc_nearest(r0, g0, b1) &&
|
|---|
| 80 | n == calc_nearest(r0, g1, b0) &&
|
|---|
| 81 | n == calc_nearest(r0, g1, b1) &&
|
|---|
| 82 | n == calc_nearest(r1, g0, b0) &&
|
|---|
| 83 | n == calc_nearest(r1, g0, b1) &&
|
|---|
| 84 | n == calc_nearest(r1, g1, b0) &&
|
|---|
| 85 | n == calc_nearest(r1, g1, b1) )
|
|---|
| 86 | inx = n;
|
|---|
| 87 | else
|
|---|
| 88 | inx = (byte) 0xff;
|
|---|
| 89 | printf(dw_casings[i++ & 15], (int) inx);
|
|---|
| 90 | }
|
|---|
| 91 | /*...e*/
|
|---|
| 92 |
|
|---|
| 93 | printf("\t};\n");
|
|---|
| 94 | return 0;
|
|---|
| 95 | }
|
|---|