39 #define _BITMAP_POWER 5
41 #define _BITMAP_MASK 31
44 #define _BITMAP_NUM_BLOCKS(_tot) (((_tot) >> _BITMAP_POWER) + 1)
47 #define BLI_BITMAP_SIZE(_tot) ((size_t)(_BITMAP_NUM_BLOCKS(_tot)) * sizeof(BLI_bitmap))
50 #define BLI_BITMAP_NEW(_tot, _alloc_string) \
51 ((BLI_bitmap *)MEM_callocN(BLI_BITMAP_SIZE(_tot), _alloc_string))
54 #define BLI_BITMAP_NEW_ALLOCA(_tot) \
55 ((BLI_bitmap *)memset(alloca(BLI_BITMAP_SIZE(_tot)), 0, BLI_BITMAP_SIZE(_tot)))
58 #define BLI_BITMAP_NEW_MEMARENA(_mem, _tot) \
59 (CHECK_TYPE_INLINE(_mem, MemArena *), \
60 ((BLI_bitmap *)BLI_memarena_calloc(_mem, BLI_BITMAP_SIZE(_tot))))
63 #define BLI_BITMAP_TEST(_bitmap, _index) \
64 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
65 ((_bitmap)[(_index) >> _BITMAP_POWER] & (1u << ((_index)&_BITMAP_MASK))))
67 #define BLI_BITMAP_TEST_AND_SET_ATOMIC(_bitmap, _index) \
68 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
69 (atomic_fetch_and_or_uint32((uint32_t *)&(_bitmap)[(_index) >> _BITMAP_POWER], \
70 (1u << ((_index)&_BITMAP_MASK))) & \
71 (1u << ((_index)&_BITMAP_MASK))))
73 #define BLI_BITMAP_TEST_BOOL(_bitmap, _index) \
74 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
75 (BLI_BITMAP_TEST(_bitmap, _index) != 0))
78 #define BLI_BITMAP_ENABLE(_bitmap, _index) \
79 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
80 ((_bitmap)[(_index) >> _BITMAP_POWER] |= (1u << ((_index)&_BITMAP_MASK))))
83 #define BLI_BITMAP_DISABLE(_bitmap, _index) \
84 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
85 ((_bitmap)[(_index) >> _BITMAP_POWER] &= ~(1u << ((_index)&_BITMAP_MASK))))
88 #define BLI_BITMAP_FLIP(_bitmap, _index) \
89 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
90 ((_bitmap)[(_index) >> _BITMAP_POWER] ^= (1u << ((_index)&_BITMAP_MASK))))
93 #define BLI_BITMAP_SET(_bitmap, _index, _set) \
95 CHECK_TYPE(_bitmap, BLI_bitmap *); \
97 BLI_BITMAP_ENABLE(_bitmap, _index); \
100 BLI_BITMAP_DISABLE(_bitmap, _index); \
106 #define BLI_BITMAP_RESIZE(_bitmap, _tot) \
108 CHECK_TYPE(_bitmap, BLI_bitmap *); \
109 (_bitmap) = MEM_recallocN(_bitmap, BLI_BITMAP_SIZE(_tot)); \
void BLI_bitmap_or_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
void BLI_bitmap_and_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
void BLI_bitmap_flip_all(BLI_bitmap *bitmap, size_t bits)