1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
/****************************************************************
/* RGBHLS.c
/* (c)1995, Toshihiro Matsui, Electrotechnical Laboratory
/****************************************************************/
static char *rcsid= "@(#)$Id: RGBHLS.c,v 1.1.1.1 2003/11/20 07:46:30 eus Exp $";
#include <math.h>
#include "../c/eus.h"
#pragma init (init_object_module)
pointer RGBHLS();
static void init_object_module()
{ add_module_initializer("RGBHLS", RGBHLS);}
void rgb_to_hls(r,g,b,h,l,s)
int r,g,b; /* inputs 0..255*/
int *h, *l, *s;
{
int v,m,vm,r2,g2,b2;
float f;
v = max(r,g); v=max(v,b);
m = min(r,g); m=min(m,b);
if ((*l = (m + v) / 2) <= 0) {*h= *s=0; return;}
if ((*s = vm = v-m) > 0)
if (*l <=128) {
f=(float)(*s)/(float)(v+m);
*s = 255*f;}
else {
f=(float)(*s)/(float)(511-v-m);
*s= 255 * f;}
else {*h = 0; return;}
r2= 255 * (v-r) / vm;
g2= 255 * (v-g) / vm;
b2= 255 * (v-b) / vm;
if (r==v)
*h = (g==m ? 5*255+b2 : 255-g2);
else if (g==v)
*h= (b==m ? 255+r2 : 3*255-b2);
else *h = (r==m ? 3*255 + g2 : 5*255 - r2);
*h /= 6;}
void hls_to_rgb(h,l,s,r,g,b)
int h,l,s;
int *r, *g, *b;
{ float v; }
pointer RGB_TO_HLS(ctx,n,argv)
context *ctx;
int n;
register pointer argv[];
{ int h,l,s,v;
ckarg(3);
rgb_to_hls(ckintval(argv[0]), ckintval(argv[1]), ckintval(argv[2]),
&h, &l, &s);
h=min(h,255); l=min(l,255); s=min(s,255);
/* printf("h=%d l=%d s=%d\n",h,l,s); */
v= (h << 16) | (l << 8) | s;
return(makeint(v));}
pointer RGBHLS(ctx,n,argv)
context *ctx;
int n;
pointer argv[];
{ pointer mod=argv[0];
defun(ctx,"RGB-TO-HLS", mod, RGB_TO_HLS,NULL);
return(T);
}
|