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