home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / rexx / library2 / gbmrexx / gbm / _gbmerr.c next >
C/C++ Source or Header  |  1992-04-06  |  2KB  |  100 lines

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