154fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik/* 254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * Copyright (C) 2015 The Android Open Source Project 354fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * 454fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 554fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * you may not use this file except in compliance with the License. 654fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * You may obtain a copy of the License at 754fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * 854fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 954fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * 1054fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * Unless required by applicable law or agreed to in writing, software 1154fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 1254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * See the License for the specific language governing permissions and 1454fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik * limitations under the License. 1554fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik */ 1654fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik#ifndef COLOR_H 1754fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik#define COLOR_H 1854fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 19253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#include <math.h> 20551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger#include <system/graphics.h> 21253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy 2254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik#include <SkColor.h> 23caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy#include <SkColorSpace.h> 2454fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 2554fa17f667c285a5c9225e238c8132dfe830ef36Chris Craiknamespace android { 2654fa17f667c285a5c9225e238c8132dfe830ef36Chris Craiknamespace uirenderer { 271bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Recknamespace Color { 281bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum Color { 291bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Red_500 = 0xFFF44336, 301bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Pink_500 = 0xFFE91E63, 311bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Purple_500 = 0xFF9C27B0, 321bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck DeepPurple_500 = 0xFF673AB7, 331bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Indigo_500 = 0xFF3F51B5, 341bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Blue_500 = 0xFF2196F3, 351bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck LightBlue_300 = 0xFF4FC3F7, 361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck LightBlue_500 = 0xFF03A9F4, 371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Cyan_500 = 0xFF00BCD4, 388546c30fbfa7fc3e84d18d13a16cbfdd743d18e3Andrew Sapperstein Teal_500 = 0xFF008577, 391bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Teal_700 = 0xFF00796B, 401bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Green_500 = 0xFF4CAF50, 411bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Green_700 = 0xFF388E3C, 421bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck LightGreen_500 = 0xFF8BC34A, 431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck LightGreen_700 = 0xFF689F38, 441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Lime_500 = 0xFFCDDC39, 451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Yellow_500 = 0xFFFFEB3B, 461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Amber_500 = 0xFFFFC107, 471bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Orange_500 = 0xFFFF9800, 481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck DeepOrange_500 = 0xFFFF5722, 491bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Brown_500 = 0xFF795548, 501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Grey_200 = 0xFFEEEEEE, 511bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Grey_500 = 0xFF9E9E9E, 521bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Grey_700 = 0xFF616161, 531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck BlueGrey_500 = 0xFF607D8B, 541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Transparent = 0x00000000, 551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Black = 0xFF000000, 561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck White = 0xFFFFFFFF, 571bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}; 581bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck} 5954fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 601bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic_assert(Color::White == SK_ColorWHITE, "color format has changed"); 611bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic_assert(Color::Black == SK_ColorBLACK, "color format has changed"); 6254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 631bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Array of bright (500 intensity) colors for synthetic content 641bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic const Color::Color BrightColors[] = { 651bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Color::Red_500, Color::Pink_500, Color::Purple_500, Color::DeepPurple_500, 661bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Color::Indigo_500, Color::Blue_500, Color::LightBlue_500, Color::Cyan_500, 671bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Color::Teal_500, Color::Green_500, Color::LightGreen_500, Color::Lime_500, 681bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Color::Yellow_500, Color::Amber_500, Color::Orange_500, Color::DeepOrange_500, 691bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Color::Brown_500, Color::Grey_500, Color::BlueGrey_500, 701bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}; 711bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color); 7254fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 731bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum class TransferFunctionType : int8_t { None = 0, Full, Limited, Gamma }; 74caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy 751bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Opto-electronic conversion function for the sRGB color space 761bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value 771bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic constexpr float OECF_sRGB(float linear) { 781bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck // IEC 61966-2-1:1999 791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f; 801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck} 818762e332e3797fb41929a1c6069207f4906ca329Romain Guy 821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Opto-electronic conversion function for the sRGB color space 831bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value 841bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// This function returns the input unmodified if linear blending is not enabled 851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic constexpr float OECF(float linear) { 868762e332e3797fb41929a1c6069207f4906ca329Romain Guy#ifdef ANDROID_ENABLE_LINEAR_BLENDING 871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return OECF_sRGB(linear); 88253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#else 891bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return linear; 90253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#endif 911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck} 92253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy 931bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Electro-optical conversion function for the sRGB color space 941bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value 951bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic constexpr float EOCF_sRGB(float srgb) { 961bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck // IEC 61966-2-1:1999 971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f); 981bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck} 998762e332e3797fb41929a1c6069207f4906ca329Romain Guy 1001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Electro-optical conversion function for the sRGB color space 1011bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value 1021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// This function returns the input unmodified if linear blending is not enabled 1031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic constexpr float EOCF(float srgb) { 1048762e332e3797fb41929a1c6069207f4906ca329Romain Guy#ifdef ANDROID_ENABLE_LINEAR_BLENDING 1051bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return EOCF_sRGB(srgb); 106253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#else 1071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck return srgb; 108253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy#endif 1091bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck} 110caaaa66e57293e4a6f312649bf472eab84d5c7feRomain Guy 1111bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// Returns whether the specified color space's transfer function can be 1121bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// approximated with the native sRGB transfer function. This method 1131bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck// returns true for sRGB, gamma 2.2 and Display P3 for instance 1141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckbool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace); 115551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenberger 116551d08e2d50c7f73c5eb65fd366b92efba4f0ed5Derek Sollenbergersk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace); 11754fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik} /* namespace uirenderer */ 11854fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik} /* namespace android */ 11954fa17f667c285a5c9225e238c8132dfe830ef36Chris Craik 120efb4b06493fe7b1604c762a448b13c7af2845a8dRomain Guy#endif /* COLOR_H */ 121