diff options
author | horchi <vdr@jwendel.de> | 2012-11-30 07:38:44 +0100 |
---|---|---|
committer | horchi <vdr@jwendel.de> | 2012-11-30 07:38:44 +0100 |
commit | 58250a33a5f60aa415c3b4548096ab3b37368b0a (patch) | |
tree | 789c1377d38aea960228b4328f703c98072ec050 /seduservice.c | |
parent | 77d98f2dea54da5aa987ae1ad6cc7d16e5b577ee (diff) | |
download | vdr-plugin-seduatmo-58250a33a5f60aa415c3b4548096ab3b37368b0a.tar.gz vdr-plugin-seduatmo-58250a33a5f60aa415c3b4548096ab3b37368b0a.tar.bz2 |
added wheel effects provides by TheChief
Diffstat (limited to 'seduservice.c')
-rw-r--r-- | seduservice.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/seduservice.c b/seduservice.c index d82f86e..d55e5ff 100644 --- a/seduservice.c +++ b/seduservice.c @@ -6,7 +6,9 @@ * $Id: seduservice.c,v 1.3 2012/11/22 18:02:59 wendel Exp $ */ +#include <math.h> #include "seduservice.h" +#include "common.h" //*************************************************************************** // View Modes @@ -17,6 +19,8 @@ const char* cSeduService::viewModes[] = "atmo", "fixed color", "rainbow", + "moving color wheel", + "static color wheel", "black", "detached", @@ -27,3 +31,108 @@ const char* cSeduService::toName(ViewMode vm) { return viewModes[vm]; } +//*************************************************************************** +// Color conversion functions +//*************************************************************************** + +void cSeduService::rgb2hsv(int r, int g, int b, double* h, double* s, double* v) +{ + double minC, maxC, delta, rc, gc, bc; + rc = (double)r / 255.0; + gc = (double)g / 255.0; + bc = (double)b / 255.0; + maxC = max(rc, max(gc, bc)); + minC = min(rc, min(gc, bc)); + delta = maxC - minC; + *v = maxC; + + if (maxC != 0) + *s = delta / maxC; + else + *s = 0; + + if (*s == 0) + { + *h = 0; + } + else + { + if (rc == maxC) + *h = (gc - bc) / delta; + else if (gc == maxC) + *h = 2 + (bc - rc) / delta; + else if (bc == maxC) + *h = 4 + (rc - gc) / delta; + + *h *= 60.0; + + if (*h < 0) + *h += 360.0; + } +} + +//*************************************************************************** +// +//*************************************************************************** + +Pixel cSeduService::hsv2rgb(int h, double s, double v) +{ + Pixel p; + + double rr = 0; + double gg = 0; + double bb = 0; + + int i = floor(h/60.0); + double f = h/60.0 - i; + double pv = v * (1 - s); + double qv = v * (1 - s * f); + double tv = v * (1 - s * (1-f)); + + switch (i) + { + case 0: // rojo dominante + rr = v; + gg = tv; + bb = pv; + break; + + case 1: // verde + rr = qv; + gg = v; + bb = pv; + break; + + case 2: + rr = pv; + gg = v; + bb = tv; + break; + + case 3: // azul + rr = pv; + gg = qv; + bb = v; + break; + + case 4: + rr = tv; + gg = pv; + bb = v; + break; + + case 5: // rojo + rr = v; + gg = pv; + bb = qv; + break; + } + + // set each component to a integer value between 0 and 255 + + p.r = minMax(255*rr, 0, 255); + p.g = minMax(255*gg, 0, 255); + p.b = minMax(255*bb, 0, 255); + + return p; +} |