1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrColor_DEFINED 12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColor_DEFINED 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTypes.h" 15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/** 1728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org * GrColor is 4 bytes for R, G, B, A, in a specific order defined below. The components are stored 1828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org * premultiplied. 19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comtypedef uint32_t GrColor; 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 22c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com// shift amount to assign a component to a GrColor int 23c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com// These shift values are chosen for compatibility with GL attrib arrays 24c43649962221c348d656d425a3fa9b29c78231d4bsalomon@google.com// ES doesn't allow BGRA vertex attrib order so if they were not in this order 2528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org// we'd have to swizzle in shaders. 2628361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org#ifdef SK_CPU_BENDIAN 2728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_R 24 2828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_G 16 2928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_B 8 3028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_A 0 3128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org#else 3228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_R 0 3328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_G 8 3428361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_B 16 3528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org #define GrColor_SHIFT_A 24 3628361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org#endif 37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/** 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Pack 4 components (RGBA) into a GrColor int 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comstatic inline GrColor GrColorPackRGBA(unsigned r, unsigned g, 42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com unsigned b, unsigned a) { 43f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((uint8_t)r == r); 44f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((uint8_t)g == g); 45f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((uint8_t)b == b); 46f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT((uint8_t)a == a); 47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return (r << GrColor_SHIFT_R) | 48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com (g << GrColor_SHIFT_G) | 49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com (b << GrColor_SHIFT_B) | 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com (a << GrColor_SHIFT_A); 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 53ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com// extract a component (byte) from a GrColor int 54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColorUnpackR(color) (((color) >> GrColor_SHIFT_R) & 0xFF) 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColorUnpackG(color) (((color) >> GrColor_SHIFT_G) & 0xFF) 57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColorUnpackB(color) (((color) >> GrColor_SHIFT_B) & 0xFF) 58ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColorUnpackA(color) (((color) >> GrColor_SHIFT_A) & 0xFF) 59ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/** 61ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Since premultiplied means that alpha >= color, we construct a color with 62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * each component==255 and alpha == 0 to be "illegal" 63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrColor_ILLEGAL (~(0xFF << GrColor_SHIFT_A)) 65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 6628361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org/** 6728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org * Assert in debug builds that a GrColor is premultiplied. 6828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org */ 6928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.orgstatic inline void GrColorIsPMAssert(GrColor c) { 7028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org#ifdef SK_DEBUG 7128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org unsigned a = GrColorUnpackA(c); 7228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org unsigned r = GrColorUnpackR(c); 7328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org unsigned g = GrColorUnpackG(c); 7428361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org unsigned b = GrColorUnpackB(c); 7528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org 7628361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org SkASSERT(r <= a); 7728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org SkASSERT(g <= a); 7828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org SkASSERT(b <= a); 7928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org#endif 8028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org} 8128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org 827534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com/** Converts a GrColor to an rgba array of GrGLfloat */ 837534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.comstatic inline void GrColorToRGBAFloat(GrColor color, float rgba[4]) { 847534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com static const float ONE_OVER_255 = 1.f / 255.f; 857534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com rgba[0] = GrColorUnpackR(color) * ONE_OVER_255; 867534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com rgba[1] = GrColorUnpackG(color) * ONE_OVER_255; 877534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com rgba[2] = GrColorUnpackB(color) * ONE_OVER_255; 887534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com rgba[3] = GrColorUnpackA(color) * ONE_OVER_255; 897534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com} 907534747e631c49680f7199ccf9e71a359cfa647dbsalomon@google.com 91b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com/** 92b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com * Flags used for bitfields of color components. They are defined so that the bit order reflects the 93b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com * GrColor shift order. 94b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com */ 95b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.comenum GrColorComponentFlags { 96b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kR_GrColorComponentFlag = 1 << (GrColor_SHIFT_R / 8), 97b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kG_GrColorComponentFlag = 1 << (GrColor_SHIFT_G / 8), 98b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kB_GrColorComponentFlag = 1 << (GrColor_SHIFT_B / 8), 99b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kA_GrColorComponentFlag = 1 << (GrColor_SHIFT_A / 8), 100b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 101b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGB_GrColorComponentFlags = (kR_GrColorComponentFlag | kG_GrColorComponentFlag | 102b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kB_GrColorComponentFlag), 103b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 104b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGBA_GrColorComponentFlags = (kR_GrColorComponentFlag | kG_GrColorComponentFlag | 105b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kB_GrColorComponentFlag | kA_GrColorComponentFlag) 106b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com}; 107b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 108018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.comstatic inline char GrColorComponentFlagToChar(GrColorComponentFlags component) { 109f9dae780c2c46a1f08adbbe8de2faaba091254d4tfarina SkASSERT(SkIsPow2(component)); 110018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com switch (component) { 111018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com case kR_GrColorComponentFlag: 112018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com return 'r'; 113018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com case kG_GrColorComponentFlag: 114018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com return 'g'; 115018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com case kB_GrColorComponentFlag: 116018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com return 'b'; 117018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com case kA_GrColorComponentFlag: 118018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com return 'a'; 119018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com default: 12088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Invalid color component flag."); 121018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com return '\0'; 122018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com } 123018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com} 124018f179efb2413431bdb1a9e6701eb44ef36b792bsalomon@google.com 125b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.comstatic inline uint32_t GrPixelConfigComponentMask(GrPixelConfig config) { 126f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(config >= 0 && config < kGrPixelConfigCnt); 127b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com static const uint32_t kFlags[] = { 128b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 0, // kUnknown_GrPixelConfig 129b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kA_GrColorComponentFlag, // kAlpha_8_GrPixelConfig 130b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGBA_GrColorComponentFlags, // kIndex_8_GrPixelConfig 131b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGB_GrColorComponentFlags, // kRGB_565_GrPixelConfig 132b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGBA_GrColorComponentFlags, // kRGBA_4444_GrPixelConfig 133b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGBA_GrColorComponentFlags, // kRGBA_8888_GrPixelConfig 134b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com kRGBA_GrColorComponentFlags, // kBGRA_8888_GrPixelConfig 1356e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org kRGB_GrColorComponentFlags, // kETC1_GrPixelConfig 1366e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org kA_GrColorComponentFlag, // kLATC_GrPixelConfig 137b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com }; 138b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com return kFlags[config]; 139b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 140b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig); 141b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig); 142b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig); 143b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig); 144b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig); 145b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig); 146b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig); 1476e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org GR_STATIC_ASSERT(7 == kETC1_GrPixelConfig); 1486e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org GR_STATIC_ASSERT(8 == kLATC_GrPixelConfig); 149b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com GR_STATIC_ASSERT(SK_ARRAY_COUNT(kFlags) == kGrPixelConfigCnt); 150b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com} 151b8eb2e89edf914caf5479baeffcb670d3e93f496bsalomon@google.com 152ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 153