xref: /aosp_15_r20/external/libpng/contrib/tools/sRGB.h (revision a67afe4df73cf47866eedc69947994b8ff839aba)
1*a67afe4dSAndroid Build Coastguard Worker /* sRGB.h
2*a67afe4dSAndroid Build Coastguard Worker  *
3*a67afe4dSAndroid Build Coastguard Worker  * COPYRIGHT: Written by John Cunningham Bowler, 2013.
4*a67afe4dSAndroid Build Coastguard Worker  * To the extent possible under law, the author has waived all copyright and
5*a67afe4dSAndroid Build Coastguard Worker  * related or neighboring rights to this work.  This work is published from:
6*a67afe4dSAndroid Build Coastguard Worker  * United States.
7*a67afe4dSAndroid Build Coastguard Worker  *
8*a67afe4dSAndroid Build Coastguard Worker  * Utility file; not actually a header, this contains definitions of sRGB
9*a67afe4dSAndroid Build Coastguard Worker  * calculation functions for inclusion in those test programs that need them.
10*a67afe4dSAndroid Build Coastguard Worker  *
11*a67afe4dSAndroid Build Coastguard Worker  * All routines take and return a floating point value in the range
12*a67afe4dSAndroid Build Coastguard Worker  * 0 to 1.0, doing a calculation according to the sRGB specification
13*a67afe4dSAndroid Build Coastguard Worker  * (in fact the source of the numbers is the wikipedia article at
14*a67afe4dSAndroid Build Coastguard Worker  * https://en.wikipedia.org/wiki/SRGB).
15*a67afe4dSAndroid Build Coastguard Worker  */
16*a67afe4dSAndroid Build Coastguard Worker 
17*a67afe4dSAndroid Build Coastguard Worker static double
sRGB_from_linear(double l)18*a67afe4dSAndroid Build Coastguard Worker sRGB_from_linear(double l)
19*a67afe4dSAndroid Build Coastguard Worker {
20*a67afe4dSAndroid Build Coastguard Worker    if (l <= 0.0031308)
21*a67afe4dSAndroid Build Coastguard Worker       l *= 12.92;
22*a67afe4dSAndroid Build Coastguard Worker 
23*a67afe4dSAndroid Build Coastguard Worker    else
24*a67afe4dSAndroid Build Coastguard Worker       l = 1.055 * pow(l, 1/2.4) - 0.055;
25*a67afe4dSAndroid Build Coastguard Worker 
26*a67afe4dSAndroid Build Coastguard Worker    return l;
27*a67afe4dSAndroid Build Coastguard Worker }
28*a67afe4dSAndroid Build Coastguard Worker 
29*a67afe4dSAndroid Build Coastguard Worker static double
linear_from_sRGB(double s)30*a67afe4dSAndroid Build Coastguard Worker linear_from_sRGB(double s)
31*a67afe4dSAndroid Build Coastguard Worker {
32*a67afe4dSAndroid Build Coastguard Worker    if (s <= 0.04045)
33*a67afe4dSAndroid Build Coastguard Worker       return s / 12.92;
34*a67afe4dSAndroid Build Coastguard Worker 
35*a67afe4dSAndroid Build Coastguard Worker    else
36*a67afe4dSAndroid Build Coastguard Worker       return pow((s+0.055)/1.055, 2.4);
37*a67afe4dSAndroid Build Coastguard Worker }
38*a67afe4dSAndroid Build Coastguard Worker 
39*a67afe4dSAndroid Build Coastguard Worker static double
YfromRGB(double r,double g,double b)40*a67afe4dSAndroid Build Coastguard Worker YfromRGB(double r, double g, double b)
41*a67afe4dSAndroid Build Coastguard Worker {
42*a67afe4dSAndroid Build Coastguard Worker    /* Use the sRGB (rounded) coefficients for Rlinear, Glinear, Blinear to get
43*a67afe4dSAndroid Build Coastguard Worker     * the CIE Y value (also linear).
44*a67afe4dSAndroid Build Coastguard Worker     */
45*a67afe4dSAndroid Build Coastguard Worker    return 0.2126 * r + 0.7152 * g + 0.0722 * b;
46*a67afe4dSAndroid Build Coastguard Worker }
47