GrColor.h revision fe17456d5e528078ce69b5f15cf7adf1fab963f
1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2010 Google Inc. 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrColor_DEFINED 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColor_DEFINED 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTypes.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColor.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkUnPreMultiply.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrColor is 4 bytes for R, G, B, A, in a specific order defined below. Whether the color is 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * premultiplied or not depends on the context in which it is being used. 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robottypedef uint32_t GrColor; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// shift amount to assign a component to a GrColor int 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// These shift values are chosen for compatibility with GL attrib arrays 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// ES doesn't allow BGRA vertex attrib order so if they were not in this order 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// we'd have to swizzle in shaders. 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_CPU_BENDIAN 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_R 24 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_G 16 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_B 8 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_A 0 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#else 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_R 0 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_G 8 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_B 16 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot #define GrColor_SHIFT_A 24 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Pack 4 components (RGBA) into a GrColor int 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrColorPackRGBA(unsigned r, unsigned g, unsigned b, unsigned a) { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT((uint8_t)r == r); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT((uint8_t)g == g); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT((uint8_t)b == b); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT((uint8_t)a == a); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return (r << GrColor_SHIFT_R) | 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (g << GrColor_SHIFT_G) | 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (b << GrColor_SHIFT_B) | 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (a << GrColor_SHIFT_A); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Packs a color with an alpha channel replicated across all four channels. 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrColorPackA4(unsigned a) { 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT((uint8_t)a == a); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return (a << GrColor_SHIFT_R) | 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (a << GrColor_SHIFT_G) | 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (a << GrColor_SHIFT_B) | 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (a << GrColor_SHIFT_A); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// extract a component (byte) from a GrColor int 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColorUnpackR(color) (((color) >> GrColor_SHIFT_R) & 0xFF) 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColorUnpackG(color) (((color) >> GrColor_SHIFT_G) & 0xFF) 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColorUnpackB(color) (((color) >> GrColor_SHIFT_B) & 0xFF) 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColorUnpackA(color) (((color) >> GrColor_SHIFT_A) & 0xFF) 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Since premultiplied means that alpha >= color, we construct a color with 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * each component==255 and alpha == 0 to be "illegal" 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColor_ILLEGAL (~(0xFF << GrColor_SHIFT_A)) 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColor_WHITE 0xFFFFFFFF 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrColor_TRANSPARENT_BLACK 0x0 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Assert in debug builds that a GrColor is premultiplied. 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline void GrColorIsPMAssert(GrColor SkDEBUGCODE(c)) { 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifdef SK_DEBUG 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned a = GrColorUnpackA(c); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned r = GrColorUnpackR(c); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned g = GrColorUnpackG(c); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned b = GrColorUnpackB(c); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(r <= a); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(g <= a); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(b <= a); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Inverts each color channel. */ 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrInvertColor(GrColor c) { 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU a = GrColorUnpackA(c); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU r = GrColorUnpackR(c); 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU g = GrColorUnpackG(c); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU b = GrColorUnpackB(c); 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA(0xff - r, 0xff - g, 0xff - b, 0xff - a); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrColorMul(GrColor c0, GrColor c1) { 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU r = SkMulDiv255Round(GrColorUnpackR(c0), GrColorUnpackR(c1)); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU g = SkMulDiv255Round(GrColorUnpackG(c0), GrColorUnpackG(c1)); 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU b = SkMulDiv255Round(GrColorUnpackB(c0), GrColorUnpackB(c1)); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot U8CPU a = SkMulDiv255Round(GrColorUnpackA(c0), GrColorUnpackA(c1)); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA(r, g, b, a); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrColorSatAdd(GrColor c0, GrColor c1) { 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned r = SkTMin<unsigned>(GrColorUnpackR(c0) + GrColorUnpackR(c1), 0xff); 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned g = SkTMin<unsigned>(GrColorUnpackG(c0) + GrColorUnpackG(c1), 0xff); 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned b = SkTMin<unsigned>(GrColorUnpackB(c0) + GrColorUnpackB(c1), 0xff); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned a = SkTMin<unsigned>(GrColorUnpackA(c0) + GrColorUnpackA(c1), 0xff); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA(r, g, b, a); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Converts a GrColor to an rgba array of GrGLfloat */ 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline void GrColorToRGBAFloat(GrColor color, float rgba[4]) { 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const float ONE_OVER_255 = 1.f / 255.f; 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgba[0] = GrColorUnpackR(color) * ONE_OVER_255; 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgba[1] = GrColorUnpackG(color) * ONE_OVER_255; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgba[2] = GrColorUnpackB(color) * ONE_OVER_255; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgba[3] = GrColorUnpackA(color) * ONE_OVER_255; 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */ 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline float GrNormalizeByteToFloat(uint8_t value) { 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const float ONE_OVER_255 = 1.f / 255.f; 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return value * ONE_OVER_255; 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Determines whether the color is opaque or not. */ 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline bool GrColorIsOpaque(GrColor color) { 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return (color & (0xFFU << GrColor_SHIFT_A)) == (0xFFU << GrColor_SHIFT_A); 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrPremulColor(GrColor color) { 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned r = GrColorUnpackR(color); 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned g = GrColorUnpackG(color); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned b = GrColorUnpackB(color); 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned a = GrColorUnpackA(color); 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA(SkMulDiv255Round(r, a), 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMulDiv255Round(g, a), 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMulDiv255Round(b, a), 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot a); 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Returns an unpremuled version of the GrColor. */ 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic inline GrColor GrUnpremulColor(GrColor color) { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColorIsPMAssert(color); 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned r = GrColorUnpackR(color); 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned g = GrColorUnpackG(color); 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned b = GrColorUnpackB(color); 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned a = GrColorUnpackA(color); 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPMColor colorPM = SkPackARGB32(a, r, g, b); 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colorUPM = SkUnPreMultiply::PMColorToColor(colorPM); 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r = SkColorGetR(colorUPM); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot g = SkColorGetG(colorUPM); 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot b = SkColorGetB(colorUPM); 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot a = SkColorGetA(colorUPM); 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA(r, g, b, a); 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot* Similarly, GrColor4f is 4 floats for R, G, B, A, in that order. And like GrColor, whether 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot* the color is premultiplied or not depends on the context. 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*/ 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrColor4f { 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float fRGBA[4]; 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f() {} 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f(float r, float g, float b, float a) { 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[0] = r; 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[1] = g; 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[2] = b; 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[3] = a; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum Illegal_Constructor { 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kIllegalConstructor 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f(Illegal_Constructor) { 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[0] = SK_FloatNaN; 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[1] = SK_FloatNaN; 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[2] = SK_FloatNaN; 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[3] = SK_FloatNaN; 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GrColor4f OpaqueWhite() { 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(1.0f, 1.0f, 1.0f, 1.0f); 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GrColor4f TransparentBlack() { 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(0.0f, 0.0f, 0.0f, 0.0f); 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GrColor4f FromGrColor(GrColor color) { 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f result; 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColorToRGBAFloat(color, result.fRGBA); 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return result; 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GrColor4f FromSkColor4f(const SkColor4f& color) { 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(color.fR, color.fG, color.fB, color.fA); 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f modulate(const GrColor4f& x) const { 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(fRGBA[0] * x.fRGBA[0], 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[1] * x.fRGBA[1], 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[2] * x.fRGBA[2], 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[3] * x.fRGBA[3]); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f mulByScalar(float x) const { 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(fRGBA[0] * x, fRGBA[1] * x, fRGBA[2] * x, fRGBA[3] * x); 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool operator==(const GrColor4f& other) const { 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[0] == other.fRGBA[0] && 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[1] == other.fRGBA[1] && 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[2] == other.fRGBA[2] && 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRGBA[3] == other.fRGBA[3]; 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool operator!=(const GrColor4f& other) const { 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return !(*this == other); 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor toGrColor() const { 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColorPackRGBA( 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTPin<unsigned>(static_cast<unsigned>(fRGBA[0] * 255.0f + 0.5f), 0, 255), 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTPin<unsigned>(static_cast<unsigned>(fRGBA[1] * 255.0f + 0.5f), 0, 255), 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTPin<unsigned>(static_cast<unsigned>(fRGBA[2] * 255.0f + 0.5f), 0, 255), 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTPin<unsigned>(static_cast<unsigned>(fRGBA[3] * 255.0f + 0.5f), 0, 255)); 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor4f toSkColor4f() const { 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkColor4f { fRGBA[0], fRGBA[1], fRGBA[2], fRGBA[3] }; 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f opaque() const { 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(fRGBA[0], fRGBA[1], fRGBA[2], 1.0f); 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isOpaque() const { 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fRGBA[3] >= 1.f; // just in case precision causes a superopaque value. 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f premul() const { 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float a = fRGBA[3]; 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(fRGBA[0] * a, fRGBA[1] * a, fRGBA[2] * a, a); 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrColor4f unpremul() const { 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float a = fRGBA[3]; 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (a <= 0.0f) { 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(0.0f, 0.0f, 0.0f, 0.0f); 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot float invAlpha = 1.0f / a; 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return GrColor4f(fRGBA[0] * invAlpha, fRGBA[1] * invAlpha, fRGBA[2] * invAlpha, a); 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Flags used for bitfields of color components. They are defined so that the bit order reflects the 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrColor shift order. 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum GrColorComponentFlags { 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kR_GrColorComponentFlag = 1 << (GrColor_SHIFT_R / 8), 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kG_GrColorComponentFlag = 1 << (GrColor_SHIFT_G / 8), 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kB_GrColorComponentFlag = 1 << (GrColor_SHIFT_B / 8), 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kA_GrColorComponentFlag = 1 << (GrColor_SHIFT_A / 8), 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNone_GrColorComponentFlags = 0, 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRGB_GrColorComponentFlags = (kR_GrColorComponentFlag | kG_GrColorComponentFlag | 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kB_GrColorComponentFlag), 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRGBA_GrColorComponentFlags = (kR_GrColorComponentFlag | kG_GrColorComponentFlag | 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kB_GrColorComponentFlag | kA_GrColorComponentFlag) 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotGR_MAKE_BITFIELD_OPS(GrColorComponentFlags) 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 295