diff options
| author | horchi <vdr@jwendel.de> | 2017-03-05 16:49:27 +0100 |
|---|---|---|
| committer | horchi <vdr@jwendel.de> | 2017-03-05 16:49:27 +0100 |
| commit | 6965ee5e2570436648ecd9b50197c80fd3c28565 (patch) | |
| tree | bdd78eac61983d68a173f0b473f030be2b0c2ff7 /seduservice.c | |
| download | vdr-plugin-seduatmo-0.0.3.tar.gz vdr-plugin-seduatmo-0.0.3.tar.bz2 | |
init git0.0.3
Diffstat (limited to 'seduservice.c')
| -rw-r--r-- | seduservice.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/seduservice.c b/seduservice.c new file mode 100644 index 0000000..1f241da --- /dev/null +++ b/seduservice.c @@ -0,0 +1,140 @@ +/* + * seduservice.c: A plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + * $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 +//*************************************************************************** + +const char* cSeduService::viewModes[] = +{ + "atmo", + "fixed color", + "rainbow", + "moving color wheel", + "static color wheel", + "black", + "detached", + + 0 +}; + +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; +} |
