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