home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 334.lha / DkbAnim / palette.c < prev    next >
C/C++ Source or Header  |  1990-01-10  |  4KB  |  161 lines

  1. #include <exec/types.h>
  2. #include "showprioq.h"
  3.  
  4. ULONG last_red = 0, last_green = 0, last_blue = 0;
  5. int Close_Threshold;
  6.  
  7. #define absdif(x,y) ((x>y) ? (x-y):(y-x))
  8. #define Make_Colour(x, y, z) ((x & 0xF) << 8) + ((y & 0xF) << 4) + (z & 0xF)
  9.  
  10. #define extract_red(x) ((x & 0xF00) >> 8)
  11. #define extract_green(x) ((x & 0x0F0) >> 4)
  12. #define extract_blue(x) (x & 0x00F)
  13.  
  14. struct prioq_struct *Colour_q;
  15. struct prioq_struct *pq_new();
  16.  
  17. extern UWORD ColourTbl[16];
  18.  
  19. reset_colours ()
  20.   {
  21.   last_red = last_green = last_blue = 0;
  22.   }
  23.  
  24. closeness(x, y)
  25.   int x, y;
  26.   {
  27.   int red, blue, green;
  28.  
  29.   red = absdif(extract_red(x), extract_red(y));
  30.   blue = absdif (extract_blue(x), extract_blue(y));
  31.   green = absdif(extract_green(x), extract_green(y));
  32.   return (red+blue+green);
  33.   }
  34.  
  35. start_recording_colours ()
  36.   {
  37.   Colour_q = pq_new (256, 4096);
  38.   if (Colour_q == NULL)
  39.     exit (0);
  40.  
  41.   reset_colours();
  42.   }
  43.  
  44. record_colours (new_red, new_green, new_blue)
  45.   int new_red, new_green, new_blue;
  46.   {
  47.   LONG delta_red, delta_green, delta_blue, match_quality;
  48.  
  49.   delta_red = absdif (new_red, last_red);
  50.   delta_green = absdif (new_green, last_green);
  51.   delta_blue = absdif (new_blue, last_blue);
  52.  
  53.   if (delta_red > delta_green)
  54.     if (delta_red > delta_blue) {
  55.       last_red = new_red;
  56.       match_quality = delta_green + delta_blue;
  57.       }
  58.     else {
  59.       last_blue = new_blue;
  60.       match_quality = delta_green + delta_red;
  61.       }
  62.   else
  63.     if (delta_green > delta_blue)
  64.       {
  65.       last_green = new_green;
  66.       match_quality = delta_red + delta_blue;
  67.       }
  68.     else {
  69.       last_blue = new_blue;
  70.       match_quality = delta_green + delta_red;
  71.       }
  72.  
  73.     if (match_quality != 0)
  74.       pq_add (Colour_q, match_quality,
  75.               Make_Colour (new_red, new_green, new_blue));
  76.   }      
  77.  
  78. choose_palette()
  79.   {
  80.   int i, j, colour, min_distance, temp_distance;
  81.   struct prioq_struct *post_pq;
  82.  
  83.   post_pq = pq_new (32, 4096);
  84.  
  85.   ColourTbl[0] = Make_Colour (0, 0, 0);
  86.   for (i=1 ; i < 16 ;) {
  87.     if (pq_get_highest_index (Colour_q) > pq_get_highest_index (post_pq))
  88.       {
  89.       colour = pq_get_highest_value (Colour_q);
  90.       pq_delete_highest (Colour_q);
  91.  
  92.       min_distance = 255;
  93.       for (j = 0 ; j < i ; j++)
  94.        if ((temp_distance = closeness (ColourTbl[j], colour)) < min_distance)
  95.          min_distance = temp_distance;
  96.  
  97.       if (min_distance < 5)
  98.         pq_add (post_pq, min_distance, colour);
  99.       else
  100.        ColourTbl[i++] = colour;
  101.       }
  102.     else
  103.       {
  104.       ColourTbl[i++] = pq_get_highest_value (post_pq);
  105.       pq_delete_highest (post_pq);
  106.       }
  107.     }
  108.   pq_free (Colour_q);
  109.   pq_free (post_pq);
  110.   }
  111.  
  112. best_colour (new_red, new_blue, new_green)
  113.   int new_red, new_blue, new_green;
  114.   {
  115.   int i, match_quality, best_match, colour,
  116.       delta_red, delta_green, delta_blue, temp_match_quality;
  117.  
  118.   delta_red = absdif (new_red, last_red);
  119.   delta_green = absdif (new_green, last_green);
  120.   delta_blue = absdif (new_blue, last_blue);
  121.  
  122.   if (delta_red > delta_green)
  123.     if (delta_red > delta_blue) {
  124.       last_red = new_red;
  125.       colour = 0x20 + new_red;
  126.       match_quality = delta_green + delta_blue;
  127.       }
  128.     else {
  129.       last_blue = new_blue;
  130.       colour = 0x10 + new_blue;
  131.       match_quality = delta_green + delta_red;
  132.       }
  133.   else
  134.     if (delta_green > delta_blue)
  135.       {
  136.       last_green = new_green;
  137.       colour = 0x30 + new_green;
  138.       match_quality = delta_red + delta_blue;
  139.       }
  140.     else {
  141.       last_blue = new_blue;
  142.       colour = 0x10 + new_blue;
  143.       match_quality = delta_green + delta_red;
  144.       }
  145.  
  146.   if (match_quality != 0)
  147.     for (i = 0 ; i < 16 ; i++)
  148.       if ((temp_match_quality =
  149.            closeness (ColourTbl[i],
  150.             Make_Colour (new_red, new_green, new_blue)))
  151.           < match_quality) {
  152.         match_quality = temp_match_quality;
  153.         colour = i;
  154.         last_red = extract_red (ColourTbl[i]);
  155.         last_green = extract_green (ColourTbl[i]);
  156.         last_blue = extract_blue (ColourTbl[i]);
  157.         }
  158.   return (colour);
  159.   }
  160.  
  161.