123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- #include <stdlib.h>
- #include <stdio.h>
- #include <grass/raster3d.h>
- #include "G3d_intern.h"
- /*---------------------------------------------------------------------------*/
- #define G3D_NO_DEFAULT -10
- #define G3D_COMPRESSION_DEFAULT G3D_COMPRESSION
- #define G3D_USE_LZW_DEFAULT G3D_NO_LZW
- #define G3D_USE_RLE_DEFAULT G3D_USE_RLE
- #define G3D_PRECISION_DEFAULT G3D_MAX_PRECISION
- #define G3D_CACHE_SIZE_DEFAULT 1000
- #define G3D_CACHE_SIZE_MAX_DEFAULT 16777216
- #define G3D_FILE_TYPE_DEFAULT DCELL_TYPE
- #define G3D_TILE_X_DEFAULT 16
- #define G3D_TILE_Y_DEFAULT 16
- #define G3D_TILE_Z_DEFAULT 8
- #define G3D_ERROR_FUN_DEFAULT G3d_skipError
- #define G3D_UNIT_DEFAULT "none"
- /*---------------------------------------------------------------------------*/
- #define G3D_COMPRESSION_ENV_VAR_YES "G3D_USE_COMPRESSION"
- #define G3D_COMPRESSION_ENV_VAR_NO "G3D_NO_COMPRESSION"
- #define G3D_LZW_ENV_VAR_YES "G3D_USE_LZW"
- #define G3D_LZW_ENV_VAR_NO "G3D_NO_LZW"
- #define G3D_RLE_ENV_VAR_YES "G3D_USE_RLE"
- #define G3D_RLE_ENV_VAR_NO "G3D_NO_RLE"
- #define G3D_PRECISION_ENV_VAR "G3D_PRECISION"
- #define G3D_PRECISION_ENV_VAR_MAX "G3D_MAX_PRECISION"
- #define G3D_CACHE_SIZE_ENV_VAR "G3D_DEFAULT_CACHE_SIZE"
- #define G3D_CACHE_SIZE_MAX_ENV_VAR "G3D_MAX_CACHE_SIZE"
- #define G3D_FILE_FLOAT_ENV_VAR "G3D_WRITE_FLOAT"
- #define G3D_FILE_DOUBLE_ENV_VAR "G3D_WRITE_DOUBLE"
- #define G3D_TILE_DIM_X_ENV_VAR "G3D_TILE_DIMENSION_X"
- #define G3D_TILE_DIM_Y_ENV_VAR "G3D_TILE_DIMENSION_Y"
- #define G3D_TILE_DIM_Z_ENV_VAR "G3D_TILE_DIMENSION_Z"
- #define G3D_FATAL_ERROR_ENV_VAR "G3D_USE_FATAL_ERROR"
- #define G3D_PRINT_ERROR_ENV_VAR "G3D_USE_PRINT_ERROR"
- #define G3D_DEFAULT_WINDOW3D "G3D_DEFAULT_WINDOW3D"
- /*---------------------------------------------------------------------------*/
- int g3d_do_compression = G3D_NO_DEFAULT;
- int g3d_do_lzw_compression = G3D_NO_DEFAULT;
- int g3d_do_rle_compression = G3D_NO_DEFAULT;
- int g3d_precision = G3D_NO_DEFAULT;
- int g3d_cache_default = G3D_NO_DEFAULT;
- int g3d_cache_max = G3D_NO_DEFAULT;
- int g3d_file_type = G3D_NO_DEFAULT;
- int g3d_tile_dimension[3] =
- { G3D_NO_DEFAULT, G3D_NO_DEFAULT, G3D_NO_DEFAULT };
- void (*g3d_error_fun) (const char *) = NULL;
- char *g3d_unit_default = NULL;
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * <em>doCompress</em> should be one of G3D_NO_COMPRESSION and
- * G3D_COMPRESSION, <em>doRle</em> should be either G3D_NO_RLE or
- * G3D_USE_RLE, and <em>precision</em> should be either G3D_MAX_PRECISION or
- * a positive integer.
- *
- * \param doCompress
- * \param doLzw
- * \param doRle
- * \param precision
- * \return void
- */
- void
- G3d_setCompressionMode(int doCompress, int doLzw, int doRle, int precision)
- {
- if ((doCompress != G3D_NO_COMPRESSION) && (doCompress != G3D_COMPRESSION))
- G3d_fatalError("G3d_setCompressionMode: wrong value for doCompress.");
- g3d_do_compression = doCompress;
- if (doCompress == G3D_NO_COMPRESSION)
- return;
- if ((doLzw != G3D_NO_LZW) && (doLzw != G3D_USE_LZW))
- G3d_fatalError("G3d_setCompressionMode: wrong value for doLzw.");
- if ((doRle != G3D_NO_RLE) && (doRle != G3D_USE_RLE))
- G3d_fatalError("G3d_setCompressionMode: wrong value for doRle.");
- if (precision < -1)
- G3d_fatalError("G3d_setCompressionMode: wrong value for precision.");
- g3d_do_lzw_compression = doLzw;
- g3d_do_rle_compression = doRle;
- g3d_precision = precision;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- *
- *
- * \param doCompress
- * \param doLzw
- * \param doRle
- * \param precision
- * \return void
- */
- void
- G3d_getCompressionMode(int *doCompress, int *doLzw, int *doRle,
- int *precision)
- {
- if (doCompress != NULL)
- *doCompress = g3d_do_compression;
- if (doLzw != NULL)
- *doLzw = g3d_do_lzw_compression;
- if (doRle != NULL)
- *doRle = g3d_do_rle_compression;
- if (precision != NULL)
- *precision = g3d_precision;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * set cache size
- *
- * \param nTiles
- * \return void
- */
- void G3d_setCacheSize(int nTiles)
- {
- if (nTiles < 0)
- G3d_fatalError("G3d_setCacheSize: size out of range.");
- g3d_cache_default = nTiles;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * get cache size
- *
- * \return int
- */
- int G3d_getCacheSize()
- {
- return g3d_cache_default;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief Set cache limit
- *
- * set cache limit
- *
- * \param nBytes
- * \return void
- */
- void G3d_setCacheLimit(int nBytes)
- {
- if (nBytes <= 0)
- G3d_fatalError("G3d_setCacheLimit: size out of range.");
- g3d_cache_max = nBytes;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief Get cache limit
- *
- * get cache limit
- *
- * \param nBytes
- * \return int
- */
- int G3d_getCacheLimit()
- {
- return g3d_cache_max;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * set G3d file type
- *
- * \param type
- * \return void
- */
- void G3d_setFileType(int type)
- {
- if ((type != FCELL_TYPE) && (type != DCELL_TYPE))
- G3d_fatalError("G3d_setFileTypeDefault: invalid type");
- g3d_file_type = type;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * get G3d file type
- *
- * \param type
- * \return int
- */
- int G3d_getFileType()
- {
- return g3d_file_type;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * set Tile Dimension
- *
- * \param tileX
- * \param tileY
- * \param tileZ
- * \return void
- */
- void G3d_setTileDimension(int tileX, int tileY, int tileZ)
- {
- if ((g3d_tile_dimension[0] = tileX) <= 0)
- G3d_fatalError
- ("G3d_setTileDimension: value for tile x environment variable out of range");
- if ((g3d_tile_dimension[1] = tileY) <= 0)
- G3d_fatalError
- ("G3d_setTileDimension: value for tile y environment variable out of range");
- if ((g3d_tile_dimension[2] = tileZ) <= 0)
- G3d_fatalError
- ("G3d_setTileDimension: value for tile z environment variable out of range");
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * get Tile Dimension
- *
- * \param tileX
- * \param tileY
- * \param tileZ
- * \return void
- */
- void G3d_getTileDimension(int *tileX, int *tileY, int *tileZ)
- {
- *tileX = g3d_tile_dimension[0];
- *tileY = g3d_tile_dimension[1];
- *tileZ = g3d_tile_dimension[2];
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * set error function
- *
- * \param
- * \return void
- */
- void G3d_setErrorFun(void (*fun) (const char *))
- {
- g3d_error_fun = fun;
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * set G3d unit
- *
- * \param unit
- * \return void
- */
- void G3d_setUnit(const char *unit)
- {
- G3d_free(g3d_unit_default);
- g3d_unit_default = G_store(unit);
- }
- /*---------------------------------------------------------------------------*/
- /*!
- * \brief
- *
- * Initializes the default values described
- * in G3D Defaults. Applications have to use this function only if they need to
- * query the default values before the first file (either old or new) has been
- * opened.
- *
- * \return void
- */
- void G3d_initDefaults(void)
- {
- static int firstTime = 1;
- const char *value, *windowName;
- G3D_Region window;
- if (!firstTime)
- return;
- firstTime = 0;
- if (g3d_do_compression == G3D_NO_DEFAULT) {
- if (NULL != getenv(G3D_COMPRESSION_ENV_VAR_YES)) {
- g3d_do_compression = G3D_COMPRESSION;
- }
- else {
- if (NULL != getenv(G3D_COMPRESSION_ENV_VAR_NO)) {
- g3d_do_compression = G3D_NO_COMPRESSION;
- }
- else {
- g3d_do_compression = G3D_COMPRESSION_DEFAULT;
- }
- }
- }
- if (g3d_do_lzw_compression == G3D_NO_DEFAULT) {
- if (NULL != getenv(G3D_LZW_ENV_VAR_YES)) {
- g3d_do_lzw_compression = G3D_USE_LZW;
- }
- else {
- if (NULL != getenv(G3D_LZW_ENV_VAR_NO)) {
- g3d_do_lzw_compression = G3D_NO_LZW;
- }
- else {
- g3d_do_lzw_compression = G3D_USE_LZW_DEFAULT;
- }
- }
- }
- if (g3d_do_rle_compression == G3D_NO_DEFAULT) {
- if (NULL != getenv(G3D_RLE_ENV_VAR_YES)) {
- g3d_do_rle_compression = G3D_USE_RLE;
- }
- else {
- if (NULL != getenv(G3D_RLE_ENV_VAR_NO)) {
- g3d_do_rle_compression = G3D_NO_RLE;
- }
- else {
- g3d_do_rle_compression = G3D_USE_RLE_DEFAULT;
- }
- }
- }
- if (g3d_precision == G3D_NO_DEFAULT) {
- if (NULL != getenv(G3D_PRECISION_ENV_VAR_MAX)) {
- g3d_precision = G3D_MAX_PRECISION;
- }
- else {
- value = getenv(G3D_PRECISION_ENV_VAR);
- if (value == NULL) {
- g3d_precision = G3D_PRECISION_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", &g3d_precision) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: precision environment variable has invalid value");
- }
- else {
- if (g3d_precision < -1) {
- G3d_fatalError
- ("G3d_initDefaults: value for cache environment variable out of range");
- }
- }
- }
- }
- }
- if (g3d_file_type == G3D_NO_DEFAULT) {
- if (NULL != getenv(G3D_FILE_FLOAT_ENV_VAR)) {
- g3d_file_type = FCELL_TYPE;
- }
- else {
- if (NULL != getenv(G3D_FILE_DOUBLE_ENV_VAR)) {
- g3d_file_type = DCELL_TYPE;
- }
- else {
- g3d_file_type = G3D_FILE_TYPE_DEFAULT;
- }
- }
- }
- if (g3d_cache_default == G3D_NO_DEFAULT) {
- value = getenv(G3D_CACHE_SIZE_ENV_VAR);
- if (value == NULL) {
- g3d_cache_default = G3D_CACHE_SIZE_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", &g3d_cache_default) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: cache environment variable has invalid value");
- }
- if (g3d_cache_default < 0) {
- G3d_fatalError
- ("G3d_initDefaults: value for cache environment variable out of range");
- }
- }
- }
- if (g3d_cache_max == G3D_NO_DEFAULT) {
- value = getenv(G3D_CACHE_SIZE_MAX_ENV_VAR);
- if (value == NULL) {
- g3d_cache_max = G3D_CACHE_SIZE_MAX_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", &g3d_cache_max) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: cache environment variable has invalid value");
- }
- if (g3d_cache_max < 0) {
- G3d_fatalError
- ("G3d_initDefaults: value for cache environment variable out of range");
- }
- }
- }
- if (g3d_tile_dimension[0] == G3D_NO_DEFAULT) {
- value = getenv(G3D_TILE_DIM_X_ENV_VAR);
- if (value == NULL) {
- g3d_tile_dimension[0] = G3D_TILE_X_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", g3d_tile_dimension) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: tile dimension x environment variable has invalid value");
- }
- if (g3d_tile_dimension[0] <= 0) {
- G3d_fatalError
- ("G3d_initDefaults: value for tile x environment variable out of range");
- }
- }
- value = getenv(G3D_TILE_DIM_Y_ENV_VAR);
- if (value == NULL) {
- g3d_tile_dimension[1] = G3D_TILE_Y_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", g3d_tile_dimension + 1) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: tile dimension y environment variable has invalid value");
- }
- if (g3d_tile_dimension[1] <= 0) {
- G3d_fatalError
- ("G3d_initDefaults: value for tile y environment variable out of range");
- }
- }
- value = getenv(G3D_TILE_DIM_Z_ENV_VAR);
- if (value == NULL) {
- g3d_tile_dimension[2] = G3D_TILE_Z_DEFAULT;
- }
- else {
- if (sscanf(value, "%d", g3d_tile_dimension + 2) != 1) {
- G3d_fatalError
- ("G3d_initDefaults: tile dimension z environment variable has invalid value");
- }
- if (g3d_tile_dimension[2] <= 0) {
- G3d_fatalError
- ("G3d_initDefaults: value for tile z environment variable out of range");
- }
- }
- }
- if (g3d_error_fun == NULL) {
- value = getenv(G3D_FATAL_ERROR_ENV_VAR);
- if (value != NULL) {
- g3d_error_fun = G3d_fatalError_noargs;
- }
- else {
- value = getenv(G3D_PRINT_ERROR_ENV_VAR);
- if (value != NULL) {
- g3d_error_fun = G3d_printError;
- }
- else {
- g3d_error_fun = G3D_ERROR_FUN_DEFAULT;
- }
- }
- }
- if (g3d_unit_default == NULL)
- g3d_unit_default = G_store(G3D_UNIT_DEFAULT);
- windowName = G3d_getWindowParams();
- if (windowName == NULL) {
- value = getenv(G3D_DEFAULT_WINDOW3D);
- if (value != NULL)
- if (*value != 0)
- windowName = value;
- }
- if (!G3d_readWindow(&window, windowName))
- G3d_fatalError("G3d_initDefaults: Error reading window");
- G3d_setWindow(&window);
- }
|