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