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