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