180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkColor_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColor_DEFINED
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkScalar.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** \file SkColor.h
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    Types and macros for colors
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 8-bit type for an alpha value. 0xFF is 100% opaque, 0x00 is 100% transparent.
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef uint8_t SkAlpha;
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 32 bit ARGB color value, not premultiplied. The color components are always in
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    a known order. This is different from SkPMColor, which has its bytes in a configuration
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dependent order, to match the format of kARGB32 bitmaps. SkColor is the type used to
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    specify colors in SkPaint and in gradients.
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef uint32_t SkColor;
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return a SkColor value from 8 bit component values
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkColor SkColorSetARGBInline(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(a <= 255 && r <= 255 && g <= 255 && b <= 255);
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return (a << 24) | (r << 16) | (g << 8) | (b << 0);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorSetARGBMacro(a, r, g, b) \
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static_cast<SkColor>( \
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (static_cast<U8CPU>(a) << 24) | \
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (static_cast<U8CPU>(r) << 16) | \
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (static_cast<U8CPU>(g) << 8) | \
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (static_cast<U8CPU>(b) << 0))
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** gcc will generate static initializers for code of this form:
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * static const SkColor kMyColor = SkColorSetARGB(0xFF, 0x01, 0x02, 0x03)
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * if SkColorSetARGB() is a static inline, but not if it's a macro.
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if defined(NDEBUG)
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorSetARGB(a, r, g, b) SkColorSetARGBMacro(a, r, g, b)
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorSetARGB(a, r, g, b) SkColorSetARGBInline(a, r, g, b)
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return a SkColor value from 8 bit component values, with an implied value
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    of 0xFF for alpha (fully opaque)
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorSetRGB(r, g, b)  SkColorSetARGB(0xFF, r, g, b)
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** return the alpha byte from a SkColor value */
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorGetA(color)      (((color) >> 24) & 0xFF)
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** return the red byte from a SkColor value */
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorGetR(color)      (((color) >> 16) & 0xFF)
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** return the green byte from a SkColor value */
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorGetG(color)      (((color) >>  8) & 0xFF)
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** return the blue byte from a SkColor value */
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkColorGetB(color)      (((color) >>  0) & 0xFF)
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkColor SkColorSetA(SkColor c, U8CPU a) {
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return (c & 0x00FFFFFF) | (a << 24);
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// common colors
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define SK_AlphaTRANSPARENT 0x00        //!< transparent SkAlpha value
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#define SK_AlphaOPAQUE      0xFF        //!< opaque SkAlpha value
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorTRANSPARENT 0x00000000  //!< transparent SkColor value
80363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorBLACK       0xFF000000  //!< black SkColor value
82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorDKGRAY      0xFF444444  //!< dark gray SkColor value
83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorGRAY        0xFF888888  //!< gray SkColor value
84363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorLTGRAY      0xFFCCCCCC  //!< light gray SkColor value
85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorWHITE       0xFFFFFFFF  //!< white SkColor value
86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorRED         0xFFFF0000  //!< red SkColor value
88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorGREEN       0xFF00FF00  //!< green SkColor value
89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorBLUE        0xFF0000FF  //!< blue SkColor value
90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorYELLOW      0xFFFFFF00  //!< yellow SkColor value
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorCYAN        0xFF00FFFF  //!< cyan SkColor value
92363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define SK_ColorMAGENTA     0xFFFF00FF  //!< magenta SkColor value
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Convert RGB components to HSV.
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[0] is Hue [0 .. 360)
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[1] is Saturation [0...1]
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[2] is Value [0...1]
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param red  red component value [0..255]
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param green  green component value [0..255]
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param blue  blue component value [0..255]
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param hsv  3 element array which holds the resulting HSV components.
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_API void SkRGBToHSV(U8CPU red, U8CPU green, U8CPU blue, SkScalar hsv[3]);
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Convert the argb color to its HSV components.
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[0] is Hue [0 .. 360)
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[1] is Saturation [0...1]
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[2] is Value [0...1]
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param color the argb color to convert. Note: the alpha component is ignored.
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param hsv  3 element array which holds the resulting HSV components.
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline void SkColorToHSV(SkColor color, SkScalar hsv[3])
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRGBToHSV(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color), hsv);
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Convert HSV components to an ARGB color. The alpha component is passed through unchanged.
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[0] is Hue [0 .. 360)
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[1] is Saturation [0...1]
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[2] is Value [0...1]
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    If hsv values are out of range, they are pinned.
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param alpha the alpha component of the returned argb color.
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param hsv  3 element array which holds the input HSV components.
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @return the resulting argb color
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_API SkColor SkHSVToColor(U8CPU alpha, const SkScalar hsv[3]);
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Convert HSV components to an ARGB color. The alpha component set to 0xFF.
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[0] is Hue [0 .. 360)
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[1] is Saturation [0...1]
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        hsv[2] is Value [0...1]
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    If hsv values are out of range, they are pinned.
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @param hsv  3 element array which holds the input HSV components.
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    @return the resulting argb color
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkColor SkHSVToColor(const SkScalar hsv[3])
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkHSVToColor(0xFF, hsv);
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 32 bit ARGB color value, premultiplied. The byte order for this value is
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    configuration dependent, matching the format of kARGB32 bitmaps. This is different
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    from SkColor, which is nonpremultiplied, and is always in the same byte order.
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef uint32_t SkPMColor;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return a SkPMColor value from unpremultiplied 8 bit component values
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_API SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Return a SkPMColor value from a SkColor value. This is done by multiplying the color
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    components by the color's alpha, and by arranging the bytes in a configuration
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dependent order, to match the format of kARGB32 bitmaps.
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSK_API SkPMColor SkPreMultiplyColor(SkColor c);
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Define a function pointer type for combining two premultiplied colors
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef SkPMColor (*SkXfermodeProc)(SkPMColor src, SkPMColor dst);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Define a function pointer type for combining a premultiplied src color
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    and a 16bit device color.
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querutypedef uint16_t (*SkXfermodeProc16)(SkPMColor src, uint16_t dst);
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
170