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 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 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 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 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