• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef COLOR_H
17 #define COLOR_H
18 
19 #include <math.h>
20 
21 #include <SkColor.h>
22 #include <SkColorSpace.h>
23 
24 namespace android {
25 namespace uirenderer {
26     namespace Color {
27         enum Color {
28             Red_500 = 0xFFF44336,
29             Pink_500 = 0xFFE91E63,
30             Purple_500 = 0xFF9C27B0,
31             DeepPurple_500 = 0xFF673AB7,
32             Indigo_500 = 0xFF3F51B5,
33             Blue_500 = 0xFF2196F3,
34             LightBlue_300 = 0xFF4FC3F7,
35             LightBlue_500 = 0xFF03A9F4,
36             Cyan_500 = 0xFF00BCD4,
37             Teal_500 = 0xFF009688,
38             Teal_700 = 0xFF00796B,
39             Green_500 = 0xFF4CAF50,
40             Green_700 = 0xFF388E3C,
41             LightGreen_500 = 0xFF8BC34A,
42             LightGreen_700 = 0xFF689F38,
43             Lime_500 = 0xFFCDDC39,
44             Yellow_500 = 0xFFFFEB3B,
45             Amber_500 = 0xFFFFC107,
46             Orange_500 = 0xFFFF9800,
47             DeepOrange_500 = 0xFFFF5722,
48             Brown_500 = 0xFF795548,
49             Grey_200 = 0xFFEEEEEE,
50             Grey_500 = 0xFF9E9E9E,
51             Grey_700 = 0xFF616161,
52             BlueGrey_500 = 0xFF607D8B,
53             Transparent = 0x00000000,
54             Black = 0xFF000000,
55             White = 0xFFFFFFFF,
56         };
57     }
58 
59     static_assert(Color::White == SK_ColorWHITE, "color format has changed");
60     static_assert(Color::Black == SK_ColorBLACK, "color format has changed");
61 
62     // Array of bright (500 intensity) colors for synthetic content
63     static const Color::Color BrightColors[] = {
64         Color::Red_500,
65         Color::Pink_500,
66         Color::Purple_500,
67         Color::DeepPurple_500,
68         Color::Indigo_500,
69         Color::Blue_500,
70         Color::LightBlue_500,
71         Color::Cyan_500,
72         Color::Teal_500,
73         Color::Green_500,
74         Color::LightGreen_500,
75         Color::Lime_500,
76         Color::Yellow_500,
77         Color::Amber_500,
78         Color::Orange_500,
79         Color::DeepOrange_500,
80         Color::Brown_500,
81         Color::Grey_500,
82         Color::BlueGrey_500,
83     };
84     static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
85 
86     enum class TransferFunctionType : int8_t {
87         None = 0,
88         Full,
89         Limited,
90         Gamma
91     };
92 
93     // Opto-electronic conversion function for the sRGB color space
94     // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
OECF_sRGB(float linear)95     static constexpr float OECF_sRGB(float linear) {
96         // IEC 61966-2-1:1999
97         return linear <= 0.0031308f ?
98                 linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
99     }
100 
101     // Opto-electronic conversion function for the sRGB color space
102     // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
103     // This function returns the input unmodified if linear blending is not enabled
OECF(float linear)104     static constexpr float OECF(float linear) {
105 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
106         return OECF_sRGB(linear);
107 #else
108         return linear;
109 #endif
110     }
111 
112     // Electro-optical conversion function for the sRGB color space
113     // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
EOCF_sRGB(float srgb)114     static constexpr float EOCF_sRGB(float srgb) {
115         // IEC 61966-2-1:1999
116         return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
117     }
118 
119     // Electro-optical conversion function for the sRGB color space
120     // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
121     // This function returns the input unmodified if linear blending is not enabled
EOCF(float srgb)122     static constexpr float EOCF(float srgb) {
123 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
124         return EOCF_sRGB(srgb);
125 #else
126         return srgb;
127 #endif
128     }
129 
130     // Returns whether the specified color space's transfer function can be
131     // approximated with the native sRGB transfer function. This method
132     // returns true for sRGB, gamma 2.2 and Display P3 for instance
133     bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
134 } /* namespace uirenderer */
135 } /* namespace android */
136 
137 #endif /* COLOR_H */
138