diff options
-rw-r--r-- | include/core/SkTypes.h | 45 | ||||
-rw-r--r-- | tests/MathTest.cpp | 18 |
2 files changed, 10 insertions, 53 deletions
diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h index 94650f01dc..0cef8a1257 100644 --- a/include/core/SkTypes.h +++ b/include/core/SkTypes.h @@ -332,45 +332,20 @@ template <typename T, size_t N> char (&SkArrayCountHelper(T (&array)[N]))[N]; #define SK_END_REQUIRE_DENSE #endif -template <int N, typename T> -struct SkAlign_traits { - static_assert (N > 0 && (N & (N-1)) == 0, "N must be a positive power of 2."); - constexpr static int Lg(int k) { return (k == 1) ? 0 : 1 + Lg(k/2); } +#define SkAlign2(x) (((x) + 1) >> 1 << 1) +#define SkIsAlign2(x) (0 == ((x) & 1)) - constexpr static T Align(T x) { return (x + N-1) >> Lg(N) << Lg(N); } - constexpr static bool IsAligned(T x) { return 0 == (x & (N-1)); } -}; - -template <int N, typename P> -struct SkAlign_traits<N, P*> { - constexpr static P* Align(P* p) { - return (P*)SkAlign_traits<N, uintptr_t>::Align((uintptr_t)p); - } - constexpr static bool IsAligned(P* p) { - return SkAlign_traits<N, uintptr_t>::IsAligned((uintptr_t)p); - } -}; - -template <int N, typename T> -constexpr static inline T SkAlign(T x) { return SkAlign_traits<N,T>::Align(x); } - -template <int N, typename T> -constexpr static bool SkIsAligned(T x) { return SkAlign_traits<N,T>::IsAligned(x); } - -#define SkAlign2(x) SkAlign<2>(x) -#define SkIsAlign2(x) SkIsAligned<2>(x) - -#define SkAlign4(x) SkAlign<4>(x) -#define SkIsAlign4(x) SkIsAligned<4>(x) +#define SkAlign4(x) (((x) + 3) >> 2 << 2) +#define SkIsAlign4(x) (0 == ((x) & 3)) -#define SkAlign8(x) SkAlign<8>(x) -#define SkIsAlign8(x) SkIsAligned<8>(x) +#define SkAlign8(x) (((x) + 7) >> 3 << 3) +#define SkIsAlign8(x) (0 == ((x) & 7)) -#define SkAlign16(x) SkAlign<16>(x) -#define SkIsAlign16(x) SkIsAligned<16>(x) +#define SkAlign16(x) (((x) + 15) >> 4 << 4) +#define SkIsAlign16(x) (0 == ((x) & 15)) -#define SkAlignPtr(x) SkAlign<sizeof(void*)>(x) -#define SkIsAlignPtr(x) SkIsAligned<sizeof(void*)>(x) +#define SkAlignPtr(x) (sizeof(void*) == 8 ? SkAlign8(x) : SkAlign4(x)) +#define SkIsAlignPtr(x) (sizeof(void*) == 8 ? SkIsAlign8(x) : SkIsAlign4(x)) typedef uint32_t SkFourByteTag; #define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) diff --git a/tests/MathTest.cpp b/tests/MathTest.cpp index a3e0b740e1..1dd8223091 100644 --- a/tests/MathTest.cpp +++ b/tests/MathTest.cpp @@ -679,21 +679,3 @@ DEF_TEST(divmod_s32, r) { DEF_TEST(divmod_s64, r) { test_divmod<int64_t>(r); } - -DEF_TEST(SkAlign, r) { - int x = 6; - REPORTER_ASSERT(r, SkIsAlign2(x)); - REPORTER_ASSERT(r, !SkIsAlign4(x)); - x = SkAlign4(x); - REPORTER_ASSERT(r, SkIsAlign2(x)); - REPORTER_ASSERT(r, SkIsAlign4(x)); - - auto p = (char*)&x; - REPORTER_ASSERT(r, SkIsAlign2(p)); - REPORTER_ASSERT(r, SkIsAlign4(p)); - p += 2; - REPORTER_ASSERT(r, SkIsAlign2(p)); - REPORTER_ASSERT(r, !SkIsAlign4(p)); - p = SkAlign4(p); - REPORTER_ASSERT(r, p == (char*)(&x+1)); -} |