🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.windows.ms.programmer
Article #766

Re: RGB <--> Hue/Sat/Lum conversion?

#766
From: Bill de Beaubien
Date: Fri, 30 Nov 1990 18:51
104 lines
4031 bytes
In article <1990Nov27.234745.24133@mtcchi.uucp> thj@mtcchi.uucp (XT0221000-Tom Hjellming(ZG90210)0000) writes:
>I'm looking for some procedures (or better yet, some formulas) for converting
>between RGB format like all the Windows APIs use and Hue/Saturation/Luminosity
>and vice versa.
>
>The Windows 3.0 color control panel allows users to design custom colors 
>(under Color Palette) using either/both formats.  I would like to do a similar
>thing in my application.
>
>Does anyone know how or have pointers to books that might discuss it?  I've
>checked Petzold's 2nd edition and Peter Norton's new Windows book, but no
>dice.
>
>Thanks in advance,
>
>Tom Hjellming
>Analysts International Corporation (AiC)
>
>-- 
>Tom Hjellming
>Software Consultant
>Analysts International Corp. (AiC)
>Schaumburg, IL
The following code came from the graphics archive at netlib.


Caveat receptor.  (Jack) dongarra@cs.utk.edu, (Eric Grosse) research!ehg
Careful! Anything free comes with no guarantee.
*
*PLEASE NOTE THAT netlib HAS MOVED, THE NEW ADDRESS IS netlib@ornl.gov.
*THE OLD ADDRESS, netlib@mcs.anl.gov, WILL BE TURNED OFF SOON.
*
*** from netlib, Fri Nov 30 12:43:15 EST 1990 ***

/*   rainbow(h, s, v, r, g, b)
     double h, s, v, *r, *g, *b;

 This routine computes colors suitable for use in color level plots.
 Typically s=v=1 and h varies from 0 (red) to 1 (blue) in
 equally spaced steps.  (h=.5 gives green; 1<h<1.5 gives magenta.)
 To convert for frame buffer, use   R = floor(255.999*pow(*r,1/gamma))  etc.
 To get tables calibrated for other devices or to report complaints,
 contact  Eric Grosse   research!ehg    201-582-5828.
*/

#include <stdio.h>
#include <math.h>
double huettab[] = {
 0.0000, 0.0062, 0.0130, 0.0202, 0.0280, 0.0365, 0.0457, 0.0559, 0.0671, 0.0796,
 0.0936, 0.1095, 0.1275, 0.1482, 0.1806, 0.2113, 0.2393, 0.2652, 0.2892, 0.3119,
 0.3333, 0.3556, 0.3815, 0.4129, 0.4526, 0.5060, 0.5296, 0.5501, 0.5679, 0.5834,
 0.5970, 0.6088, 0.6191, 0.6281, 0.6361, 0.6430, 0.6490, 0.6544, 0.6590, 0.6631,
 0.6667, 0.6713, 0.6763, 0.6815, 0.6873, 0.6937, 0.7009, 0.7092, 0.7190, 0.7308,
 0.7452, 0.7631, 0.7856, 0.8142, 0.8621, 0.9029, 0.9344, 0.9580, 0.9755, 0.9889,
 1.0000
 };
  /* computed from the FMC-1 color difference formula */
  /* Barco monitor, max(r,g,b)=1, n=61 magenta,  2 Jan 1986 */

rainbow(h, s, v, r, g, b)
double h, s, v, *r, *g, *b;
{
  int i;
  double modf(), trash;
  h = 60*modf(h/1.5,&trash);
  i = floor(h);
  h = huettab[i] + (huettab[i+1]-huettab[i])*(h-i);
  dhsv2rgb(h,s,v,r,g,b);
}

dhsv2rgb(h, s, v, r, g, b)    /*...hexcone model...*/
double h, s, v, *r, *g, *b;    /* all variables in range [0,1[ */
  /* here, h=.667 gives blue, h=0 or 1 gives red. */
{  /* see Alvy Ray Smith, Color Gamut Transform Pairs, SIGGRAPH '78 */
  int i;
  double f, m, n, k;
  double modf(), trash;
  h = 6*modf(h,&trash);
  i = floor(h);
  f = h-i;
  m = (1-s);
  n = (1-s*f);
  k = (1-(s*(1-f)));
  switch(i){
    case 0: *r=1; *g=k; *b=m; break;
    case 1: *r=n; *g=1; *b=m; break;
    case 2: *r=m; *g=1; *b=k; break;
    case 3: *r=m; *g=n; *b=1; break;
    case 4: *r=k; *g=m; *b=1; break;
    case 5: *r=1; *g=m; *b=n; break;
    default: fprintf(stderr,"bad i: %f %d",h,i); exit(1);
  }
  f = *r;
  if( f < *g ) f = *g;
  if( f < *b ) f = *b;
  f = v / f;
  *r *= f;
  *g *= f;
  *b *= f;
}

Bill
-- 
Bill de Beaubien / wjb@moscom.com 
Technical Details
Message-ID: <2394@moscom.UUCP>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!zaphod.mps.ohio-state.edu!ub!uhura.cc.rochester.edu!ee.rochester.edu!moscom!wjb
References: <1990Nov27.234745.24133@mtcchi.uucp>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!wuarchive!zaphod.mps.ohio-state.edu!ub!uhura.cc.rochester.edu!ee.rochester.edu!moscom!wjb
From: wjb@moscom.UUCP (Bill de Beaubien)
Newsgroups: comp.windows.ms.programmer
Subject: Re: RGB <--> Hue/Sat/Lum conversion?
Keywords: Windows RGB color
Message-ID: <2394@moscom.UUCP>
Date: 30 Nov 90 18:51:19 GMT
References: <1990Nov27.234745.24133@mtcchi.uucp>
Reply-To: wjb@moscom.UUCP (Bill de Beaubien)
Distribution: comp
Organization: Moscom Corp., E. Rochester, NY
Lines: 104