SkColor.h revision 6d3cef930ad19b0f55543ca40f7a07030f4fe508
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*/ 21typedef 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*/ 27typedef uint32_t SkColor; 28 29/** Return a SkColor value from 8 bit component values 30*/ 31static 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 69static 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*/ 104SK_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*/ 113static inline void SkColorToHSV(SkColor color, SkScalar hsv[3]) 114{ 115 SkRGBToHSV(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color), hsv); 116} 117 118/** Convert HSV components to an ARGB color. The alpha component is passed through unchanged. 119 hsv[0] is Hue [0 .. 360) 120 hsv[1] is Saturation [0...1] 121 hsv[2] is Value [0...1] 122 If hsv values are out of range, they are pinned. 123 @param alpha the alpha component of the returned argb color. 124 @param hsv 3 element array which holds the input HSV components. 125 @return the resulting argb color 126*/ 127SK_API SkColor SkHSVToColor(U8CPU alpha, const SkScalar hsv[3]); 128 129/** Convert HSV components to an ARGB color. The alpha component set to 0xFF. 130 hsv[0] is Hue [0 .. 360) 131 hsv[1] is Saturation [0...1] 132 hsv[2] is Value [0...1] 133 If hsv values are out of range, they are pinned. 134 @param hsv 3 element array which holds the input HSV components. 135 @return the resulting argb color 136*/ 137static inline SkColor SkHSVToColor(const SkScalar hsv[3]) 138{ 139 return SkHSVToColor(0xFF, hsv); 140} 141 142//////////////////////////////////////////////////////////////////////// 143 144/** 32 bit ARGB color value, premultiplied. The byte order for this value is 145 configuration dependent, matching the format of kARGB32 bitmaps. This is different 146 from SkColor, which is nonpremultiplied, and is always in the same byte order. 147*/ 148typedef uint32_t SkPMColor; 149 150/** Return a SkPMColor value from unpremultiplied 8 bit component values 151*/ 152SK_API SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b); 153/** Return a SkPMColor value from a SkColor value. This is done by multiplying the color 154 components by the color's alpha, and by arranging the bytes in a configuration 155 dependent order, to match the format of kARGB32 bitmaps. 156*/ 157SK_API SkPMColor SkPreMultiplyColor(SkColor c); 158 159/** Define a function pointer type for combining two premultiplied colors 160*/ 161typedef SkPMColor (*SkXfermodeProc)(SkPMColor src, SkPMColor dst); 162 163/////////////////////////////////////////////////////////////////////////////////////////////////// 164 165/* 166 * The float values are 0...1 premultiplied 167 */ 168struct SK_ATTRIBUTE(aligned(16)) SkPM4f { 169 float fVec[4]; 170 171 float a() const { return fVec[SK_A32_SHIFT/8]; } 172}; 173 174/* 175 * The float values are 0...1 unpremultiplied 176 */ 177struct SkColor4f { 178 float fA; 179 float fR; 180 float fG; 181 float fB; 182 183 bool operator==(const SkColor4f& other) const { 184 return fA == other.fA && fR == other.fR && fG == other.fG && fB == other.fB; 185 } 186 bool operator!=(const SkColor4f& other) const { 187 return !(*this == other); 188 } 189 190 const float* vec() const { return &fA; } 191 float* vec() { return &fA; } 192 193 static SkColor4f Pin(float a, float r, float g, float b); 194 static SkColor4f FromColor(SkColor); 195 196 SkColor4f pin() const { 197 return Pin(fA, fR, fG, fB); 198 } 199 200 SkPM4f premul() const; 201}; 202 203#endif 204