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 
     21 #include <SkColor.h>
     22 #include <SkColorSpace.h>
     23 
     24 namespace android {
     25 namespace uirenderer {
     26     namespace Color {
     27         enum 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,
     37             Teal_500 = 0xFF009688,
     38             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     }
     58 
     59     static_assert(Color::White == SK_ColorWHITE, "color format has changed");
     60     static_assert(Color::Black == SK_ColorBLACK, "color format has changed");
     61 
     62     // Array of bright (500 intensity) colors for synthetic content
     63     static const Color::Color BrightColors[] = {
     64         Color::Red_500,
     65         Color::Pink_500,
     66         Color::Purple_500,
     67         Color::DeepPurple_500,
     68         Color::Indigo_500,
     69         Color::Blue_500,
     70         Color::LightBlue_500,
     71         Color::Cyan_500,
     72         Color::Teal_500,
     73         Color::Green_500,
     74         Color::LightGreen_500,
     75         Color::Lime_500,
     76         Color::Yellow_500,
     77         Color::Amber_500,
     78         Color::Orange_500,
     79         Color::DeepOrange_500,
     80         Color::Brown_500,
     81         Color::Grey_500,
     82         Color::BlueGrey_500,
     83     };
     84     static constexpr int BrightColorsCount = sizeof(BrightColors) / sizeof(Color::Color);
     85 
     86     enum class TransferFunctionType : int8_t {
     87         None = 0,
     88         Full,
     89         Limited,
     90         Gamma
     91     };
     92 
     93     // Opto-electronic conversion function for the sRGB color space
     94     // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
     95     static constexpr float OECF_sRGB(float linear) {
     96         // IEC 61966-2-1:1999
     97         return linear <= 0.0031308f ?
     98                 linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
     99     }
    100 
    101     // Opto-electronic conversion function for the sRGB color space
    102     // Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
    103     // This function returns the input unmodified if linear blending is not enabled
    104     static constexpr float OECF(float linear) {
    105 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
    106         return OECF_sRGB(linear);
    107 #else
    108         return linear;
    109 #endif
    110     }
    111 
    112     // Electro-optical conversion function for the sRGB color space
    113     // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
    114     static constexpr float EOCF_sRGB(float srgb) {
    115         // IEC 61966-2-1:1999
    116         return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
    117     }
    118 
    119     // Electro-optical conversion function for the sRGB color space
    120     // Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
    121     // This function returns the input unmodified if linear blending is not enabled
    122     static constexpr float EOCF(float srgb) {
    123 #ifdef ANDROID_ENABLE_LINEAR_BLENDING
    124         return EOCF_sRGB(srgb);
    125 #else
    126         return srgb;
    127 #endif
    128     }
    129 
    130     // Returns whether the specified color space's transfer function can be
    131     // approximated with the native sRGB transfer function. This method
    132     // returns true for sRGB, gamma 2.2 and Display P3 for instance
    133     bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace);
    134 } /* namespace uirenderer */
    135 } /* namespace android */
    136 
    137 #endif /* COLOR_H */
    138