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