Home | History | Annotate | Download | only in utils
      1 /*
      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 
     19 #include <math.h>
     20 #include <system/graphics.h>
     21 
     22 #include <SkColor.h>
     23 #include <SkColorSpace.h>
     24 
     25 namespace android {
     26 namespace uirenderer {
     27 namespace Color {
     28 enum Color {
     29     Red_500 = 0xFFF44336,
     30     Pink_500 = 0xFFE91E63,
     31     Purple_500 = 0xFF9C27B0,
     32     DeepPurple_500 = 0xFF673AB7,
     33     Indigo_500 = 0xFF3F51B5,
     34     Blue_500 = 0xFF2196F3,
     35     LightBlue_300 = 0xFF4FC3F7,
     36     LightBlue_500 = 0xFF03A9F4,
     37     Cyan_500 = 0xFF00BCD4,
     38     Teal_500 = 0xFF008577,
     39     Teal_700 = 0xFF00796B,
     40     Green_500 = 0xFF4CAF50,
     41     Green_700 = 0xFF388E3C,
     42     LightGreen_500 = 0xFF8BC34A,
     43     LightGreen_700 = 0xFF689F38,
     44     Lime_500 = 0xFFCDDC39,
     45     Yellow_500 = 0xFFFFEB3B,
     46     Amber_500 = 0xFFFFC107,
     47     Orange_500 = 0xFFFF9800,
     48     DeepOrange_500 = 0xFFFF5722,
     49     Brown_500 = 0xFF795548,
     50     Grey_200 = 0xFFEEEEEE,
     51     Grey_500 = 0xFF9E9E9E,
     52     Grey_700 = 0xFF616161,
     53     BlueGrey_500 = 0xFF607D8B,
     54     Transparent = 0x00000000,
     55     Black = 0xFF000000,
     56     White = 0xFFFFFFFF,
     57 };
     58 }
     59 
     60 static_assert(Color::White == SK_ColorWHITE, "color format has changed");
     61 static_assert(Color::Black == SK_ColorBLACK, "color format has changed");
     62 
     63 // Array of bright (500 intensity) colors for synthetic content
     64 static const Color::Color BrightColors[] = {
     65         Color::Red_500,    Color::Pink_500,  Color::Purple_500,     Color::DeepPurple_500,
     66         Color::Indigo_500, Color::Blue_500,  Color::LightBlue_500,  Color::Cyan_500,
     67         Color::Teal_500,   Color::Green_500, Color::LightGreen_500, Color::Lime_500,
     68         Color::Yellow_500, Color::Amber_500, Color::Orange_500,     Color::DeepOrange_500,
     69         Color::Brown_500,  Color::Grey_500,  Color::BlueGrey_500,
     70 };
     71 static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
     72 
     73 enum class TransferFunctionType : int8_t { None = 0, Full, Limited, Gamma };
     74 
     75 // Opto-electronic conversion function for the sRGB color space
     76 // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
     77 static constexpr float OECF_sRGB(float linear) {
     78     // IEC 61966-2-1:1999
     79     return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
     80 }
     81 
     82 // Opto-electronic conversion function for the sRGB color space
     83 // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
     84 // This function returns the input unmodified if linear blending is not enabled
     85 static constexpr float OECF(float linear) {
     86 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
     87     return OECF_sRGB(linear);
     88 #else
     89     return linear;
     90 #endif
     91 }
     92 
     93 // Electro-optical conversion function for the sRGB color space
     94 // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
     95 static constexpr float EOCF_sRGB(float srgb) {
     96     // IEC 61966-2-1:1999
     97     return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
     98 }
     99 
    100 // Electro-optical conversion function for the sRGB color space
    101 // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
    102 // This function returns the input unmodified if linear blending is not enabled
    103 static constexpr float EOCF(float srgb) {
    104 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
    105     return EOCF_sRGB(srgb);
    106 #else
    107     return srgb;
    108 #endif
    109 }
    110 
    111 // Returns whether the specified color space's transfer function can be
    112 // approximated with the native sRGB transfer function. This method
    113 // returns true for sRGB, gamma 2.2 and Display P3 for instance
    114 bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
    115 
    116 sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace);
    117 } /* namespace uirenderer */
    118 } /* namespace android */
    119 
    120 #endif /* COLOR_H */
    121