91 lines
1.9 KiB
C
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;
|
|
}
|