11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkColor_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColor_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScalar.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \file SkColor.h
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Types and macros for colors
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** 8-bit type for an alpha value. 0xFF is 100% opaque, 0x00 is 100% transparent.
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint8_t SkAlpha;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** 32 bit ARGB color value, not premultiplied. The color components are always in
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    a known order. This is different from SkPMColor, which has its bytes in a configuration
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dependent order, to match the format of kARGB32 bitmaps. SkColor is the type used to
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    specify colors in SkPaint and in gradients.
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint32_t SkColor;
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Return a SkColor value from 8 bit component values
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerstatic inline SkColor SkColorSetARGBInline(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(a <= 255 && r <= 255 && g <= 255 && b <= 255);
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (a << 24) | (r << 16) | (g << 8) | (b << 0);
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
3940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#define SkColorSetARGBMacro(a, r, g, b) \
4040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    static_cast<SkColor>( \
4140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        (static_cast<U8CPU>(a) << 24) | \
4240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        (static_cast<U8CPU>(r) << 16) | \
4340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        (static_cast<U8CPU>(g) << 8) | \
4440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger        (static_cast<U8CPU>(b) << 0))
4540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/** gcc will generate static initializers for code of this form:
4740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * static const SkColor kMyColor = SkColorSetARGB(0xFF, 0x01, 0x02, 0x03)
4840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger * if SkColorSetARGB() is a static inline, but not if it's a macro.
4940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger */
5040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#if defined(NDEBUG)
5140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#define SkColorSetARGB(a, r, g, b) SkColorSetARGBMacro(a, r, g, b)
5240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#else
5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#define SkColorSetARGB(a, r, g, b) SkColorSetARGBInline(a, r, g, b)
5440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#endif
5540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Return a SkColor value from 8 bit component values, with an implied value
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    of 0xFF for alpha (fully opaque)
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColorSetRGB(r, g, b)  SkColorSetARGB(0xFF, r, g, b)
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** return the alpha byte from a SkColor value */
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColorGetA(color)      (((color) >> 24) & 0xFF)
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** return the red byte from a SkColor value */
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColorGetR(color)      (((color) >> 16) & 0xFF)
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** return the green byte from a SkColor value */
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColorGetG(color)      (((color) >>  8) & 0xFF)
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** return the blue byte from a SkColor value */
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkColorGetB(color)      (((color) >>  0) & 0xFF)
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkColor SkColorSetA(SkColor c, U8CPU a) {
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return (c & 0x00FFFFFF) | (a << 24);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// common colors
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorBLACK   0xFF000000  //!< black SkColor value
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorDKGRAY  0xFF444444  //!< dark gray SkColor value
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorGRAY    0xFF888888  //!< gray SkColor value
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorLTGRAY  0xFFCCCCCC  //!< light gray SkColor value
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorWHITE   0xFFFFFFFF  //!< white SkColor value
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorRED     0xFFFF0000  //!< red SkColor value
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorGREEN   0xFF00FF00  //!< green SkColor value
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorBLUE    0xFF0000FF  //!< blue SkColor value
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorYELLOW  0xFFFFFF00  //!< yellow SkColor value
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorCYAN    0xFF00FFFF  //!< cyan SkColor value
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SK_ColorMAGENTA 0xFFFF00FF  //!< magenta SkColor value
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////////////
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Convert RGB components to HSV.
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[0] is Hue [0 .. 360)
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[1] is Saturation [0...1]
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[2] is Value [0...1]
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param red  red component value [0..255]
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param green  green component value [0..255]
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param blue  blue component value [0..255]
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param hsv  3 element array which holds the resulting HSV components.
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
10035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSK_API void SkRGBToHSV(U8CPU red, U8CPU green, U8CPU blue, SkScalar hsv[3]);
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Convert the argb color to its HSV components.
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[0] is Hue [0 .. 360)
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[1] is Saturation [0...1]
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[2] is Value [0...1]
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param color the argb color to convert. Note: the alpha component is ignored.
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param hsv  3 element array which holds the resulting HSV components.
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline void SkColorToHSV(SkColor color, SkScalar hsv[3])
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkRGBToHSV(SkColorGetR(color), SkColorGetG(color), SkColorGetB(color), hsv);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Convert HSV components to an ARGB color. The alpha component is passed through unchanged.
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[0] is Hue [0 .. 360)
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[1] is Saturation [0...1]
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[2] is Value [0...1]
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    If hsv values are out of range, they are pinned.
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param alpha the alpha component of the returned argb color.
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param hsv  3 element array which holds the input HSV components.
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @return the resulting argb color
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
12335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerSK_API SkColor SkHSVToColor(U8CPU alpha, const SkScalar hsv[3]);
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Convert HSV components to an ARGB color. The alpha component set to 0xFF.
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[0] is Hue [0 .. 360)
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[1] is Saturation [0...1]
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        hsv[2] is Value [0...1]
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    If hsv values are out of range, they are pinned.
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @param hsv  3 element array which holds the input HSV components.
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @return the resulting argb color
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline SkColor SkHSVToColor(const SkScalar hsv[3])
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    return SkHSVToColor(0xFF, hsv);
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////////////
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** 32 bit ARGB color value, premultiplied. The byte order for this value is
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    configuration dependent, matching the format of kARGB32 bitmaps. This is different
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    from SkColor, which is nonpremultiplied, and is always in the same byte order.
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint32_t SkPMColor;
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Return a SkPMColor value from unpremultiplied 8 bit component values
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
148137a4ca42423bbb6d683067ea544c9a48f18f06cDerek SollenbergerSK_API SkPMColor SkPreMultiplyARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b);
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Return a SkPMColor value from a SkColor value. This is done by multiplying the color
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    components by the color's alpha, and by arranging the bytes in a configuration
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    dependent order, to match the format of kARGB32 bitmaps.
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
153137a4ca42423bbb6d683067ea544c9a48f18f06cDerek SollenbergerSK_API SkPMColor SkPreMultiplyColor(SkColor c);
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Define a function pointer type for combining two premultiplied colors
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef SkPMColor (*SkXfermodeProc)(SkPMColor src, SkPMColor dst);
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Define a function pointer type for combining a premultiplied src color
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    and a 16bit device color.
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projecttypedef uint16_t (*SkXfermodeProc16)(SkPMColor src, uint16_t dst);
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
166