home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / xlock / part01 / hsbramp.c < prev    next >
C/C++ Source or Header  |  1990-12-07  |  3KB  |  136 lines

  1. #ifndef lint
  2. static char sccsid[] = "@(#)hsbramp.c    23.4 90/10/28 XLOCK SMI";
  3. #endif
  4. /*-
  5.  * hsbramp.c - Create an HSB ramp.
  6.  *
  7.  * Copyright (c) 1988-90 by Patrick Naughton and Sun Microsystems, Inc.
  8.  *
  9.  * Permission to use, copy, modify, and distribute this software and its
  10.  * documentation for any purpose and without fee is hereby granted,
  11.  * provided that the above copyright notice appear in all copies and that
  12.  * both that copyright notice and this permission notice appear in
  13.  * supporting documentation.
  14.  *
  15.  * This file is provided AS IS with no warranties of any kind.  The author
  16.  * shall have no liability with respect to the infringement of copyrights,
  17.  * trade secrets or any patents by this file or any part thereof.  In no
  18.  * event will the author be liable for any lost revenue or profits or
  19.  * other special, indirect and consequential damages.
  20.  *
  21.  * Comments and additions should be sent to the author:
  22.  *
  23.  *               naughton@eng.sun.com
  24.  *
  25.  *               Patrick J. Naughton
  26.  *               MS 14-01
  27.  *               Windows and Graphics Group
  28.  *               Sun Microsystems, Inc.
  29.  *               2550 Garcia Ave
  30.  *               Mountain View, CA  94043
  31.  *
  32.  * Revision History:
  33.  * 29-Jul-90: renamed hsbramp.c from HSBmap.c
  34.  *          minor optimizations.
  35.  * 01-Sep-88: Written.
  36.  */
  37.  
  38. #include <sys/types.h>
  39. #include <math.h>
  40.  
  41. void
  42. hsb2rgb(H, S, B, r, g, b)
  43.     double      H,
  44.                 S,
  45.                 B;
  46.     u_char     *r,
  47.                *g,
  48.                *b;
  49. {
  50.     int         i;
  51.     double      f;
  52.     double      bb;
  53.     u_char      p;
  54.     u_char      q;
  55.     u_char      t;
  56.  
  57.     H -= floor(H);        /* remove anything over 1 */
  58.     H *= 6.0;
  59.     i = floor(H);        /* 0..5 */
  60.     f = H - (float) i;        /* f = fractional part of H */
  61.     bb = 255.0 * B;
  62.     p = (u_char) (bb * (1.0 - S));
  63.     q = (u_char) (bb * (1.0 - (S * f)));
  64.     t = (u_char) (bb * (1.0 - (S * (1.0 - f))));
  65.     switch (i) {
  66.     case 0:
  67.     *r = (u_char) bb;
  68.     *g = t;
  69.     *b = p;
  70.     break;
  71.     case 1:
  72.     *r = q;
  73.     *g = (u_char) bb;
  74.     *b = p;
  75.     break;
  76.     case 2:
  77.     *r = p;
  78.     *g = (u_char) bb;
  79.     *b = t;
  80.     break;
  81.     case 3:
  82.     *r = p;
  83.     *g = q;
  84.     *b = (u_char) bb;
  85.     break;
  86.     case 4:
  87.     *r = t;
  88.     *g = p;
  89.     *b = (u_char) bb;
  90.     break;
  91.     case 5:
  92.     *r = (u_char) bb;
  93.     *g = p;
  94.     *b = q;
  95.     break;
  96.     }
  97. }
  98.  
  99.  
  100. /*
  101.  * Input is two points in HSB color space and a count
  102.  * of how many discreet rgb space values the caller wants.
  103.  *
  104.  * Output is that many rgb triples which describe a linear
  105.  * interpolate ramp between the two input colors.
  106.  */
  107.  
  108. void
  109. hsbramp(h1, s1, b1, h2, s2, b2, count, red, green, blue)
  110.     double      h1,
  111.                 s1,
  112.                 b1,
  113.                 h2,
  114.                 s2,
  115.                 b2;
  116.     int         count;
  117.  
  118.     u_char     *red,
  119.                *green,
  120.                *blue;
  121. {
  122.     double      dh;
  123.     double      ds;
  124.     double      db;
  125.  
  126.     dh = (h2 - h1) / count;
  127.     ds = (s2 - s1) / count;
  128.     db = (b2 - b1) / count;
  129.     while (count--) {
  130.     hsb2rgb(h1, s1, b1, red++, green++, blue++);
  131.     h1 += dh;
  132.     s1 += ds;
  133.     b1 += db;
  134.     }
  135. }
  136.