summaryrefslogtreecommitdiff
path: root/ColorSpacesConversions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ColorSpacesConversions.cpp')
-rw-r--r--ColorSpacesConversions.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/ColorSpacesConversions.cpp b/ColorSpacesConversions.cpp
new file mode 100644
index 0000000..5078953
--- /dev/null
+++ b/ColorSpacesConversions.cpp
@@ -0,0 +1,120 @@
+//---------------------------------------------------------------------------
+
+#include "ColorSpacesConversions.h"
+
+#define max(a,b) (a>b?a:b)
+#define min(a,b) (a<b?a:b)
+
+void HSLfromRGB(unsigned char* cHSL,unsigned char* cRGB)
+{
+ unsigned char iR=cRGB[0];
+ unsigned char iG=cRGB[1];
+ unsigned char iB=cRGB[2];
+ float fR = ((float)iR)/255;
+ float fG = ((float)iG)/255;
+ float fB = ((float)iB)/255;
+ float fL,fH,fS;
+ char iL,iH,iS;
+
+ float minRGB=min(fR,min(fG,fB));
+ float maxRGB=max(fR,max(fG,fB));
+ float deltaRGB=maxRGB - minRGB;
+
+ float deltaR = (((maxRGB-fR)/6)+(deltaRGB/2))/deltaRGB;
+ float deltaG = (((maxRGB-fG)/6)+(deltaRGB/2))/deltaRGB;
+ float deltaB = (((maxRGB-fB)/6)+(deltaRGB/2))/deltaRGB;
+
+
+ fL = (minRGB+maxRGB)/2;
+
+ if(deltaRGB==0)
+ fH=fS=0;
+ else
+ {
+ if(fL<0.5)
+ fS = deltaRGB/(minRGB+maxRGB);
+ else
+ fS = deltaRGB/(2.0-minRGB-maxRGB);
+
+ if(fR==maxRGB)
+ fH = deltaB - deltaG;
+ else if(fG==maxRGB)
+ fH = (1.0/3)+deltaR-deltaB;
+ else if (fB==maxRGB)
+ fH = (2.0/3)+deltaG-deltaR;
+ else
+ fH = 0;
+
+ if(fH<0)
+ fH+=1;
+ if(fH>1)
+ fH-=1;
+ }
+
+ iH=(unsigned char)(fH*255);
+ iS=(unsigned char)(fS*255);
+ iL=(unsigned char)(fL*255);
+
+ cHSL[0]=iH;
+ cHSL[1]=iS;
+ cHSL[2]=iL;
+}
+
+
+float SubFunForRGBfromHSL(float v1,float v2,float v3)
+{
+ float vH=v3;
+ if(vH<0)
+ vH+=1;
+ if(vH>1)
+ vH-=1;
+ if((6*vH)<1.0)
+ return v1+(v2-v1)*6*vH;
+ if((2*vH)<1)
+ return v2;
+ if((3*vH)<2.0)
+ return v1+(v2-v1)*((2.0/3)-vH)*6;
+ return v1;
+}
+
+
+void RGBfromHSL(unsigned char* cRGB,unsigned char* cHSL)
+{
+ unsigned char iH=cHSL[0];
+ unsigned char iS=cHSL[1];
+ unsigned char iL=cHSL[2];
+ float fH = ((float)iH)/255;
+ float fS = ((float)iS)/255;
+ float fL = ((float)iL)/255;
+ float v1,v2;
+ float fR,fG,fB;
+ char iR,iG,iB;
+
+ if(fS==0)
+ {
+ fR=fL;
+ fG=fL;
+ fB=fL;
+ }
+ else
+ {
+ if (fL<0.5)
+ v2=fL*(1.0+fS);
+ else
+ v2=(fL+fS)-(fS*fL);
+ v1=2*fL-v2;
+ fR=SubFunForRGBfromHSL(v1,v2,fH+(1.0/3));
+ fG=SubFunForRGBfromHSL(v1,v2,fH);
+ fB=SubFunForRGBfromHSL(v1,v2,fH-(1.0/3));
+ }
+
+ iR=(unsigned char)(fR*255);
+ iG=(unsigned char)(fG*255);
+ iB=(unsigned char)(fB*255);
+
+ cRGB[0]=iR;
+ cRGB[1]=iG;
+ cRGB[2]=iB;
+}
+
+//---------------------------------------------------------------------------