| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #ifndef COLOR_H |
| #define COLOR_H |
| |
| #include <math.h> |
| |
| #include <SkColor.h> |
| #include <SkColorSpace.h> |
| |
| namespace android { |
| namespace uirenderer { |
| namespace Color { |
| enum Color { |
| Red_500 = 0xFFF44336, |
| Pink_500 = 0xFFE91E63, |
| Purple_500 = 0xFF9C27B0, |
| DeepPurple_500 = 0xFF673AB7, |
| Indigo_500 = 0xFF3F51B5, |
| Blue_500 = 0xFF2196F3, |
| LightBlue_300 = 0xFF4FC3F7, |
| LightBlue_500 = 0xFF03A9F4, |
| Cyan_500 = 0xFF00BCD4, |
| Teal_500 = 0xFF009688, |
| Teal_700 = 0xFF00796B, |
| Green_500 = 0xFF4CAF50, |
| Green_700 = 0xFF388E3C, |
| LightGreen_500 = 0xFF8BC34A, |
| LightGreen_700 = 0xFF689F38, |
| Lime_500 = 0xFFCDDC39, |
| Yellow_500 = 0xFFFFEB3B, |
| Amber_500 = 0xFFFFC107, |
| Orange_500 = 0xFFFF9800, |
| DeepOrange_500 = 0xFFFF5722, |
| Brown_500 = 0xFF795548, |
| Grey_200 = 0xFFEEEEEE, |
| Grey_500 = 0xFF9E9E9E, |
| Grey_700 = 0xFF616161, |
| BlueGrey_500 = 0xFF607D8B, |
| Transparent = 0x00000000, |
| Black = 0xFF000000, |
| White = 0xFFFFFFFF, |
| }; |
| } |
| |
| static_assert(Color::White == SK_ColorWHITE, "color format has changed"); |
| static_assert(Color::Black == SK_ColorBLACK, "color format has changed"); |
| |
| // Array of bright (500 intensity) colors for synthetic content |
| static const Color::Color BrightColors[] = { |
| Color::Red_500, |
| Color::Pink_500, |
| Color::Purple_500, |
| Color::DeepPurple_500, |
| Color::Indigo_500, |
| Color::Blue_500, |
| Color::LightBlue_500, |
| Color::Cyan_500, |
| Color::Teal_500, |
| Color::Green_500, |
| Color::LightGreen_500, |
| Color::Lime_500, |
| Color::Yellow_500, |
| Color::Amber_500, |
| Color::Orange_500, |
| Color::DeepOrange_500, |
| Color::Brown_500, |
| Color::Grey_500, |
| Color::BlueGrey_500, |
| }; |
| static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color); |
| |
| enum class TransferFunctionType : int8_t { |
| None = 0, |
| Full, |
| Limited, |
| Gamma |
| }; |
| |
| // Opto-electronic conversion function for the sRGB color space |
| // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value |
| static constexpr float OECF_sRGB(float linear) { |
| // IEC 61966-2-1:1999 |
| return linear <= 0.0031308f ? |
| linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f; |
| } |
| |
| // Opto-electronic conversion function for the sRGB color space |
| // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value |
| // This function returns the input unmodified if linear blending is not enabled |
| static constexpr float OECF(float linear) { |
| #ifdef ANDROID_ENABLE_LINEAR_BLENDING |
| return OECF_sRGB(linear); |
| #else |
| return linear; |
| #endif |
| } |
| |
| // Electro-optical conversion function for the sRGB color space |
| // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value |
| static constexpr float EOCF_sRGB(float srgb) { |
| // IEC 61966-2-1:1999 |
| return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f); |
| } |
| |
| // Electro-optical conversion function for the sRGB color space |
| // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value |
| // This function returns the input unmodified if linear blending is not enabled |
| static constexpr float EOCF(float srgb) { |
| #ifdef ANDROID_ENABLE_LINEAR_BLENDING |
| return EOCF_sRGB(srgb); |
| #else |
| return srgb; |
| #endif |
| } |
| |
| // Returns whether the specified color space's transfer function can be |
| // approximated with the native sRGB transfer function. This method |
| // returns true for sRGB, gamma 2.2 and Display P3 for instance |
| bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace); |
| } /* namespace uirenderer */ |
| } /* namespace android */ |
| |
| #endif /* COLOR_H */ |