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