mca-pendel/sketches/pendulum/color_hsv.c

62 lines
1.8 KiB
C

#include "color_hsv.h"
void interpolate(hsv_t start, hsv_t end, size_t steps, hsv_t *colors) {
if( steps == 1 ) {
colors[0] = start;
return;
}
for( size_t i = 0; i < steps; i++ ) {
hsv_t tmp;
tmp.hue = (uint16_t)((int16_t)start.hue + ((int16_t)end.hue - (int16_t)start.hue) * (int16_t)i / ((int16_t)steps-1));
tmp.sat = (uint8_t)((int16_t)start.sat + ((int16_t)end.sat - (int16_t)start.sat) * (int16_t)i / ((int16_t)steps-1));
tmp.val = (uint8_t)((int16_t)start.val + ((int16_t)end.val - (int16_t)start.val) * (int16_t)i / ((int16_t)steps-1));
colors[i] = tmp;
}
}
void hsv2rgbList(hsv_t* hsvList, rgb_t* rgbList, size_t count) {
for(size_t i = 0; i < count; ++i) {
rgbList[i] = hsv2rgb(&hsvList[i]);
}
}
rgb_t hsv2rgb(hsv_t* hsv) {
rgb_t res;
if(hsv->sat == 0) {
res.r = res.g = res.b = hsv->val;
} else {
float hue = (float) (hsv->hue<360?hsv->hue:hsv->hue-360);
float val = ((float) hsv->val ) / 100.0;
float sat = ((float) hsv->sat ) / 100.0;
uint8_t h = hue / 60;
float f = ( hue / 60 ) - h;
uint8_t p = RGB_MAX * ( val * ( 1 - sat ));
uint8_t q = RGB_MAX * ( val * ( 1 - sat * f ));
uint8_t t = RGB_MAX * ( val * ( 1 - sat * ( 1 - f )));
switch(h) {
case 0:
case 6: res.r = hsv->val; res.g = t; res.b = p; break;
case 1: res.r = q; res.g = hsv->val; res.b = p; break;
case 2: res.r = p; res.g = hsv->val; res.b = t; break;
case 3: res.r = p; res.g = q; res.b = hsv->val; break;
case 4: res.r = t; res.g = p; res.b = hsv->val; break;
case 5: res.r = hsv->hue; res.g = p; res.b = q; break;
}
}
return res;
}
hsv_t init_hsv_t(uint16_t hue, uint8_t sat, uint8_t val) {
hsv_t tmp;
tmp.hue = hue;
tmp.sat = sat;
tmp.val = val;
return tmp;
}