SkColor.h revision 2a2bdc698460c38ac9e24ba4abdeefec67bcba37
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#endif
164