OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkTypes_DEFINED | 8 #ifndef SkTypes_DEFINED |
9 #define SkTypes_DEFINED | 9 #define SkTypes_DEFINED |
10 | 10 |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 // Can be used to bracket data types that must be dense, e.g. hash keys. | 325 // Can be used to bracket data types that must be dense, e.g. hash keys. |
326 #if defined(__clang__) // This should work on GCC too, but GCC diagnostic pop d
idn't seem to work! | 326 #if defined(__clang__) // This should work on GCC too, but GCC diagnostic pop d
idn't seem to work! |
327 #define SK_BEGIN_REQUIRE_DENSE _Pragma("GCC diagnostic push") \ | 327 #define SK_BEGIN_REQUIRE_DENSE _Pragma("GCC diagnostic push") \ |
328 _Pragma("GCC diagnostic error \"-Wpadded\"") | 328 _Pragma("GCC diagnostic error \"-Wpadded\"") |
329 #define SK_END_REQUIRE_DENSE _Pragma("GCC diagnostic pop") | 329 #define SK_END_REQUIRE_DENSE _Pragma("GCC diagnostic pop") |
330 #else | 330 #else |
331 #define SK_BEGIN_REQUIRE_DENSE | 331 #define SK_BEGIN_REQUIRE_DENSE |
332 #define SK_END_REQUIRE_DENSE | 332 #define SK_END_REQUIRE_DENSE |
333 #endif | 333 #endif |
334 | 334 |
335 template <int N, typename T> | 335 #define SkAlign2(x) (((x) + 1) >> 1 << 1) |
336 struct SkAlign_traits { | 336 #define SkIsAlign2(x) (0 == ((x) & 1)) |
337 static_assert (N > 0 && (N & (N-1)) == 0, "N must be a positive power of 2."
); | |
338 constexpr static int Lg(int k) { return (k == 1) ? 0 : 1 + Lg(k/2); } | |
339 | 337 |
340 constexpr static T Align(T x) { return (x + N-1) >> Lg(N) << Lg(N); } | 338 #define SkAlign4(x) (((x) + 3) >> 2 << 2) |
341 constexpr static bool IsAligned(T x) { return 0 == (x & (N-1)); } | 339 #define SkIsAlign4(x) (0 == ((x) & 3)) |
342 }; | |
343 | 340 |
344 template <int N, typename P> | 341 #define SkAlign8(x) (((x) + 7) >> 3 << 3) |
345 struct SkAlign_traits<N, P*> { | 342 #define SkIsAlign8(x) (0 == ((x) & 7)) |
346 constexpr static P* Align(P* p) { | |
347 return (P*)SkAlign_traits<N, uintptr_t>::Align((uintptr_t)p); | |
348 } | |
349 constexpr static bool IsAligned(P* p) { | |
350 return SkAlign_traits<N, uintptr_t>::IsAligned((uintptr_t)p); | |
351 } | |
352 }; | |
353 | 343 |
354 template <int N, typename T> | 344 #define SkAlign16(x) (((x) + 15) >> 4 << 4) |
355 constexpr static inline T SkAlign(T x) { return SkAlign_traits<N,T>::Align(x); } | 345 #define SkIsAlign16(x) (0 == ((x) & 15)) |
356 | 346 |
357 template <int N, typename T> | 347 #define SkAlignPtr(x) (sizeof(void*) == 8 ? SkAlign8(x) : SkAlign4(x)) |
358 constexpr static bool SkIsAligned(T x) { return SkAlign_traits<N,T>::IsAligned(x
); } | 348 #define SkIsAlignPtr(x) (sizeof(void*) == 8 ? SkIsAlign8(x) : SkIsAlign4(x)) |
359 | |
360 #define SkAlign2(x) SkAlign<2>(x) | |
361 #define SkIsAlign2(x) SkIsAligned<2>(x) | |
362 | |
363 #define SkAlign4(x) SkAlign<4>(x) | |
364 #define SkIsAlign4(x) SkIsAligned<4>(x) | |
365 | |
366 #define SkAlign8(x) SkAlign<8>(x) | |
367 #define SkIsAlign8(x) SkIsAligned<8>(x) | |
368 | |
369 #define SkAlign16(x) SkAlign<16>(x) | |
370 #define SkIsAlign16(x) SkIsAligned<16>(x) | |
371 | |
372 #define SkAlignPtr(x) SkAlign<sizeof(void*)>(x) | |
373 #define SkIsAlignPtr(x) SkIsAligned<sizeof(void*)>(x) | |
374 | 349 |
375 typedef uint32_t SkFourByteTag; | 350 typedef uint32_t SkFourByteTag; |
376 #define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8)
| (d)) | 351 #define SkSetFourByteTag(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8)
| (d)) |
377 | 352 |
378 /** 32 bit integer to hold a unicode value | 353 /** 32 bit integer to hold a unicode value |
379 */ | 354 */ |
380 typedef int32_t SkUnichar; | 355 typedef int32_t SkUnichar; |
381 | 356 |
382 /** 16 bit unsigned integer to hold a glyph index | 357 /** 16 bit unsigned integer to hold a glyph index |
383 */ | 358 */ |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 | 721 |
747 void* fPtr; | 722 void* fPtr; |
748 size_t fSize; // can be larger than the requested size (see kReuse) | 723 size_t fSize; // can be larger than the requested size (see kReuse) |
749 uint32_t fStorage[kSize >> 2]; | 724 uint32_t fStorage[kSize >> 2]; |
750 }; | 725 }; |
751 // Can't guard the constructor because it's a template class. | 726 // Can't guard the constructor because it's a template class. |
752 | 727 |
753 #endif /* C++ */ | 728 #endif /* C++ */ |
754 | 729 |
755 #endif | 730 #endif |
OLD | NEW |