Index: include/core/SkColorPriv.h |
diff --git a/include/core/SkColorPriv.h b/include/core/SkColorPriv.h |
index 7a74c4a034b24a079504fd790a92bcd67014f73f..9591f22725a81289059a04bb82bddc79c849cc25 100644 |
--- a/include/core/SkColorPriv.h |
+++ b/include/core/SkColorPriv.h |
@@ -1,4 +1,3 @@ |
- |
/* |
* Copyright 2006 The Android Open Source Project |
* |
@@ -6,7 +5,6 @@ |
* found in the LICENSE file. |
*/ |
- |
#ifndef SkColorPriv_DEFINED |
#define SkColorPriv_DEFINED |
@@ -18,6 +16,134 @@ |
#include "SkColor.h" |
#include "SkMath.h" |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+#define SkASSERT_IS_BYTE(x) SkASSERT(0 == ((x) & ~0xFF)) |
+ |
+/* |
+ * Skia's 32bit backend only supports 1 sizzle order at a time (compile-time). |
+ * This is specified by 4 defines SK_A32_SHIFT, SK_R32_SHIFT, ... for G and B. |
+ * |
+ * For easier compatibility with Skia's GPU backend, we further restrict these |
+ * to either (in memory-byte-order) RGBA or BGRA. Note that this "order" does |
+ * not directly correspond to the same shift-order, since we have to take endianess |
+ * into account. |
+ * |
+ * Here we enforce this constraint. |
+ */ |
+ |
+#ifdef SK_CPU_BENDIAN |
+ #define SK_RGBA_R32_SHIFT 24 |
+ #define SK_RGBA_G32_SHIFT 16 |
+ #define SK_RGBA_B32_SHIFT 8 |
+ #define SK_RGBA_A32_SHIFT 0 |
+ |
+ #define SK_BGRA_B32_SHIFT 24 |
+ #define SK_BGRA_G32_SHIFT 16 |
+ #define SK_BGRA_R32_SHIFT 8 |
+ #define SK_BGRA_A32_SHIFT 0 |
+#else |
+ #define SK_RGBA_R32_SHIFT 0 |
+ #define SK_RGBA_G32_SHIFT 8 |
+ #define SK_RGBA_B32_SHIFT 16 |
+ #define SK_RGBA_A32_SHIFT 24 |
+ |
+ #define SK_BGRA_B32_SHIFT 0 |
+ #define SK_BGRA_G32_SHIFT 8 |
+ #define SK_BGRA_R32_SHIFT 16 |
+ #define SK_BGRA_A32_SHIFT 24 |
+#endif |
+ |
+#if defined(SK_PMCOLOR_IS_RGBA) && defined(SK_PMCOLOR_IS_BGRA) |
+ #error "can't define PMCOLOR to be RGBA and BGRA" |
+#endif |
+ |
+#define LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_RGBA \ |
+ (SK_A32_SHIFT == SK_RGBA_A32_SHIFT && \ |
+ SK_R32_SHIFT == SK_RGBA_R32_SHIFT && \ |
+ SK_G32_SHIFT == SK_RGBA_G32_SHIFT && \ |
+ SK_B32_SHIFT == SK_RGBA_B32_SHIFT) |
+ |
+#define LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_BGRA \ |
+ (SK_A32_SHIFT == SK_BGRA_A32_SHIFT && \ |
+ SK_R32_SHIFT == SK_BGRA_R32_SHIFT && \ |
+ SK_G32_SHIFT == SK_BGRA_G32_SHIFT && \ |
+ SK_B32_SHIFT == SK_BGRA_B32_SHIFT) |
+ |
+ |
+#if defined(SK_PMCOLOR_IS_RGBA) && !LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_RGBA |
+ #error "SK_PMCOLOR_IS_RGBA does not match SK_*32_SHIFT values" |
+#endif |
+ |
+#if defined(SK_PMCOLOR_IS_BGRA) && !LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_BGRA |
+ #error "SK_PMCOLOR_IS_BGRA does not match SK_*32_SHIFT values" |
+#endif |
+ |
+#if !defined(SK_PMCOLOR_IS_RGBA) && !defined(SK_PMCOLOR_IS_RGBA) |
+ // deduce which to define from the _SHIFT defines |
+ |
+ #if LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_RGBA |
+ #define SK_PMCOLOR_IS_RGBA |
+ #elif LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_BGRA |
+ #define SK_PMCOLOR_IS_BGRA |
+ #else |
+ #error "need 32bit packing to be either RGBA or BGRA" |
+ #endif |
+#endif |
+ |
+// hide these now that we're done |
+#undef LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_RGBA |
+#undef LOCAL_PMCOLOR_SHIFTS_EQUIVALENT_TO_BGRA |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+// Reverse the bytes coorsponding to RED and BLUE in a packed pixels. Note the |
+// pair of them are in the same 2 slots in both RGBA and BGRA, thus there is |
+// no need to pass in the colortype to this function. |
+static inline uint32_t SkSwizzle_RB(uint32_t c) { |
+ static const uint32_t kRBMask = (0xFF << SK_R32_SHIFT) | (0xFF << SK_B32_SHIFT); |
+ |
+ unsigned c0 = (c >> SK_R32_SHIFT) & 0xFF; |
+ unsigned c1 = (c >> SK_B32_SHIFT) & 0xFF; |
+ return (c & ~kRBMask) | (c0 << SK_B32_SHIFT) | (c1 << SK_R32_SHIFT); |
+} |
+ |
+static inline uint32_t SkPackARGB_as_RGBA(U8CPU a, U8CPU r, U8CPU g, U8CPU b) { |
+ SkASSERT_IS_BYTE(a); |
+ SkASSERT_IS_BYTE(r); |
+ SkASSERT_IS_BYTE(g); |
+ SkASSERT_IS_BYTE(b); |
+ return (a << SK_RGBA_A32_SHIFT) | (r << SK_RGBA_R32_SHIFT) | |
+ (g << SK_RGBA_G32_SHIFT) | (b << SK_RGBA_B32_SHIFT); |
+} |
+ |
+static inline uint32_t SkPackARGB_as_BGRA(U8CPU a, U8CPU r, U8CPU g, U8CPU b) { |
+ SkASSERT_IS_BYTE(a); |
+ SkASSERT_IS_BYTE(r); |
+ SkASSERT_IS_BYTE(g); |
+ SkASSERT_IS_BYTE(b); |
+ return (a << SK_BGRA_A32_SHIFT) | (r << SK_BGRA_R32_SHIFT) | |
+ (g << SK_BGRA_G32_SHIFT) | (b << SK_BGRA_B32_SHIFT); |
+} |
+ |
+static inline SkPMColor SkSwizzle_RGBA_to_PMColor(uint32_t c) { |
+#ifdef SK_PMCOLOR_IS_RGBA |
+ return c; |
+#else |
+ return SkSwizzle_RB(c); |
+#endif |
+} |
+ |
+static inline SkPMColor SkSwizzle_BGRA_to_PMColor(uint32_t c) { |
+#ifdef SK_PMCOLOR_IS_BGRA |
+ return c; |
+#else |
+ return SkSwizzle_RB(c); |
+#endif |
+} |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
///@{ |
/** See ITU-R Recommendation BT.709 at http://www.itu.int/rec/R-REC-BT.709/ .*/ |
#define SK_ITU_BT709_LUM_COEFF_R (0.2126f) |
@@ -239,6 +365,16 @@ static inline SkPMColor SkPackARGB32(U8CPU a, U8CPU r, U8CPU g, U8CPU b) { |
(g << SK_G32_SHIFT) | (b << SK_B32_SHIFT); |
} |
+static inline uint32_t SkPackPMColor_as_RGBA(SkPMColor c) { |
+ return SkPackARGB_as_RGBA(SkGetPackedA32(c), SkGetPackedR32(c), |
+ SkGetPackedG32(c), SkGetPackedB32(c)); |
+} |
+ |
+static inline uint32_t SkPackPMColor_as_BGRA(SkPMColor c) { |
+ return SkPackARGB_as_BGRA(SkGetPackedA32(c), SkGetPackedR32(c), |
+ SkGetPackedG32(c), SkGetPackedB32(c)); |
+} |
+ |
/** |
* Abstract 4-byte interpolation, implemented on top of SkPMColor |
* utility functions. Third parameter controls blending of the first two: |