home *** CD-ROM | disk | FTP | other *** search
/ ftp.sunet.sepub/pictures / 2014.11.ftp.sunet.se-pictures.tar / ftp.sunet.se / pub / pictures / ACiD-artpacks / programs / unix / editors / gimp-plugins-unstable-0_99_23_tar.gz / gimp-plugins-unstable-0_99_23_tar / gimp-plugins-unstable-0.99.23 / fp / fp_hsv.c < prev    next >
C/C++ Source or Header  |  1998-02-19  |  2KB  |  94 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "libgimp/gimp.h"
  5.  
  6. typedef double hsv;
  7. void rgb_to_hsv (hsv r,
  8.          hsv g,
  9.          hsv b,
  10.          hsv *h,
  11.          hsv *s,
  12.          hsv *l)
  13. {
  14.   hsv v;
  15.   hsv m;
  16.   hsv vm;
  17.   hsv r2, g2, b2;
  18.  
  19.   v = MAX(r,g);
  20.   v = MAX(v,b);
  21.   m = MIN(r,g);
  22.   m = MIN(m,b);
  23.  
  24.   if ((*l = (m + v) / 2.0) <= 0.0)
  25.     {
  26.       *s=*h=0;
  27.       return;
  28.     }
  29.   if ((*s = vm = v - m) > 0.0)
  30.     {
  31.       *s /= (*l <= 0.5) ? (v + m ) :
  32.     (2.0 - v - m) ;
  33.     }
  34.   else
  35.     {
  36.       *h=0;
  37.       return;
  38.     }
  39.  
  40.   r2 = (v - r) / vm;
  41.   g2 = (v - g) / vm;
  42.   b2 = (v - b) / vm;
  43.  
  44.   if (r == v)
  45.     *h = (g == m ? 5.0 + b2 : 1.0 - g2);
  46.   else if (g == v)
  47.     *h = (b == m ? 1.0 + r2 : 3.0 - b2);
  48.   else
  49.     *h = (r == m ? 3.0 + g2 : 5.0 - r2);
  50.  
  51.   *h /= 6;
  52. }
  53.  
  54. void hsv_to_rgb (hsv  h,
  55.          hsv  sl,
  56.          hsv  l,
  57.          hsv *r,
  58.          hsv *g,
  59.          hsv *b)
  60. {
  61.   hsv v;
  62.  
  63.   v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
  64.   if (v <= 0)
  65.     {
  66.       *r = *g = *b = 0.0;
  67.     }
  68.   else
  69.     {
  70.       hsv m;
  71.       hsv sv;
  72.       gint sextant;
  73.       hsv fract, vsf, mid1, mid2;
  74.  
  75.       m = l + l - v;
  76.       sv = (v - m ) / v;
  77.       h *= 6.0;
  78.       sextant = h;
  79.       fract = h - sextant;
  80.       vsf = v * sv * fract;
  81.       mid1 = m + vsf;
  82.       mid2 = v - vsf;
  83.       switch (sextant)
  84.     {
  85.     case 0: *r = v; *g = mid1; *b = m; break;
  86.     case 1: *r = mid2; *g = v; *b = m; break;
  87.     case 2: *r = m; *g = v; *b = mid1; break;
  88.     case 3: *r = m; *g = mid2; *b = v; break;
  89.     case 4: *r = mid1; *g = m; *b = v; break;
  90.     case 5: *r = v; *g = m; *b = mid2; break;
  91.     }
  92.     }
  93. }
  94.