#include #include #include #include #include "G3d_intern.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /* EXPORTED FUNCTIONS */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*! * \brief * * This function * returns a pointer to a tile which contains the data for the tile with index * tileIndex. The type of the data stored in the tile depends on the type * specified at the initialization time of map. The functionality is * different depending on whether map is old or new and depending on the * cache-mode of map.
* If map is old and the cache is not used the tile with tileIndex * is read from file and stored in the buffer provided by the map structure. * The pointer to this buffer is returned. If the buffer already contains the * tile with tileIndex reading is skipped. Data which was stored in * earlier calls to G3d_getTilePtr is destroyed. If the tile with tileIndex is not stored on the file corresponding to map, and tileIndex is a valid index the buffer is filled with NULL-values.
* If map is old and the cache is used the tile with tileIndex is * read from file and stored in one of the cache buffers. The pointer to buffer * is returned. If no free cache buffer is available an unlocked cache-buffer * is freed up and the new tile is stored in its place. If the tile with tileIndex * is not stored on the file corresponding to map, and tileIndex is a valid * index the buffer is filled with NULL-values. If one * of the cache buffers already contains the tile with tileIndex reading * is skipped and the pointer to this buffer is returned.
* If map is new and the cache is not used the functionality is the same * as if map is old and the cache is not used. If the tile with tileIndex * is already stored on file, it is read into the buffer, if not, * the cells are set to null-values. If the buffer corresponding to the pointer * is used for writing, subsequent calls to G3d_getTilePtr may destroy the * values already stored in the buffer. Use G3d_flushTile to write the buffer * to the file before reusing it for a different index. The use of this buffer * as write buffer is discouraged.
* If map is new and the cache is used the functionality is the same as if * map is old and the cache is used with the following exception. If tileIndex * is a valid index and the tile with this index is not found in * the cache and is not stored on the file corresponding to map, then the * file cache is queried next. If the file-cache contains the tile it is loaded * into the cache (memory-cache). Only if the file-cache does not contain the * tile it is filled with NULL-values. Tile contents of buffers are never * destroyed. If a cache buffer needs to be freed up, and the tile stored in the * buffer has not been written to the file corresponding to map yet, the * tile is copied into the file-cache.
* Care has to be taken if this function is used in non-cache mode since it is * implicitly invoked every time a read or write request is issued. The only * I/O-functions for which it is safe to assume that they do not invoke * G3d_getTilePtr are G3d_readTile() and * G3d_writeTile() and their corresponding type-specific versions. * * \param map * \param tileIndex * \return char * a pointer to a buffer ... if successful, * NULL ... otherwise. */ void *G3d_getTilePtr(G3D_Map * map, int tileIndex) { void *ptr; if ((tileIndex >= map->nTiles) || (tileIndex < 0)) { G3d_error("G3d_getTilePtr: tileIndex out of range"); return NULL; } if (map->useCache) { ptr = G3d_cache_elt_ptr(map->cache, tileIndex); if (ptr == NULL) { G3d_error("G3d_getTilePtr: error in G3d_cache_elt_ptr"); return NULL; } return ptr; } if (map->currentIndex == tileIndex) return map->data; map->currentIndex = tileIndex; if (!G3d_readTile(map, map->currentIndex, map->data, map->typeIntern)) { G3d_error("G3d_getTilePtr: error in G3d_readTile"); return NULL; } return map->data; } /*---------------------------------------------------------------------------*/ /*! * \brief * * Same functionality as G3d_getTilePtr() but does not return the pointer. * * \param map * \param tileIndex * \return 1 ... if successful, * 0 ... otherwise. */ int G3d_tileLoad(G3D_Map * map, int tileIndex) { if (G3d_getTilePtr(map, tileIndex) == NULL) { G3d_error("G3d_tileLoad: error in G3d_getTilePtr"); return 0; } return 1; } /*---------------------------------------------------------------------------*/ int G3d__removeTile(G3D_Map * map, int tileIndex) { if (!map->useCache) return 1; if (!G3d_cache_remove_elt(map->cache, tileIndex)) { G3d_error("G3d_removeTile: error in G3d_cache_remove_elt"); return 0; } return 1; }