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 25namespace android { 26namespace uirenderer { 27namespace Color { 28enum 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 60static_assert(Color::White == SK_ColorWHITE, "color format has changed"); 61static_assert(Color::Black == SK_ColorBLACK, "color format has changed"); 62 63// Array of bright (500 intensity) colors for synthetic content 64static 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}; 71static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color); 72 73enum 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 77static 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 85static 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 95static 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 103static 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 114bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace); 115 116sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace); 117} /* namespace uirenderer */ 118} /* namespace android */ 119 120#endif /* COLOR_H */ 121