Index: include/gpu/GrColor.h |
diff --git a/include/gpu/GrColor.h b/include/gpu/GrColor.h |
index 9ccc638fc9fe6745d58ac954e13169e2dcb58394..3686616d1a89b688ffa81dc42f6b7536e46d8417 100644 |
--- a/include/gpu/GrColor.h |
+++ b/include/gpu/GrColor.h |
@@ -77,7 +77,7 @@ static inline GrColor GrColorPackA4(unsigned a) { |
#define GrColor_ILLEGAL (~(0xFF << GrColor_SHIFT_A)) |
#define GrColor_WHITE 0xFFFFFFFF |
-#define GrColor_TRANS_BLACK 0x0 |
+#define GrColor_TRANSPARENT_BLACK 0x0 |
/** |
* Assert in debug builds that a GrColor is premultiplied. |
@@ -95,6 +95,31 @@ static inline void GrColorIsPMAssert(GrColor SkDEBUGCODE(c)) { |
#endif |
} |
+/** Inverts each color channel. */ |
+static inline GrColor GrInvertColor(GrColor c) { |
+ U8CPU a = GrColorUnpackA(c); |
+ U8CPU r = GrColorUnpackR(c); |
+ U8CPU g = GrColorUnpackG(c); |
+ U8CPU b = GrColorUnpackB(c); |
+ return GrColorPackRGBA(0xff - r, 0xff - g, 0xff - b, 0xff - a); |
+} |
+ |
+static inline GrColor GrColorMul(GrColor c0, GrColor c1) { |
+ U8CPU r = SkMulDiv255Round(GrColorUnpackR(c0), GrColorUnpackR(c1)); |
+ U8CPU g = SkMulDiv255Round(GrColorUnpackG(c0), GrColorUnpackG(c1)); |
+ U8CPU b = SkMulDiv255Round(GrColorUnpackB(c0), GrColorUnpackB(c1)); |
+ U8CPU a = SkMulDiv255Round(GrColorUnpackA(c0), GrColorUnpackA(c1)); |
+ return GrColorPackRGBA(r, g, b, a); |
+} |
+ |
+static inline GrColor GrColorSatAdd(GrColor c0, GrColor c1) { |
+ unsigned r = SkTMin<unsigned>(GrColorUnpackR(c0) + GrColorUnpackR(c1), 0xff); |
+ unsigned g = SkTMin<unsigned>(GrColorUnpackG(c0) + GrColorUnpackG(c1), 0xff); |
+ unsigned b = SkTMin<unsigned>(GrColorUnpackB(c0) + GrColorUnpackB(c1), 0xff); |
+ unsigned a = SkTMin<unsigned>(GrColorUnpackA(c0) + GrColorUnpackA(c1), 0xff); |
+ return GrColorPackRGBA(r, g, b, a); |
+} |
+ |
/** Converts a GrColor to an rgba array of GrGLfloat */ |
static inline void GrColorToRGBAFloat(GrColor color, float rgba[4]) { |
static const float ONE_OVER_255 = 1.f / 255.f; |
@@ -115,8 +140,19 @@ static inline bool GrColorIsOpaque(GrColor color) { |
return (color & (0xFFU << GrColor_SHIFT_A)) == (0xFFU << GrColor_SHIFT_A); |
} |
+static inline GrColor GrPremulColor(GrColor color) { |
+ unsigned r = GrColorUnpackR(color); |
+ unsigned g = GrColorUnpackG(color); |
+ unsigned b = GrColorUnpackB(color); |
+ unsigned a = GrColorUnpackA(color); |
+ return GrColorPackRGBA(SkMulDiv255Round(r, a), |
+ SkMulDiv255Round(g, a), |
+ SkMulDiv255Round(b, a), |
+ a); |
+} |
/** Returns an unpremuled version of the GrColor. */ |
-static inline GrColor GrUnPreMulColor(GrColor color) { |
+static inline GrColor GrUnpremulColor(GrColor color) { |
+ GrColorIsPMAssert(color); |
unsigned r = GrColorUnpackR(color); |
unsigned g = GrColorUnpackG(color); |
unsigned b = GrColorUnpackB(color); |
@@ -132,6 +168,16 @@ static inline GrColor GrUnPreMulColor(GrColor color) { |
return GrColorPackRGBA(r, g, b, a); |
} |
+static inline SkPMColor GrColorToSkPMColor(GrColor c) { |
+ GrColorIsPMAssert(c); |
+ return SkPackARGB32(GrColorUnpackA(c), GrColorUnpackR(c), GrColorUnpackG(c), GrColorUnpackB(c)); |
+} |
+ |
+static inline GrColor SkPMColorToGrColor(SkPMColor c) { |
+ return GrColorPackRGBA(SkGetPackedR32(c), SkGetPackedG32(c), SkGetPackedB32(c), |
+ SkGetPackedA32(c)); |
+} |
+ |
/** |
* Flags used for bitfields of color components. They are defined so that the bit order reflects the |
* GrColor shift order. |