#include #include #include #include #include "raster3d_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 Rast3d_get_tile_ptr 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 Rast3d_get_tile_ptr may destroy the * values already stored in the buffer. Use Rast3d_flush_tile 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 * Rast3d_get_tile_ptr are Rast3d_read_tile() and * Rast3d_write_tile() and their corresponding type-specific versions. * * \param map * \param tileIndex * \return void * a pointer to a buffer ... if successful, * NULL ... otherwise. */ void *Rast3d_get_tile_ptr(RASTER3D_Map * map, int tileIndex) { void *ptr; if ((tileIndex >= map->nTiles) || (tileIndex < 0)) { Rast3d_error("Rast3d_get_tile_ptr: tileIndex out of range"); return NULL; } if (map->useCache) { ptr = Rast3d_cache_elt_ptr(map->cache, tileIndex); if (ptr == NULL) { Rast3d_error("Rast3d_get_tile_ptr: error in Rast3d_cache_elt_ptr"); return NULL; } return ptr; } if (map->currentIndex == tileIndex) return map->data; map->currentIndex = tileIndex; if (!Rast3d_read_tile(map, map->currentIndex, map->data, map->typeIntern)) { Rast3d_error("Rast3d_get_tile_ptr: error in Rast3d_read_tile"); return NULL; } return map->data; } /*---------------------------------------------------------------------------*/ /*! * \brief * * Same functionality as Rast3d_get_tile_ptr() but does not return the pointer. * * \param map * \param tileIndex * \return 1 ... if successful, * 0 ... otherwise. */ int Rast3d_tile_load(RASTER3D_Map * map, int tileIndex) { if (Rast3d_get_tile_ptr(map, tileIndex) == NULL) { Rast3d_error("Rast3d_tile_load: error in Rast3d_get_tile_ptr"); return 0; } return 1; } /*---------------------------------------------------------------------------*/ int Rast3d__remove_tile(RASTER3D_Map * map, int tileIndex) { if (!map->useCache) return 1; if (!Rast3d_cache_remove_elt(map->cache, tileIndex)) { Rast3d_error("Rast3d_removeTile: error in Rast3d_cache_remove_elt"); return 0; } return 1; }