home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 505a.lha / GrapicsGems / HSLtoRGB.c < prev    next >
C/C++ Source or Header  |  1991-05-01  |  2KB  |  97 lines

  1. /*
  2. A Fast HSL-to-RGB Transform
  3. by Ken Fishkin
  4. from "Graphics Gems", Academic Press, 1990
  5. */
  6.  
  7. #include <math.h>
  8. #include <stdio.h>
  9. #include "GraphicsGems.h"
  10.  
  11.     /*
  12.      * RGB-HSL transforms.
  13.      * Ken Fishkin, Pixar Inc., January 1989.
  14.      */
  15.  
  16.     /*
  17.     * given r,g,b on [0 ... 1],
  18.     * return (h,s,l) on [0 ... 1]
  19.     */
  20. void
  21. RGB_to_HSL    (r,g,b,h,s,l)
  22. double     r,g,b;
  23. double *h, *s, *l;
  24. {
  25.     double v;
  26.     double m;
  27.     double vm;
  28.     double r2, g2, b2;
  29.  
  30.     v = MAX(r,g);
  31.     v = MAX(v,b);
  32.     m = MIN(r,g);
  33.     m = MIN(m,b);
  34.  
  35.     if ((*l = (m + v) / 2.0) <= 0.0) return;
  36.     if ((*s = vm = v - m) > 0.0) {
  37.         *s /= (*l <= 0.5) ? (v + m ) :
  38.             (2.0 - v - m) ;
  39.     } else
  40.     return;
  41.  
  42.  
  43.     r2 = (v - r) / vm;
  44.     g2 = (v - g) / vm;
  45.     b2 = (v - b) / vm;
  46.  
  47.     if (r == v)
  48.         *h = (g == m ? 5.0 + b2 : 1.0 - g2);
  49.     else if (g == v)
  50.         *h = (b == m ? 1.0 + r2 : 3.0 - b2);
  51.     else
  52.         *h = (r == m ? 3.0 + g2 : 5.0 - r2);
  53.  
  54.         *h /= 6;
  55.     }
  56.  
  57.     /*
  58.      * given h,s,l on [0..1],
  59.      * return r,g,b on [0..1]
  60.      */
  61. void
  62. HSL_to_RGB(h,sl,l,r,g,b)
  63. double     h,sl,l;
  64. double     *r, *g, *b;
  65. {
  66.     double v;
  67.  
  68.     v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
  69.     if (v <= 0) {
  70.         *r = *g = *b = 0.0;
  71.     } else {
  72.         double m;
  73.         double sv;
  74.         int sextant;
  75.         double fract, vsf, mid1, mid2;
  76.  
  77.         m = l + l - v;
  78.         sv = (v - m ) / v;
  79.         h *= 6.0;
  80.         sextant = h;    
  81.         fract = h - sextant;
  82.         vsf = v * sv * fract;
  83.         mid1 = m + vsf;
  84.         mid2 = v - vsf;
  85.         switch (sextant) {
  86.             case 0: *r = v; *g = mid1; *b = m; break;
  87.             case 1: *r = mid2; *g = v; *b = m; break;
  88.             case 2: *r = m; *g = v; *b = mid1; break;
  89.             case 3: *r = m; *g = mid2; *b = v; break;
  90.             case 4: *r = mid1; *g = m; *b = v; break;
  91.             case 5: *r = v; *g = m; *b = mid2; break;
  92.         }
  93.     }
  94. }
  95.  
  96.  
  97.