/**
* @file gradient.c
* @author Joe Wingbermuehle
* @date 2006
*
* @brief Gradient fill functions.
*
*/
#include "jwm.h"
#include "gradient.h"
#include "color.h"
#include "main.h"
/** Draw a horizontal gradient. */
void DrawHorizontalGradient(Drawable d, GC g,
long fromColor, long toColor,
int x, int y, unsigned int width, unsigned int height) {
unsigned int line;
XColor temp;
float red, green, blue;
float ared, agreen, ablue;
float bred, bgreen, bblue;
float multiplier;
float amult, bmult;
/* Return if there's nothing to do. */
if(width == 0 || height == 0) {
return;
}
/* Here we assume that the background was filled elsewhere. */
if(fromColor == toColor) {
return;
}
/* Load the "from" color. */
temp.pixel = fromColor;
GetColorFromPixel(&temp);
ared = (float)temp.red / 65535.0;
agreen = (float)temp.green / 65535.0;
ablue = (float)temp.blue / 65535.0;
/** Load the "to" color. */
temp.pixel = toColor;
GetColorFromPixel(&temp);
bred = (float)temp.red / 65535.0;
bgreen = (float)temp.green / 65535.0;
bblue = (float)temp.blue / 65535.0;
multiplier = 1.0 / height;
/* Loop over each line. */
for(line = 0; line < height; line++) {
bmult = line * multiplier;
amult = 1.0 - bmult;
/* Determine the color for this line. */
red = ared * amult + bred * bmult;
green = agreen * amult + bgreen * bmult;
blue = ablue * amult + bblue * bmult;
temp.red = (unsigned short)(red * 65535.9);
temp.green = (unsigned short)(green * 65535.9);
temp.blue = (unsigned short)(blue * 65535.9);
GetColor(&temp);
/* Draw the line. */
JXSetForeground(display, g, temp.pixel);
JXDrawLine(display, d, g, x, y + line, x + width, y + line);
}
}
syntax highlighted by Code2HTML, v. 0.9.1