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 #include <system/graphics.h>
21
22 #include <SkColor.h>
23 #include <SkColorSpace.h>
24
25 namespace android {
26 namespace uirenderer {
27 namespace Color {
28 enum Color {
29 Red_500 = 0xFFF44336,
30 Pink_500 = 0xFFE91E63,
31 Purple_500 = 0xFF9C27B0,
32 DeepPurple_500 = 0xFF673AB7,
33 Indigo_500 = 0xFF3F51B5,
34 Blue_500 = 0xFF2196F3,
35 LightBlue_300 = 0xFF4FC3F7,
36 LightBlue_500 = 0xFF03A9F4,
37 Cyan_500 = 0xFF00BCD4,
38 Teal_500 = 0xFF008577,
39 Teal_700 = 0xFF00796B,
40 Green_500 = 0xFF4CAF50,
41 Green_700 = 0xFF388E3C,
42 LightGreen_500 = 0xFF8BC34A,
43 LightGreen_700 = 0xFF689F38,
44 Lime_500 = 0xFFCDDC39,
45 Yellow_500 = 0xFFFFEB3B,
46 Amber_500 = 0xFFFFC107,
47 Orange_500 = 0xFFFF9800,
48 DeepOrange_500 = 0xFFFF5722,
49 Brown_500 = 0xFF795548,
50 Grey_200 = 0xFFEEEEEE,
51 Grey_500 = 0xFF9E9E9E,
52 Grey_700 = 0xFF616161,
53 BlueGrey_500 = 0xFF607D8B,
54 Transparent = 0x00000000,
55 Black = 0xFF000000,
56 White = 0xFFFFFFFF,
57 };
58 }
59
60 static_assert(Color::White == SK_ColorWHITE, "color format has changed");
61 static_assert(Color::Black == SK_ColorBLACK, "color format has changed");
62
63 // Array of bright (500 intensity) colors for synthetic content
64 static const Color::Color BrightColors[] = {
65 Color::Red_500, Color::Pink_500, Color::Purple_500, Color::DeepPurple_500,
66 Color::Indigo_500, Color::Blue_500, Color::LightBlue_500, Color::Cyan_500,
67 Color::Teal_500, Color::Green_500, Color::LightGreen_500, Color::Lime_500,
68 Color::Yellow_500, Color::Amber_500, Color::Orange_500, Color::DeepOrange_500,
69 Color::Brown_500, Color::Grey_500, Color::BlueGrey_500,
70 };
71 static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
72
73 enum class TransferFunctionType : int8_t { None = 0, Full, Limited, Gamma };
74
75 // Opto-electronic conversion function for the sRGB color space
76 // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
OECF_sRGB(float linear)77 static constexpr float OECF_sRGB(float linear) {
78 // IEC 61966-2-1:1999
79 return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
80 }
81
82 // Opto-electronic conversion function for the sRGB color space
83 // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
84 // This function returns the input unmodified if linear blending is not enabled
OECF(float linear)85 static constexpr float OECF(float linear) {
86 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
87 return OECF_sRGB(linear);
88 #else
89 return linear;
90 #endif
91 }
92
93 // Electro-optical conversion function for the sRGB color space
94 // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
EOCF_sRGB(float srgb)95 static constexpr float EOCF_sRGB(float srgb) {
96 // IEC 61966-2-1:1999
97 return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
98 }
99
100 // Electro-optical conversion function for the sRGB color space
101 // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
102 // This function returns the input unmodified if linear blending is not enabled
EOCF(float srgb)103 static constexpr float EOCF(float srgb) {
104 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
105 return EOCF_sRGB(srgb);
106 #else
107 return srgb;
108 #endif
109 }
110
111 // Returns whether the specified color space's transfer function can be
112 // approximated with the native sRGB transfer function. This method
113 // returns true for sRGB, gamma 2.2 and Display P3 for instance
114 bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
115
116 sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace);
117 } /* namespace uirenderer */
118 } /* namespace android */
119
120 #endif /* COLOR_H */
121