20#define _BITMAP_POWER 5
22#define _BITMAP_MASK 31
27#define _BITMAP_NUM_BLOCKS(_num) (((_num) + _BITMAP_MASK) >> _BITMAP_POWER)
32#define BLI_BITMAP_SIZE(_num) ((size_t)(_BITMAP_NUM_BLOCKS(_num)) * sizeof(BLI_bitmap))
37#define BLI_BITMAP_NEW(_num, _alloc_string) \
38 ((BLI_bitmap *)MEM_callocN(BLI_BITMAP_SIZE(_num), _alloc_string))
43#define BLI_BITMAP_NEW_ALLOCA(_num) \
44 ((BLI_bitmap *)memset(alloca(BLI_BITMAP_SIZE(_num)), 0, BLI_BITMAP_SIZE(_num)))
49#define BLI_BITMAP_NEW_MEMARENA(_mem, _num) \
50 (CHECK_TYPE_INLINE(_mem, MemArena *), \
51 ((BLI_bitmap *)BLI_memarena_calloc(_mem, BLI_BITMAP_SIZE(_num))))
56#define BLI_BITMAP_DECLARE(_name, _num) BLI_bitmap _name[_BITMAP_NUM_BLOCKS(_num)] = {}
61#define BLI_BITMAP_TEST(_bitmap, _index) \
62 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
63 ((_bitmap)[(_index) >> _BITMAP_POWER] & (1u << ((_index) & _BITMAP_MASK))))
65#define BLI_BITMAP_TEST_AND_SET_ATOMIC(_bitmap, _index) \
66 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
67 (atomic_fetch_and_or_uint32((uint32_t *)&(_bitmap)[(_index) >> _BITMAP_POWER], \
68 (1u << ((_index) & _BITMAP_MASK))) & \
69 (1u << ((_index) & _BITMAP_MASK))))
71#define BLI_BITMAP_TEST_BOOL(_bitmap, _index) \
72 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
73 (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))))
85#define BLI_BITMAP_DISABLE(_bitmap, _index) \
86 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
87 ((_bitmap)[(_index) >> _BITMAP_POWER] &= ~(1u << ((_index) & _BITMAP_MASK))))
92#define BLI_BITMAP_FLIP(_bitmap, _index) \
93 (CHECK_TYPE_ANY(_bitmap, BLI_bitmap *, const BLI_bitmap *), \
94 ((_bitmap)[(_index) >> _BITMAP_POWER] ^= (1u << ((_index) & _BITMAP_MASK))))
99#define BLI_BITMAP_SET(_bitmap, _index, _set) \
101 CHECK_TYPE(_bitmap, BLI_bitmap *); \
103 BLI_BITMAP_ENABLE(_bitmap, _index); \
106 BLI_BITMAP_DISABLE(_bitmap, _index); \
114#define BLI_BITMAP_RESIZE(_bitmap, _num) \
116 CHECK_TYPE(_bitmap, BLI_bitmap *); \
117 (_bitmap) = (unsigned int *)MEM_recallocN(_bitmap, BLI_BITMAP_SIZE(_num)); \
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)
int BLI_bitmap_find_first_unset(const BLI_bitmap *bitmap, 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)