summaryrefslogtreecommitdiff
path: root/ColorSpacesConversions.cpp
blob: 50789536fde504aa75647eb5c90d04a294432ee6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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;
}

//---------------------------------------------------------------------------