home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / gbmsrc.zip / _gbmtrun.c < prev    next >
C/C++ Source or Header  |  1996-04-01  |  2KB  |  96 lines

  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.     }
  96.