Blender V4.3
bitmap.c
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 by Nicholas Bishop. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include <limits.h>
12#include <string.h>
13
14#include "BLI_bitmap.h"
15#include "BLI_math_bits.h"
16#include "BLI_utildefines.h"
17
18void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
19{
20 memset(bitmap, set ? UCHAR_MAX : 0, BLI_BITMAP_SIZE(bits));
21}
22
23void BLI_bitmap_flip_all(BLI_bitmap *bitmap, size_t bits)
24{
25 size_t blocks_num = _BITMAP_NUM_BLOCKS(bits);
26 for (size_t i = 0; i < blocks_num; i++) {
27 bitmap[i] ^= ~(BLI_bitmap)0;
28 }
29}
30
31void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
32{
33 memcpy(dst, src, BLI_BITMAP_SIZE(bits));
34}
35
36void BLI_bitmap_and_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
37{
38 size_t blocks_num = _BITMAP_NUM_BLOCKS(bits);
39 for (size_t i = 0; i < blocks_num; i++) {
40 dst[i] &= src[i];
41 }
42}
43
44void BLI_bitmap_or_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
45{
46 size_t blocks_num = _BITMAP_NUM_BLOCKS(bits);
47 for (size_t i = 0; i < blocks_num; i++) {
48 dst[i] |= src[i];
49 }
50}
51
52int BLI_bitmap_find_first_unset(const BLI_bitmap *bitmap, const size_t bits)
53{
54 const size_t blocks_num = _BITMAP_NUM_BLOCKS(bits);
55 int result = -1;
56 /* Skip over completely set blocks. */
57 int index = 0;
58 while (index < blocks_num && bitmap[index] == ~0u) {
59 index++;
60 }
61 if (index < blocks_num) {
62 /* Found a partially used block: find the lowest unused bit. */
63 const uint m = ~bitmap[index];
64 BLI_assert(m != 0);
65 const uint bit_index = bitscan_forward_uint(m);
66 result = bit_index + (index << _BITMAP_POWER);
67 }
68 return result;
69}
#define BLI_assert(a)
Definition BLI_assert.h:50
#define _BITMAP_NUM_BLOCKS(_num)
Definition BLI_bitmap.h:31
#define BLI_BITMAP_SIZE(_num)
Definition BLI_bitmap.h:36
#define _BITMAP_POWER
Definition BLI_bitmap.h:24
unsigned int BLI_bitmap
Definition BLI_bitmap.h:17
MINLINE unsigned int bitscan_forward_uint(unsigned int a)
unsigned int uint
void BLI_bitmap_or_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
Definition bitmap.c:44
void BLI_bitmap_and_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
Definition bitmap.c:36
int BLI_bitmap_find_first_unset(const BLI_bitmap *bitmap, const size_t bits)
Definition bitmap.c:52
void BLI_bitmap_copy_all(BLI_bitmap *dst, const BLI_bitmap *src, size_t bits)
Definition bitmap.c:31
void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
Definition bitmap.c:18
void BLI_bitmap_flip_all(BLI_bitmap *bitmap, size_t bits)
Definition bitmap.c:23