aboutsummaryrefslogtreecommitdiff
path: root/include/smcolor.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/smcolor.hpp')
-rw-r--r--include/smcolor.hpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/include/smcolor.hpp b/include/smcolor.hpp
new file mode 100644
index 0000000..94ff4f3
--- /dev/null
+++ b/include/smcolor.hpp
@@ -0,0 +1,90 @@
+// -*- C++ -*-
+/*
+ * Simple MultimEdia LiTerator(SMELT)
+ * by Chris Xiong 2015
+ * Color system header & implementation
+ *
+ * WARNING: This library is in development and interfaces would be very
+ * unstable.
+ *
+ */
+#ifndef SMCOLOR_H
+#define SMCOLOR_H
+#include "smelt.hpp"
+#include "smmath.hpp"
+#define clmp(a) a=a>1?1:a<0?0:a
+class smColorRGBA
+{
+public:
+ float r,g,b,a;
+ smColorRGBA(){r=g=b=a=.0;}
+ smColorRGBA(DWORD col){setHWColor(col);}
+ smColorRGBA(float _r,float _g,float _b,float _a){r=_r;g=_g;b=_b;a=_a;}
+ void clamp(){clmp(r);clmp(g);clmp(b);clmp(a);}
+ friend smColorRGBA operator +(smColorRGBA a,smColorRGBA b){return smColorRGBA(a.r+b.r,a.g+b.g,a.b+b.b,a.a+b.a);}
+ friend smColorRGBA operator -(smColorRGBA a,smColorRGBA b){return smColorRGBA(a.r-b.r,a.g-b.g,a.b-b.b,a.a-b.a);}
+ friend smColorRGBA operator *(smColorRGBA a,smColorRGBA b){return smColorRGBA(a.r*b.r,a.g*b.g,a.b*b.b,a.a*b.a);}
+ friend smColorRGBA operator *(smColorRGBA a,float b){return smColorRGBA(b*a.r,b*a.g,b*a.b,b*a.a);}
+ friend smColorRGBA operator /(smColorRGBA a,float b){return smColorRGBA(a.r/b,a.g/b,a.b/b,a.a/b);}
+ void setHWColor(DWORD col){a=GETA(col)/255.;r=GETR(col)/255.;g=GETG(col)/255.;b=GETB(col)/255.;}
+ DWORD getHWColor(){clamp();return RGBA(r,g,b,a);}
+};
+class smColorHSVA
+{
+public:
+ float h,s,v,a;
+ smColorHSVA(){h=s=v=a=.0;}
+ smColorHSVA(DWORD col){setHWColor(col);}
+ smColorHSVA(float _h,float _s,float _v,float _a){h=_h;s=_s;v=_v;a=_a;}
+ void clamp(){clmp(h);clmp(s);clmp(v);clmp(a);}
+ friend smColorHSVA operator +(smColorHSVA a,smColorHSVA b){return smColorHSVA(a.h+b.h,a.s+b.s,a.v+b.v,a.a+b.a);}
+ friend smColorHSVA operator -(smColorHSVA a,smColorHSVA b){return smColorHSVA(a.h-b.h,a.s-b.s,a.v-b.v,a.a-b.a);}
+ friend smColorHSVA operator *(smColorHSVA a,smColorHSVA b){return smColorHSVA(a.h*b.h,a.s*b.s,a.v*b.v,a.a*b.a);}
+ friend smColorHSVA operator *(smColorHSVA a,float b){return smColorHSVA(b*a.h,b*a.s,b*a.v,b*a.a);}
+ friend smColorHSVA operator /(smColorHSVA a,float b){return smColorHSVA(a.h/b,a.s/b,a.v/b,a.a/b);}
+ void setHWColor(DWORD col)
+ {
+ float r,g,b,dr,dg,db;
+ float minv,maxv,dv;
+ a=GETA(col)/255.;r=GETR(col)/255.;
+ g=GETG(col)/255.;b=GETB(col)/255.;
+ minv=min(min(r,g),b);maxv=max(max(r,g),b);
+ dv=maxv-minv;v=maxv;
+ if(dv<EPS)h=s=.0;
+ else
+ {
+ s=dv/maxv;
+ dr=(((maxv-r)/6)+dv/2)/dv;
+ dg=(((maxv-g)/6)+dv/2)/dv;
+ db=(((maxv-b)/6)+dv/2)/dv;
+ if(maxv==r)h=db-dg;
+ else if(maxv==g)h=(1./3.)+dr-db;
+ else if(maxv==b)h=(2./3.)+dg-dr;
+ }
+ clamp();
+ }
+ DWORD getHWColor()
+ {
+ clamp();
+ float r,g,b;
+ float xh,i,p1,p2,p3;
+ if(s<EPS)r=g=b=v;
+ else
+ {
+ xh=h*6;
+ if(fabsf(xh-6)<EPS)xh=0;
+ i=floorf(xh);
+ p1=v*(1-s);
+ p2=v*(1-s*(xh-i));
+ p3=v*(1-s*(1-(xh-i)));
+ if(i==0)r=v,g=p3,b=p1;
+ else if(i==1)r=p2,g=v,b=p1;
+ else if(i==2)r=p1,g=v,b=p3;
+ else if(i==3)r=p1,g=p2,b=v;
+ else if(i==4)r=p3,g=p1,b=v;
+ else r=v,g=p1,b=p2;
+ }
+ return RGBA(DWORD(r*255.0f),DWORD(g*255.0f),DWORD(b*255.0f),DWORD(a*255.0f));
+ }
+};
+#endif