blob: 4857a87ff97b03d54157447a4505c78998e4c958 [file] [log] [blame]
Chris Craik54fa17f2015-11-25 14:14:53 -08001/*
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
Romain Guy253f2c22016-09-28 17:34:42 -070019#include <math.h>
20
Chris Craik54fa17f2015-11-25 14:14:53 -080021#include <SkColor.h>
Romain Guycaaaa662017-03-27 00:40:21 -070022#include <SkColorSpace.h>
Chris Craik54fa17f2015-11-25 14:14:53 -080023
24namespace android {
25namespace uirenderer {
John Reck1bcacfd2017-11-03 10:12:19 -070026namespace Color {
27enum 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,
Andrew Sapperstein431d9d62018-03-22 15:54:23 +000037 Teal_500 = 0xFF009688,
John Reck1bcacfd2017-11-03 10:12:19 -070038 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}
Chris Craik54fa17f2015-11-25 14:14:53 -080058
John Reck1bcacfd2017-11-03 10:12:19 -070059static_assert(Color::White == SK_ColorWHITE, "color format has changed");
60static_assert(Color::Black == SK_ColorBLACK, "color format has changed");
Chris Craik54fa17f2015-11-25 14:14:53 -080061
John Reck1bcacfd2017-11-03 10:12:19 -070062// Array of bright (500 intensity) colors for synthetic content
63static const Color::Color BrightColors[] = {
64 Color::Red_500, Color::Pink_500, Color::Purple_500, Color::DeepPurple_500,
65 Color::Indigo_500, Color::Blue_500, Color::LightBlue_500, Color::Cyan_500,
66 Color::Teal_500, Color::Green_500, Color::LightGreen_500, Color::Lime_500,
67 Color::Yellow_500, Color::Amber_500, Color::Orange_500, Color::DeepOrange_500,
68 Color::Brown_500, Color::Grey_500, Color::BlueGrey_500,
69};
70static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
Chris Craik54fa17f2015-11-25 14:14:53 -080071
John Reck1bcacfd2017-11-03 10:12:19 -070072enum class TransferFunctionType : int8_t { None = 0, Full, Limited, Gamma };
Romain Guycaaaa662017-03-27 00:40:21 -070073
John Reck1bcacfd2017-11-03 10:12:19 -070074// Opto-electronic conversion function for the sRGB color space
75// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
76static constexpr float OECF_sRGB(float linear) {
77 // IEC 61966-2-1:1999
78 return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
79}
Romain Guy8762e332016-10-12 12:14:07 -070080
John Reck1bcacfd2017-11-03 10:12:19 -070081// Opto-electronic conversion function for the sRGB color space
82// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
83// This function returns the input unmodified if linear blending is not enabled
84static constexpr float OECF(float linear) {
Romain Guy8762e332016-10-12 12:14:07 -070085#ifdef ANDROID_ENABLE_LINEAR_BLENDING
John Reck1bcacfd2017-11-03 10:12:19 -070086 return OECF_sRGB(linear);
Romain Guy253f2c22016-09-28 17:34:42 -070087#else
John Reck1bcacfd2017-11-03 10:12:19 -070088 return linear;
Romain Guy253f2c22016-09-28 17:34:42 -070089#endif
John Reck1bcacfd2017-11-03 10:12:19 -070090}
Romain Guy253f2c22016-09-28 17:34:42 -070091
John Reck1bcacfd2017-11-03 10:12:19 -070092// Electro-optical conversion function for the sRGB color space
93// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
94static constexpr float EOCF_sRGB(float srgb) {
95 // IEC 61966-2-1:1999
96 return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
97}
Romain Guy8762e332016-10-12 12:14:07 -070098
John Reck1bcacfd2017-11-03 10:12:19 -070099// Electro-optical conversion function for the sRGB color space
100// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
101// This function returns the input unmodified if linear blending is not enabled
102static constexpr float EOCF(float srgb) {
Romain Guy8762e332016-10-12 12:14:07 -0700103#ifdef ANDROID_ENABLE_LINEAR_BLENDING
John Reck1bcacfd2017-11-03 10:12:19 -0700104 return EOCF_sRGB(srgb);
Romain Guy253f2c22016-09-28 17:34:42 -0700105#else
John Reck1bcacfd2017-11-03 10:12:19 -0700106 return srgb;
Romain Guy253f2c22016-09-28 17:34:42 -0700107#endif
John Reck1bcacfd2017-11-03 10:12:19 -0700108}
Romain Guycaaaa662017-03-27 00:40:21 -0700109
John Reck1bcacfd2017-11-03 10:12:19 -0700110// Returns whether the specified color space's transfer function can be
111// approximated with the native sRGB transfer function. This method
112// returns true for sRGB, gamma 2.2 and Display P3 for instance
113bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
Chris Craik54fa17f2015-11-25 14:14:53 -0800114} /* namespace uirenderer */
115} /* namespace android */
116
Romain Guyefb4b062017-02-27 11:00:04 -0800117#endif /* COLOR_H */