GRASS 8 Programmer's Manual  8.5.0dev(2025)-d272f2f102
defaults.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <grass/raster3d.h>
4 #include "raster3d_intern.h"
5 
6 /*---------------------------------------------------------------------------*/
7 
8 #define RASTER3D_NO_DEFAULT -10
9 
10 #define RASTER3D_COMPRESSION_DEFAULT RASTER3D_COMPRESSION
11 #define RASTER3D_PRECISION_DEFAULT RASTER3D_MAX_PRECISION
12 #define RASTER3D_CACHE_SIZE_DEFAULT 1000
13 #define RASTER3D_CACHE_SIZE_MAX_DEFAULT 16777216
14 #define RASTER3D_FILE_TYPE_DEFAULT DCELL_TYPE
15 #define RASTER3D_TILE_X_DEFAULT 16
16 #define RASTER3D_TILE_Y_DEFAULT 16
17 #define RASTER3D_TILE_Z_DEFAULT 8
18 #define RASTER3D_ERROR_FUN_DEFAULT Rast3d_skip_error
19 #define RASTER3D_UNIT_DEFAULT "none"
20 #define RASTER3D_VERTICAL_UNIT_DEFAULT U_UNKNOWN
21 
22 /*---------------------------------------------------------------------------*/
23 
24 /*!
25  \brief Name of the environmental variable specifying that compression
26  should be used.
27 
28  Setting the environmental variable to any value will cause that the
29  compression will be used (set when calling Rast3d_init_defaults
30  for the first time).
31 
32  This environmental variable takes precedence before the environmental
33  variable specified by RASTER3D_COMPRESSION_ENV_VAR_NO.
34  */
35 #define RASTER3D_COMPRESSION_ENV_VAR_YES "RASTER3D_USE_COMPRESSION"
36 /*!
37  \brief Name of the environmental variable specifying that compression
38  should not be used.
39 
40  \see RASTER3D_COMPRESSION_ENV_VAR_YES
41  */
42 #define RASTER3D_COMPRESSION_ENV_VAR_NO "RASTER3D_NO_COMPRESSION"
43 
44 #define RASTER3D_PRECISION_ENV_VAR "RASTER3D_PRECISION"
45 #define RASTER3D_PRECISION_ENV_VAR_MAX "RASTER3D_MAX_PRECISION"
46 
47 #define RASTER3D_CACHE_SIZE_ENV_VAR "RASTER3D_DEFAULT_CACHE_SIZE"
48 #define RASTER3D_CACHE_SIZE_MAX_ENV_VAR "RASTER3D_MAX_CACHE_SIZE"
49 
50 #define RASTER3D_FILE_FLOAT_ENV_VAR "RASTER3D_WRITE_FLOAT"
51 #define RASTER3D_FILE_DOUBLE_ENV_VAR "RASTER3D_WRITE_DOUBLE"
52 
53 #define RASTER3D_TILE_DIM_X_ENV_VAR "RASTER3D_TILE_DIMENSION_X"
54 #define RASTER3D_TILE_DIM_Y_ENV_VAR "RASTER3D_TILE_DIMENSION_Y"
55 #define RASTER3D_TILE_DIM_Z_ENV_VAR "RASTER3D_TILE_DIMENSION_Z"
56 
57 #define RASTER3D_FATAL_ERROR_ENV_VAR "RASTER3D_USE_FATAL_ERROR"
58 #define RASTER3D_PRINT_ERROR_ENV_VAR "RASTER3D_USE_PRINT_ERROR"
59 
60 #define RASTER3D_DEFAULT_WINDOW3D "RASTER3D_DEFAULT_WINDOW3D"
61 
62 /*---------------------------------------------------------------------------*/
63 
72 void (*g3d_error_fun)(const char *) = NULL;
75 
76 /*---------------------------------------------------------------------------*/
77 
78 /*!
79  * \brief set compression mode
80  *
81  * <em>doCompress</em> should be one of RASTER3D_NO_COMPRESSION and
82  * RASTER3D_COMPRESSION. <em>precision</em> should be either
83  * RASTER3D_MAX_PRECISION or a positive integer.
84  *
85  * \note Note that older parameters <em>doLzw</em> and <em>doRle</em>
86  * (RASTER3D_NO_RLE or RASTER3D_USE_RLE) are no longer in the API.
87  *
88  * Calls Rast3d_fatal_error() if a wrong parameter value is provided.
89  *
90  * \param doCompress specifies if a compression should be performed
91  * \param precision a precision of compression
92  */
93 void Rast3d_set_compression_mode(int doCompress, int precision)
94 {
95  if ((doCompress != RASTER3D_NO_COMPRESSION) &&
96  (doCompress != RASTER3D_COMPRESSION))
98  "Rast3d_set_compression_mode: wrong value for doCompress.");
99 
100  g3d_do_compression = doCompress;
101 
102  if (doCompress == RASTER3D_NO_COMPRESSION)
103  return;
104 
105  if (precision < -1)
107  "Rast3d_set_compression_mode: wrong value for precision.");
108 
109  g3d_precision = precision;
110 }
111 
112 /*---------------------------------------------------------------------------*/
113 
114 /*!
115  * \brief Gets compression mode
116  *
117  * \param doCompress pointer to the integer where the compression mode will
118  * be stored
119  * \param precision pointer to the integer where the precision mode will
120  * be stored
121  *
122  * \see Rast3d_set_compression_mode, RASTER3D_COMPRESSION_ENV_VAR_YES,
123  RASTER3D_COMPRESSION_ENV_VAR_YES
124  */
125 void Rast3d_get_compression_mode(int *doCompress, int *precision)
126 {
127  if (doCompress != NULL)
128  *doCompress = g3d_do_compression;
129  if (precision != NULL)
130  *precision = g3d_precision;
131 }
132 
133 /*---------------------------------------------------------------------------*/
134 
135 /*!
136  * \brief set cache size
137  *
138  * \param nTiles
139  * \return void
140  */
141 void Rast3d_set_cache_size(int nTiles)
142 {
143  if (nTiles < 0)
144  Rast3d_fatal_error("Rast3d_set_cache_size: size out of range.");
145 
146  g3d_cache_default = nTiles;
147 }
148 
149 /*---------------------------------------------------------------------------*/
150 
151 /*!
152  * \brief get cache size
153  *
154  * \return int
155  */
157 {
158  return g3d_cache_default;
159 }
160 
161 /*---------------------------------------------------------------------------*/
162 
163 /*!
164  * \brief Set cache limit
165  *
166  * \param nBytes
167  * \return void
168  */
169 void Rast3d_set_cache_limit(int nBytes)
170 {
171  if (nBytes <= 0)
172  Rast3d_fatal_error("Rast3d_set_cache_limit: size out of range.");
173 
174  g3d_cache_max = nBytes;
175 }
176 
177 /*---------------------------------------------------------------------------*/
178 
179 /*!
180  * \brief Get cache limit
181  *
182  * \return int
183  */
185 {
186  return g3d_cache_max;
187 }
188 
189 /*---------------------------------------------------------------------------*/
190 
191 /*!
192  * \brief set G3d file type
193  *
194  * \param type
195  * \return void
196  */
197 void Rast3d_set_file_type(int type)
198 {
199  if ((type != FCELL_TYPE) && (type != DCELL_TYPE))
200  Rast3d_fatal_error("Rast3d_setFileTypeDefault: invalid type");
201 
202  g3d_file_type = type;
203 }
204 
205 /*---------------------------------------------------------------------------*/
206 
207 /*!
208  * \brief get G3d file type
209  *
210  * \return int
211  */
213 {
214  return g3d_file_type;
215 }
216 
217 /*---------------------------------------------------------------------------*/
218 
219 /*!
220  * \brief set Tile Dimension
221  *
222  * \param tileX
223  * \param tileY
224  * \param tileZ
225  * \return void
226  */
227 void Rast3d_set_tile_dimension(int tileX, int tileY, int tileZ)
228 {
229  if ((g3d_tile_dimension[0] = tileX) <= 0)
230  Rast3d_fatal_error("Rast3d_set_tile_dimension: value for tile x "
231  "environment variable out of range");
232 
233  if ((g3d_tile_dimension[1] = tileY) <= 0)
234  Rast3d_fatal_error("Rast3d_set_tile_dimension: value for tile y "
235  "environment variable out of range");
236 
237  if ((g3d_tile_dimension[2] = tileZ) <= 0)
238  Rast3d_fatal_error("Rast3d_set_tile_dimension: value for tile z "
239  "environment variable out of range");
240 }
241 
242 /*---------------------------------------------------------------------------*/
243 
244 /*!
245  * \brief get Tile Dimension
246  *
247  * \param tileX
248  * \param tileY
249  * \param tileZ
250  * \return void
251  */
252 void Rast3d_get_tile_dimension(int *tileX, int *tileY, int *tileZ)
253 {
254  *tileX = g3d_tile_dimension[0];
255  *tileY = g3d_tile_dimension[1];
256  *tileZ = g3d_tile_dimension[2];
257 }
258 
259 /*---------------------------------------------------------------------------*/
260 
261 /*!
262  * \brief set error function
263  *
264  * \param fun
265  * \return void
266  */
267 void Rast3d_set_error_fun(void (*fun)(const char *))
268 {
269  g3d_error_fun = fun;
270 }
271 
272 /*---------------------------------------------------------------------------*/
273 
274 /*!
275  * \brief Initializes the default values described
276  * in RASTER3D Defaults. Applications have to use this function only if they
277  * need to query the default values before the first file (either old or new)
278  * has been opened.
279  *
280  * \return void
281  */
283 {
284  static int firstTime = 1;
285  const char *value, *windowName;
286  RASTER3D_Region window;
287 
288  if (!firstTime)
289  return;
290  firstTime = 0;
291 
293  if (NULL != getenv(RASTER3D_COMPRESSION_ENV_VAR_YES)) {
295  }
296  else {
297  if (NULL != getenv(RASTER3D_COMPRESSION_ENV_VAR_NO)) {
299  }
300  else {
302  }
303  }
304  }
305 
307  if (NULL != getenv(RASTER3D_PRECISION_ENV_VAR_MAX)) {
309  }
310  else {
311  value = getenv(RASTER3D_PRECISION_ENV_VAR);
312  if (value == NULL) {
314  }
315  else {
316  if (sscanf(value, "%d", &g3d_precision) != 1) {
318  "Rast3d_init_defaults: precision environment variable "
319  "has invalid value");
320  }
321  else {
322  if (g3d_precision < -1) {
324  "Rast3d_init_defaults: value for cache environment "
325  "variable out of range");
326  }
327  }
328  }
329  }
330  }
331 
333  if (NULL != getenv(RASTER3D_FILE_FLOAT_ENV_VAR)) {
335  }
336  else {
337  if (NULL != getenv(RASTER3D_FILE_DOUBLE_ENV_VAR)) {
339  }
340  else {
342  }
343  }
344  }
345 
347  value = getenv(RASTER3D_CACHE_SIZE_ENV_VAR);
348 
349  if (value == NULL) {
351  }
352  else {
353  if (sscanf(value, "%d", &g3d_cache_default) != 1) {
354  Rast3d_fatal_error("Rast3d_init_defaults: cache environment "
355  "variable has invalid value");
356  }
357  if (g3d_cache_default < 0) {
358  Rast3d_fatal_error("Rast3d_init_defaults: value for cache "
359  "environment variable out of range");
360  }
361  }
362  }
363 
365  value = getenv(RASTER3D_CACHE_SIZE_MAX_ENV_VAR);
366 
367  if (value == NULL) {
369  }
370  else {
371  if (sscanf(value, "%d", &g3d_cache_max) != 1) {
372  Rast3d_fatal_error("Rast3d_init_defaults: cache environment "
373  "variable has invalid value");
374  }
375  if (g3d_cache_max < 0) {
376  Rast3d_fatal_error("Rast3d_init_defaults: value for cache "
377  "environment variable out of range");
378  }
379  }
380  }
381 
383  value = getenv(RASTER3D_TILE_DIM_X_ENV_VAR);
384 
385  if (value == NULL) {
387  }
388  else {
389  if (sscanf(value, "%d", g3d_tile_dimension) != 1) {
390  Rast3d_fatal_error("Rast3d_init_defaults: tile dimension x "
391  "environment variable has invalid value");
392  }
393  if (g3d_tile_dimension[0] <= 0) {
394  Rast3d_fatal_error("Rast3d_init_defaults: value for tile x "
395  "environment variable out of range");
396  }
397  }
398 
399  value = getenv(RASTER3D_TILE_DIM_Y_ENV_VAR);
400 
401  if (value == NULL) {
403  }
404  else {
405  if (sscanf(value, "%d", g3d_tile_dimension + 1) != 1) {
406  Rast3d_fatal_error("Rast3d_init_defaults: tile dimension y "
407  "environment variable has invalid value");
408  }
409  if (g3d_tile_dimension[1] <= 0) {
410  Rast3d_fatal_error("Rast3d_init_defaults: value for tile y "
411  "environment variable out of range");
412  }
413  }
414 
415  value = getenv(RASTER3D_TILE_DIM_Z_ENV_VAR);
416 
417  if (value == NULL) {
419  }
420  else {
421  if (sscanf(value, "%d", g3d_tile_dimension + 2) != 1) {
422  Rast3d_fatal_error("Rast3d_init_defaults: tile dimension z "
423  "environment variable has invalid value");
424  }
425  if (g3d_tile_dimension[2] <= 0) {
426  Rast3d_fatal_error("Rast3d_init_defaults: value for tile z "
427  "environment variable out of range");
428  }
429  }
430  }
431 
432  if (g3d_error_fun == NULL) {
433  value = getenv(RASTER3D_FATAL_ERROR_ENV_VAR);
434 
435  if (value != NULL) {
437  }
438  else {
439  value = getenv(RASTER3D_PRINT_ERROR_ENV_VAR);
440 
441  if (value != NULL) {
443  }
444  else {
446  }
447  }
448  }
449 
450  if (g3d_unit_default == NULL)
454 
455  windowName = Rast3d_get_window_params();
456  if (windowName == NULL) {
457  value = getenv(RASTER3D_DEFAULT_WINDOW3D);
458  if (value != NULL)
459  if (*value != 0)
460  windowName = value;
461  }
462 
463  if (!Rast3d_read_window(&window, windowName))
464  Rast3d_fatal_error("Rast3d_init_defaults: Error reading window");
465  Rast3d_set_window(&window);
466 }
#define NULL
Definition: ccmath.h:32
#define RASTER3D_COMPRESSION_ENV_VAR_NO
Name of the environmental variable specifying that compression should not be used.
Definition: defaults.c:42
void Rast3d_set_cache_limit(int nBytes)
Set cache limit.
Definition: defaults.c:169
void Rast3d_set_tile_dimension(int tileX, int tileY, int tileZ)
set Tile Dimension
Definition: defaults.c:227
#define RASTER3D_FATAL_ERROR_ENV_VAR
Definition: defaults.c:57
#define RASTER3D_TILE_Y_DEFAULT
Definition: defaults.c:16
#define RASTER3D_CACHE_SIZE_ENV_VAR
Definition: defaults.c:47
#define RASTER3D_ERROR_FUN_DEFAULT
Definition: defaults.c:18
#define RASTER3D_PRECISION_ENV_VAR_MAX
Definition: defaults.c:45
char * g3d_unit_default
Definition: defaults.c:73
void Rast3d_set_error_fun(void(*fun)(const char *))
set error function
Definition: defaults.c:267
#define RASTER3D_PRECISION_ENV_VAR
Definition: defaults.c:44
void Rast3d_get_tile_dimension(int *tileX, int *tileY, int *tileZ)
get Tile Dimension
Definition: defaults.c:252
int g3d_tile_dimension[3]
Definition: defaults.c:70
int g3d_precision
Definition: defaults.c:66
int g3d_cache_max
Definition: defaults.c:68
int Rast3d_get_cache_limit(void)
Get cache limit.
Definition: defaults.c:184
#define RASTER3D_CACHE_SIZE_MAX_ENV_VAR
Definition: defaults.c:48
int g3d_cache_default
Definition: defaults.c:67
#define RASTER3D_COMPRESSION_DEFAULT
Definition: defaults.c:10
#define RASTER3D_TILE_DIM_Z_ENV_VAR
Definition: defaults.c:55
void(* g3d_error_fun)(const char *)
Definition: defaults.c:72
#define RASTER3D_CACHE_SIZE_DEFAULT
Definition: defaults.c:12
int g3d_file_type
Definition: defaults.c:69
#define RASTER3D_PRINT_ERROR_ENV_VAR
Definition: defaults.c:58
void Rast3d_get_compression_mode(int *doCompress, int *precision)
Gets compression mode.
Definition: defaults.c:125
#define RASTER3D_TILE_DIM_X_ENV_VAR
Definition: defaults.c:53
int Rast3d_get_file_type(void)
get G3d file type
Definition: defaults.c:212
int g3d_version
Definition: defaults.c:64
#define RASTER3D_UNIT_DEFAULT
Definition: defaults.c:19
#define RASTER3D_FILE_FLOAT_ENV_VAR
Definition: defaults.c:50
#define RASTER3D_VERTICAL_UNIT_DEFAULT
Definition: defaults.c:20
#define RASTER3D_TILE_X_DEFAULT
Definition: defaults.c:15
#define RASTER3D_COMPRESSION_ENV_VAR_YES
Name of the environmental variable specifying that compression should be used.
Definition: defaults.c:35
void Rast3d_set_file_type(int type)
set G3d file type
Definition: defaults.c:197
#define RASTER3D_NO_DEFAULT
Definition: defaults.c:8
#define RASTER3D_CACHE_SIZE_MAX_DEFAULT
Definition: defaults.c:13
#define RASTER3D_TILE_Z_DEFAULT
Definition: defaults.c:17
void Rast3d_init_defaults(void)
Initializes the default values described in RASTER3D Defaults. Applications have to use this function...
Definition: defaults.c:282
#define RASTER3D_PRECISION_DEFAULT
Definition: defaults.c:11
#define RASTER3D_DEFAULT_WINDOW3D
Definition: defaults.c:60
#define RASTER3D_FILE_DOUBLE_ENV_VAR
Definition: defaults.c:51
#define RASTER3D_FILE_TYPE_DEFAULT
Definition: defaults.c:14
int Rast3d_get_cache_size(void)
get cache size
Definition: defaults.c:156
void Rast3d_set_compression_mode(int doCompress, int precision)
set compression mode
Definition: defaults.c:93
int g3d_do_compression
Definition: defaults.c:65
#define RASTER3D_TILE_DIM_Y_ENV_VAR
Definition: defaults.c:54
void Rast3d_set_cache_size(int nTiles)
set cache size
Definition: defaults.c:141
int g3d_vertical_unit_default
Definition: defaults.c:74
char * G_store(const char *)
Copy string to allocated memory.
Definition: strings.c:87
void Rast3d_fatal_error_noargs(const char *) __attribute__((noreturn))
char * Rast3d_get_window_params(void)
Definition: param.c:133
void Rast3d_print_error(const char *)
Prints error message.
int Rast3d_read_window(RASTER3D_Region *, const char *)
Reads window from the file specified by windowName. The name is converted by the rules defined in win...
Definition: windowio.c:132
void Rast3d_set_window(RASTER3D_Region *)
Sets the default window used for every map opened later in the program. Can be used multiple times in...
void Rast3d_fatal_error(const char *,...) __attribute__((format(printf
#define U_UNDEFINED
List of units.
Definition: gis.h:103
#define RASTER3D_COMPRESSION
Definition: raster3d.h:14
#define RASTER3D_MAP_VERSION
Definition: raster3d.h:9
#define RASTER3D_MAX_PRECISION
Definition: raster3d.h:16
#define RASTER3D_NO_COMPRESSION
Definition: raster3d.h:13
#define FCELL_TYPE
Definition: raster.h:12
#define DCELL_TYPE
Definition: raster.h:13