X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbitmask.h;h=e699a7ff56ae28fb864d778f4943ac1865af6803;hb=6c61f312a1f5a768e202195ca18ed5a51974bdcc;hp=cc2b9a4304ff6847b9a3708762df001b5b4bfe1f;hpb=cf865a9388d9dce0422510c5369a2471191d1299;p=supertux.git diff --git a/src/bitmask.h b/src/bitmask.h index cc2b9a430..e699a7ff5 100644 --- a/src/bitmask.h +++ b/src/bitmask.h @@ -10,7 +10,6 @@ * to check for collisions. * The current implementation uses 32 bit wide stripes to hold * the masks, but should work just as well with 64 bit sizes. - * (Note that the current bitcount function is 32 bit only!) * * The overlap tests uses the following offsets (which may be negative): * @@ -26,11 +25,6 @@ * with some kind of pre-sorting to avoid comparing objects far from * each other. * - * BUGS: No known bugs, even though they may certainly be in here somewhere. - * Possible performance improvements could be to remove the div in - * bitmask_overlap_pos() and to implement wider stripes if the masks used - * are wider than 64 bits on the average. - * * Performance of the various functions goes something like: * (relative timings, smaller is better) * @@ -65,11 +59,12 @@ #define SUPERTUX_BITMASK_H #include +#include /* Define INLINE for different compilers. */ #ifndef INLINE # ifdef __GNUC__ -# define INLINE __inline__ +# define INLINE inline # else # ifdef _MSC_VER # define INLINE __inline @@ -80,15 +75,15 @@ #endif #define BITW unsigned long int -#define BITW_LEN 32 -#define BITW_MASK 31 +#define BITW_LEN (sizeof(BITW)*CHAR_BIT) +#define BITW_MASK (BITW_LEN - 1) #define BITN(n) ((BITW)1 << (n)) -typedef struct bitmask +struct bitmask { int w,h; BITW *bits; -} bitmask; +}; /* Creates a bitmask of width w and height h. * The mask is automatically cleared when created. @@ -96,6 +91,9 @@ typedef struct bitmask bitmask *bitmask_create(int w, int h); void bitmask_free(bitmask *m); +void bitmask_clear(bitmask *m); +void bitmask_fill(bitmask *m); + /* Returns nonzero if the bit at (x,y) is set. * Coordinates start at (0,0) */ @@ -123,7 +121,7 @@ static INLINE void bitmask_clearbit(bitmask *m,int x,int y) int bitmask_overlap(const bitmask *a,const bitmask *b,int xoffset, int yoffset); /* Like bitmask_overlap(), but will also give a point of intersection. - * x and y are given in the coordinates of mask a, and are untouched if the is + * x and y are given in the coordinates of mask a, and are untouched if there is * no overlap. */ int bitmask_overlap_pos(const bitmask *a,const bitmask *b,int xoffset, int yoffset, int *x, int *y);