Permalink
Browse files

Change mapbit.c bitmask type from char to new 32bit ms_bitarray

git-svn-id: http://svn.osgeo.org/mapserver/trunk@8741 7532c77e-422f-0410-93f4-f0b67bdd69e2
  • Loading branch information...
1 parent 5a57254 commit ef6fa7ab7bcf4ab355878867f510d371e1c2e268 Julien-Samuel Lacroix committed Mar 9, 2009
Showing with 47 additions and 38 deletions.
  1. +27 −21 mapbits.c
  2. +8 −5 mapserver.h
  3. +2 −2 mapshape.h
  4. +7 −7 maptree.c
  5. +3 −3 maptree.h
View
@@ -10,7 +10,7 @@
*
******************************************************************************
* Copyright (c) 1996-2005 Regents of the University of Minnesota.
- *
+
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
@@ -36,24 +36,30 @@ MS_CVSID("$Id$")
#include <limits.h>
-/* #define msGetBit(array, index) (*((array) + (index)/CHAR_BIT) & ( 1 << ((index) % CHAR_BIT))) */
+/*
+ * Hardcoded size of our bit array.
+ * See function msGetNextBit for another hardcoded value.
+ */
+#define MS_ARRAY_BIT 32
+
+/* #define msGetBit(array, index) (*((array) + (index)/MS_ARRAY_BIT) & ( 1 << ((index) % MS_ARRAY_BIT))) */
size_t msGetBitArraySize(int numbits)
{
- return((numbits + CHAR_BIT - 1) / CHAR_BIT);
+ return((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT);
}
-char *msAllocBitArray(int numbits)
+ms_bitarray msAllocBitArray(int numbits)
{
- char *array = calloc((numbits + CHAR_BIT - 1) / CHAR_BIT, sizeof(char));
+ ms_bitarray array = calloc((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT, MS_ARRAY_BIT);
return(array);
}
-int msGetBit(char *array, int index)
+int msGetBit(ms_bitarray array, int index)
{
- array += index / CHAR_BIT;
- return (*array & (1 << (index % CHAR_BIT))) != 0; /* 0 or 1 */
+ array += index / MS_ARRAY_BIT;
+ return (*array & (1 << (index % MS_ARRAY_BIT))) != 0; /* 0 or 1 */
}
/*
@@ -63,16 +69,16 @@ int msGetBit(char *array, int index)
** If hits end of bitmap without finding set bit, will return -1.
**
*/
-int msGetNextBit(char *array, int i, int size) {
+int msGetNextBit(ms_bitarray array, int i, int size) {
- register char b;
+ register ms_uint32 b;
while(i < size) {
- b = *(array + (i/CHAR_BIT));
- if( b && (b >> (i % CHAR_BIT)) ) {
+ b = *(array + (i/MS_ARRAY_BIT));
+ if( b && (b >> (i % MS_ARRAY_BIT)) ) {
/* There is something in this byte */
/* And it is not to the right of us */
- if( b & ( 1 << (i % CHAR_BIT)) ) {
+ if( b & ( 1 << (i % MS_ARRAY_BIT)) ) {
/* There is something at this bit! */
return i;
}
@@ -82,25 +88,25 @@ int msGetNextBit(char *array, int i, int size) {
}
else {
/* Nothing in this byte, move to start of next byte */
- i += CHAR_BIT - (i % CHAR_BIT);
+ i += MS_ARRAY_BIT - (i % MS_ARRAY_BIT);
}
}
/* Got to the last byte with no hits! */
return -1;
}
-void msSetBit(char *array, int index, int value)
+void msSetBit(ms_bitarray array, int index, int value)
{
- array += index / CHAR_BIT;
+ array += index / MS_ARRAY_BIT;
if (value)
- *array |= 1 << (index % CHAR_BIT); /* set bit */
+ *array |= 1 << (index % MS_ARRAY_BIT); /* set bit */
else
- *array &= ~(1 << (index % CHAR_BIT)); /* clear bit */
+ *array &= ~(1 << (index % MS_ARRAY_BIT)); /* clear bit */
}
-void msFlipBit(char *array, int index)
+void msFlipBit(ms_bitarray array, int index)
{
- array += index / CHAR_BIT;
- *array ^= 1 << (index % CHAR_BIT); /* flip bit */
+ array += index / MS_ARRAY_BIT;
+ *array ^= 1 << (index % MS_ARRAY_BIT); /* flip bit */
}
View
@@ -88,6 +88,9 @@ typedef int32_t ms_int32;
typedef uint32_t ms_uint32;
#endif
+/* ms_bitarray is used by the bit mask in mapbit.c */
+typedef ms_uint32 * ms_bitarray;
+
#include "maperror.h"
#include "mapprimitive.h"
#include "mapshape.h"
@@ -1773,11 +1776,11 @@ MS_DLL_EXPORT int msDrawRasterLayer(mapObj *map, layerObj *layer, imageObj *imag
MS_DLL_EXPORT imageObj *msDrawReferenceMap(mapObj *map);
MS_DLL_EXPORT size_t msGetBitArraySize(int numbits); /* in mapbits.c */
-MS_DLL_EXPORT char *msAllocBitArray(int numbits);
-MS_DLL_EXPORT int msGetBit(char *array, int index);
-MS_DLL_EXPORT void msSetBit(char *array, int index, int value);
-MS_DLL_EXPORT void msFlipBit(char *array, int index);
-MS_DLL_EXPORT int msGetNextBit(char *array, int index, int size);
+MS_DLL_EXPORT ms_bitarray msAllocBitArray(int numbits);
+MS_DLL_EXPORT int msGetBit(ms_bitarray array, int index);
+MS_DLL_EXPORT void msSetBit(ms_bitarray array, int index, int value);
+MS_DLL_EXPORT void msFlipBit(ms_bitarray array, int index);
+MS_DLL_EXPORT int msGetNextBit(ms_bitarray array, int index, int size);
MS_DLL_EXPORT int msLayerInitItemInfo(layerObj *layer);
MS_DLL_EXPORT void msLayerFreeItemInfo(layerObj *layer);
View
@@ -89,7 +89,7 @@ typedef struct {
int *panRecOffset;
int *panRecSize;
- char *panRecLoaded;
+ ms_bitarray panRecLoaded;
int panRecAllLoaded;
double adBoundsMin[4];
@@ -165,7 +165,7 @@ typedef struct {
int lastshape;
- char *status;
+ ms_bitarray status;
rectObj statusbounds; /* holds extent associated with the status vector */
int isopen;
View
@@ -378,7 +378,7 @@ static int treeAddShapeId(treeObj *tree, int id, rectObj rect)
return(treeNodeAddShapeId(tree->root, id, rect, tree->maxdepth));
}
-static void treeCollectShapeIds(treeNodeObj *node, rectObj aoi, char *status)
+static void treeCollectShapeIds(treeNodeObj *node, rectObj aoi, ms_bitarray status)
{
int i;
@@ -404,9 +404,9 @@ static void treeCollectShapeIds(treeNodeObj *node, rectObj aoi, char *status)
}
}
-char *msSearchTree(treeObj *tree, rectObj aoi)
+ms_bitarray msSearchTree(treeObj *tree, rectObj aoi)
{
- char *status=NULL;
+ ms_bitarray status=NULL;
status = msAllocBitArray(tree->numshapes);
if(!status) {
@@ -452,7 +452,7 @@ void msTreeTrim(treeObj *tree)
treeNodeTrim(tree->root);
}
-static void searchDiskTreeNode(SHPTreeHandle disktree, rectObj aoi, char *status)
+static void searchDiskTreeNode(SHPTreeHandle disktree, rectObj aoi, ms_bitarray status)
{
int i;
ms_int32 offset;
@@ -507,10 +507,10 @@ static void searchDiskTreeNode(SHPTreeHandle disktree, rectObj aoi, char *status
return;
}
-char *msSearchDiskTree(char *filename, rectObj aoi, int debug)
+ms_bitarray msSearchDiskTree(char *filename, rectObj aoi, int debug)
{
SHPTreeHandle disktree;
- char *status=NULL;
+ ms_bitarray status=NULL;
disktree = msSHPDiskTreeOpen (filename, debug);
if(!disktree) {
@@ -763,7 +763,7 @@ int msWriteTree(treeObj *tree, char *filename, int B_order)
}
/* Function to filter search results further against feature bboxes */
-void msFilterTreeSearch(shapefileObj *shp, char *status, rectObj search_rect)
+void msFilterTreeSearch(shapefileObj *shp, ms_bitarray status, rectObj search_rect)
{
int i;
rectObj shape_rect;
View
@@ -85,13 +85,13 @@ MS_DLL_EXPORT treeObj *msCreateTree(shapefileObj *shapefile, int maxdepth);
MS_DLL_EXPORT void msTreeTrim(treeObj *tree);
MS_DLL_EXPORT void msDestroyTree(treeObj *tree);
-MS_DLL_EXPORT char *msSearchTree(treeObj *tree, rectObj aoi);
-MS_DLL_EXPORT char *msSearchDiskTree(char *filename, rectObj aoi, int debug);
+MS_DLL_EXPORT ms_bitarray msSearchTree(treeObj *tree, rectObj aoi);
+MS_DLL_EXPORT ms_bitarray msSearchDiskTree(char *filename, rectObj aoi, int debug);
MS_DLL_EXPORT treeObj *msReadTree(char *filename, int debug);
MS_DLL_EXPORT int msWriteTree(treeObj *tree, char *filename, int LSB_order);
-MS_DLL_EXPORT void msFilterTreeSearch(shapefileObj *shp, char *status, rectObj search_rect);
+MS_DLL_EXPORT void msFilterTreeSearch(shapefileObj *shp, ms_bitarray status, rectObj search_rect);
#ifdef __cplusplus
}

0 comments on commit ef6fa7a

Please sign in to comment.