#ifndef lint static char sccsid[] = "@(#)hsvrgb.c 9.2 88/01/19 Copyright 1985 Sun Micro"; #endif /* * Copyright (c) 1985 by Sun Microsystems, Inc. */ /*- Convert between hue/saturation/brightness and red/green/blue hsvrgb.c, Mon Jun 24 21:42:13 1985 These were borrowed from some code by D C Martin and minimally adapted. */ #ifdef REF #include #include #endif #include "shape.h" /* * Convert red/green/blue to hue/saturation/brightness. */ cs_frcolortohsb(color, huep, saturationp, brightnessp) struct color color; fract *huep, *saturationp, *brightnessp; { unsigned char cmax, cmin; fract redc, greenc, bluec; cmax = color.red > color.green ? color.red : color.green; if (color.blue > cmax) cmax = color.blue; cmin = color.red < color.green ? color.red : color.green; if (color.blue < cmin) cmin = color.blue; *brightnessp = fraction(cmax,0xFF); if (cmax != 0) *saturationp = fraction(cmax - cmin, cmax); else *saturationp = 0; if (*saturationp == 0) *huep = 0; else { redc = frdiv(fracti(cmax - color.red), fracti(cmax - cmin)); greenc = frdiv(fracti(cmax - color.green), fracti(cmax - cmin)); bluec = frdiv(fracti(cmax - color.blue), fracti(cmax - cmin)); if (color.red == cmax) *huep = bluec - greenc; else if (color.green == cmax) *huep = fracti(2) + redc - bluec; else *huep = fracti(4) + greenc - redc; *huep = *huep / 6; if (*huep < 0) *huep += fracti(1); } } /* * Convert hue/saturation/brightness to red/green/blue color struct. */ struct color cs_frhsbcolor(hue, saturation, brightness) fract hue, saturation, brightness; { int i, f; fract p, q, t; fract red, green, blue; struct color color; if (saturation == 0) red = green = blue = brightness; else { hue = (hue & (fracti(1) - 1)) * 6; i = cfloorfr(hue); f = hue & (fracti(1) - 1); p = frmul(brightness, fracti(1) - saturation); q = frmul(brightness, fracti(1) - frmul(saturation, f)); t = frmul(brightness, (fracti(1) - frmul(saturation, fracti(1) - f))); switch (i) { case 0: red = brightness; green = t; blue = p; break; case 1: red = q; green = brightness; blue = p; break; case 2: red = p; green = brightness; blue = t; break; case 3: red = p; green = q; blue = brightness; break; case 4: red = t; green = p; blue = brightness; break; case 5: red = brightness; green = p; blue = q; break; } } red *= 0xFF; color.red = cfloorfr(red) < 0xFF ? cfloorfr(red) : 0xFF; green *= 0xFF; color.green = cfloorfr(green) < 0xFF ? cfloorfr(green) : 0xFF; blue *= 0xFF; color.blue = cfloorfr(blue) < 0xFF ? cfloorfr(blue) : 0xFF; color.hint = sh_colorhint(&color); return color; } /* * Convert red/green/blue to color struct. */ struct color cs_frrgbcolor(red, green, blue) fract red, green, blue; { struct color color; red *= 0xFF; color.red = cfloorfr(red) < 0xFF ? cfloorfr(red) : 0xFF; green *= 0xFF; color.green = cfloorfr(green) < 0xFF ? cfloorfr(green) : 0xFF; blue *= 0xFF; color.blue = cfloorfr(blue) < 0xFF ? cfloorfr(blue) : 0xFF; color.hint = sh_colorhint(&color); return color; }