Files
frostbyte/src/bmp.c
T

91 lines
1.9 KiB
C

#include "bmp.h"
#define bmpBitsPerWord 64
static usize wordCountFor(usize bitCount)
{
return (bitCount + bmpBitsPerWord - 1) / bmpBitsPerWord;
}
void bmpInit(Bitmap* b, uint64* backingWords, usize bitCount)
{
b->words = backingWords;
b->bitCount = bitCount;
bmpClearAll(b);
}
void bmpSet(Bitmap* b, usize index)
{
if (index >= b->bitCount)
return;
b->words[index / bmpBitsPerWord] |= (1UL << (index % bmpBitsPerWord));
}
void bmpClear(Bitmap* b, usize index)
{
if (index >= b->bitCount)
return;
b->words[index / bmpBitsPerWord] &= ~(1UL << (index % bmpBitsPerWord));
}
bool bmpTest(const Bitmap* b, usize index)
{
if (index >= b->bitCount)
return false;
return (b->words[index / bmpBitsPerWord] & (1UL << (index % bmpBitsPerWord))) != 0;
}
void bmpSetRange(Bitmap* b, usize start, usize count)
{
for (usize i = start; i < start + count && i < b->bitCount; i++)
bmpSet(b, i);
}
void bmpClearRange(Bitmap* b, usize start, usize count)
{
for (usize i = start; i < start + count && i < b->bitCount; i++)
bmpClear(b, i);
}
void bmpSetAll(Bitmap* b)
{
usize words = wordCountFor(b->bitCount);
for (usize i = 0; i < words; i++)
b->words[i] = ~0UL;
}
void bmpClearAll(Bitmap* b)
{
usize words = wordCountFor(b->bitCount);
for (usize i = 0; i < words; i++)
b->words[i] = 0;
}
usize bmpCountSet(const Bitmap* b)
{
usize total = 0;
for (usize i = 0; i < b->bitCount; i++) {
if (bmpTest(b, i))
total++;
}
return total;
}
isize bmpFindFirstClear(const Bitmap* b)
{
for (usize i = 0; i < b->bitCount; i++) {
if (!bmpTest(b, i))
return (isize)i;
}
return -1;
}
isize bmpFindFirstSet(const Bitmap* b)
{
for (usize i = 0; i < b->bitCount; i++) {
if (bmpTest(b, i))
return (isize)i;
}
return -1;
}