Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2006 The Android Open Source Project
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef SkColor_DEFINED
      9 #define SkColor_DEFINED
     10 
     11 #include "SkScalar.h"
     12 #include "SkTypes.h"
     13 
     14 /** \file SkColor.h
     15 
     16     Types and macros for colors
     17 */
     18 
     19 /** 8-bit type for an alpha value. 0xFF is 100% opaque, 0x00 is 100% transparent.
     20 */
     21 typedef uint8_t SkAlpha;
     22 /** 32 bit ARGB color value, not premultiplied. The color components are always in
     23     a known order. This is different from SkPMColor, which has its bytes in a configuration
     24     dependent order, to match the format of kARGB32 bitmaps. SkColor is the type used to
     25     specify colors in SkPaint and in gradients.
     26 */
     27 typedef uint32_t SkColor;
     28 
     29 /** Return a SkColor value from 8 bit component values
     30 */
     31 static inline SkColor SkColorSetARGBInline(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
     32 {
     33     SkASSERT(a <= 255 && r <= 255 && g <= 255 && b <= 255);
     34 
     35     return (a << 24) | (r << 16) | (g << 8) | (b << 0);
     36 }
     37 
     38 #define SkColorSetARGBMacro(a, r, g, b) \
     39     static_cast<SkColor>( \
     40         (static_cast<U8CPU>(a) << 24) | \
     41         (static_cast<U8CPU>(r) << 16) | \
     42         (static_cast<U8CPU>(g) << 8) | \
     43         (static_cast<U8CPU>(b) << 0))
     44 
     45 /** gcc will generate static initializers for code of this form:
     46  * static const SkColor kMyColor = SkColorSetARGB(0xFF, 0x01, 0x02, 0x03)
     47  * if SkColorSetARGB() is a static inline, but not if it's a macro.
     48  */
     49 #if defined(NDEBUG)
     50 #define SkColorSetARGB(a, r, g, b) SkColorSetARGBMacro(a, r, g, b)
     51 #else
     52 #define SkColorSetARGB(a, r, g, b) SkColorSetARGBInline(a, r, g, b)
     53 #endif
     54 
     55 /** Return a SkColor value from 8 bit component values, with an implied value
     56     of 0xFF for alpha (fully opaque)
     57 */
     58 #define SkColorSetRGB(r, g, b)  SkColorSetARGB(0xFF, r, g, b)
     59 
     60 /** return the alpha byte from a SkColor value */
     61 #define SkColorGetA(color)      (((color) >> 24) & 0xFF)
     62 /** return the red byte from a SkColor value */
     63 #define SkColorGetR(color)      (((color) >> 16) & 0xFF)
     64 /** return the green byte from a SkColor value */
     65 #define SkColorGetG(color)      (((color) >>  8) & 0xFF)
     66 /** return the blue byte from a SkColor value */
     67 #define SkColorGetB(color)      (((color) >>  0) & 0xFF)
     68 
     69 static inline SkColor SkColorSetA(SkColor c, U8CPU a) {
     70     return (c & 0x00FFFFFF) | (a << 24);
     71 }
     72 
     73 // common colors
     74 
     75 #define SK_AlphaTRANSPARENT 0x00        //!< transparent SkAlpha value
     76 #define SK_AlphaOPAQUE      0xFF        //!< opaque SkAlpha value
     77 
     78 #define SK_ColorTRANSPARENT 0x00000000  //!< transparent SkColor value
     79 
     80 #define SK_ColorBLACK       0xFF000000  //!< black SkColor value
     81 #define SK_ColorDKGRAY      0xFF444444  //!< dark gray SkColor value
     82 #define SK_ColorGRAY        0xFF888888  //!< gray SkColor value
     83 #define SK_ColorLTGRAY      0xFFCCCCCC  //!< light gray SkColor value
     84 #define SK_ColorWHITE       0xFFFFFFFF  //!< white SkColor value
     85 
     86 #define SK_ColorRED         0xFFFF0000  //!< red SkColor value
     87 #define SK_ColorGREEN       0xFF00FF00  //!< green SkColor value
     88 #define SK_ColorBLUE        0xFF0000FF  //!< blue SkColor value
     89 #define SK_ColorYELLOW      0xFFFFFF00  //!< yellow SkColor value
     90 #define SK_ColorCYAN        0xFF00FFFF  //!< cyan SkColor value
     91 #define SK_ColorMAGENTA     0xFFFF00FF  //!< magenta SkColor value
     92 
     93 ////////////////////////////////////////////////////////////////////////
     94 
     95 /** Convert RGB components to HSV.
     96         hsv[0] is Hue [0 .. 360)
     97         hsv[1] is Saturation [0...1]
     98         hsv[2] is Value [0...1]
     99     @param red  red component value [0..255]
    100     @param green  green component value [0..255]
    101     @param blue  blue component value [0..255]
    102     @param hsv  3 element array which holds the resulting HSV components.
    103 */
    104 SK_API void SkRGBToHSV(U8CPU red, U8CPU green, U8CPU blue, SkScalar hsv[3]);
    105 
    106 /** Convert the argb color to its HSV components.
    107         hsv[0] is Hue [0 .. 360)
    108         hsv[1] is Saturation [0...1]
    109         hsv[2] is Value [0...1]
    110     @param color the argb color to convert. Note: the alpha component is ignored.
    111     @param hsv  3 element array which holds the resulting HSV components.
    112 */
    113 static inline void SkColorToHSV(SkColor color, SkScalar hsv[3]) {
    114     SkRGBToHSV(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color), hsv);
    115 }
    116 
    117 /** Convert HSV components to an ARGB color. The alpha component is passed through unchanged.
    118         hsv[0] is Hue [0 .. 360)
    119         hsv[1] is Saturation [0...1]
    120         hsv[2] is Value [0...1]
    121     If hsv values are out of range, they are pinned.
    122     @param alpha the alpha component of the returned argb color.
    123     @param hsv  3 element array which holds the input HSV components.
    124     @return the resulting argb color
    125 */
    126 SK_API SkColor SkHSVToColor(U8CPU alpha, const SkScalar hsv[3]);
    127 
    128 /** Convert HSV components to an ARGB color. The alpha component set to 0xFF.
    129         hsv[0] is Hue [0 .. 360)
    130         hsv[1] is Saturation [0...1]
    131         hsv[2] is Value [0...1]
    132     If hsv values are out of range, they are pinned.
    133     @param hsv  3 element array which holds the input HSV components.
    134     @return the resulting argb color
    135 */
    136 static inline SkColor SkHSVToColor(const SkScalar hsv[3]) {
    137     return SkHSVToColor(0xFF, hsv);
    138 }
    139 
    140 ////////////////////////////////////////////////////////////////////////
    141 
    142 /** 32 bit ARGB color value, premultiplied. The byte order for this value is
    143     configuration dependent, matching the format of kARGB32 bitmaps. This is different
    144     from SkColor, which is nonpremultiplied, and is always in the same byte order.
    145 */
    146 typedef uint32_t SkPMColor;
    147 
    148 /** Return a SkPMColor value from unpremultiplied 8 bit component values
    149 */
    150 SK_API SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
    151 /** Return a SkPMColor value from a SkColor value. This is done by multiplying the color
    152     components by the color's alpha, and by arranging the bytes in a configuration
    153     dependent order, to match the format of kARGB32 bitmaps.
    154 */
    155 SK_API SkPMColor SkPreMultiplyColor(SkColor c);
    156 
    157 /** Define a function pointer type for combining two premultiplied colors
    158 */
    159 typedef SkPMColor (*SkXfermodeProc)(SkPMColor src, SkPMColor dst);
    160 
    161 ///////////////////////////////////////////////////////////////////////////////////////////////////
    162 
    163 struct SkPM4f;
    164 
    165 /*
    166  *  The float values are 0...1 unpremultiplied
    167  */
    168 struct SkColor4f {
    169     float fA;
    170     float fR;
    171     float fG;
    172     float fB;
    173 
    174     bool operator==(const SkColor4f& other) const {
    175         return fA == other.fA && fR == other.fR && fG == other.fG && fB == other.fB;
    176     }
    177     bool operator!=(const SkColor4f& other) const {
    178         return !(*this == other);
    179     }
    180 
    181     const float* vec() const { return &fA; }
    182     float* vec() { return &fA; }
    183 
    184     static SkColor4f Pin(float a, float r, float g, float b);
    185     static SkColor4f FromColor(SkColor);
    186 
    187     SkColor4f pin() const {
    188         return Pin(fA, fR, fG, fB);
    189     }
    190 
    191     SkPM4f premul() const;
    192 };
    193 
    194 #endif
    195