/* * Copyright (c) 1988-91 by Patrick J. Naughton. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation. * * This file is provided AS IS with no warranties of any kind. The author * shall have no liability with respect to the infringement of copyrights, * trade secrets or any patents by this file or any part thereof. In no * event will the author be liable for any lost revenue or profits or * other special, indirect and consequential damages. */ /* * Copyright (c) 1988, 2015, Oracle and/or its affiliates. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ /*- * hsbramp.c - Create an HSB ramp. * * Copyright (c) 1991 by Patrick J. Naughton. * * See xlock.c for copying information. * * Revision History: * 29-Jul-90: renamed hsbramp.c from HSBmap.c * minor optimizations. * 01-Sep-88: Written. */ #include #include #include "xlock.h" static void hsb2rgb( double H, double S, double B, u_char *r, u_char *g, u_char *b) { int i; double f; double bb; u_char p; u_char q; u_char t; H -= floor(H); /* remove anything over 1 */ H *= 6.0; i = (int) floor(H); /* 0..5 */ f = H - (double) i; /* f = fractional part of H */ bb = 255.0 * B; p = (u_char) (bb * (1.0 - S)); q = (u_char) (bb * (1.0 - (S * f))); t = (u_char) (bb * (1.0 - (S * (1.0 - f)))); switch (i) { case 0: *r = (u_char) bb; *g = t; *b = p; break; case 1: *r = q; *g = (u_char) bb; *b = p; break; case 2: *r = p; *g = (u_char) bb; *b = t; break; case 3: *r = p; *g = q; *b = (u_char) bb; break; case 4: *r = t; *g = p; *b = (u_char) bb; break; case 5: *r = (u_char) bb; *g = p; *b = q; break; } } /* * Input is two points in HSB color space and a count * of how many discreet rgb space values the caller wants. * * Output is that many rgb triples which describe a linear * interpolate ramp between the two input colors. */ void hsbramp( double h1, double s1, double b1, double h2, double s2, double b2, int count, u_char *red, u_char *green, u_char *blue) { double dh; double ds; double db; dh = (h2 - h1) / count; ds = (s2 - s1) / count; db = (b2 - b1) / count; while (count--) { hsb2rgb(h1, s1, b1, red++, green++, blue++); h1 += dh; s1 += ds; b1 += db; } }