blob: 9c096601c8261bffd780252e8b97eb22f3897f5e [file] [log] [blame]
/*
* 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 */