defaults.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <grass/raster3d.h>
  4. #include "G3d_intern.h"
  5. /*---------------------------------------------------------------------------*/
  6. #define G3D_NO_DEFAULT -10
  7. #define G3D_COMPRESSION_DEFAULT G3D_COMPRESSION
  8. #define G3D_USE_LZW_DEFAULT G3D_NO_LZW
  9. #define G3D_USE_RLE_DEFAULT G3D_USE_RLE
  10. #define G3D_PRECISION_DEFAULT G3D_MAX_PRECISION
  11. #define G3D_CACHE_SIZE_DEFAULT 1000
  12. #define G3D_CACHE_SIZE_MAX_DEFAULT 16777216
  13. #define G3D_FILE_TYPE_DEFAULT DCELL_TYPE
  14. #define G3D_TILE_X_DEFAULT 16
  15. #define G3D_TILE_Y_DEFAULT 16
  16. #define G3D_TILE_Z_DEFAULT 8
  17. #define G3D_ERROR_FUN_DEFAULT G3d_skipError
  18. #define G3D_UNIT_DEFAULT "none"
  19. /*---------------------------------------------------------------------------*/
  20. #define G3D_COMPRESSION_ENV_VAR_YES "G3D_USE_COMPRESSION"
  21. #define G3D_COMPRESSION_ENV_VAR_NO "G3D_NO_COMPRESSION"
  22. #define G3D_LZW_ENV_VAR_YES "G3D_USE_LZW"
  23. #define G3D_LZW_ENV_VAR_NO "G3D_NO_LZW"
  24. #define G3D_RLE_ENV_VAR_YES "G3D_USE_RLE"
  25. #define G3D_RLE_ENV_VAR_NO "G3D_NO_RLE"
  26. #define G3D_PRECISION_ENV_VAR "G3D_PRECISION"
  27. #define G3D_PRECISION_ENV_VAR_MAX "G3D_MAX_PRECISION"
  28. #define G3D_CACHE_SIZE_ENV_VAR "G3D_DEFAULT_CACHE_SIZE"
  29. #define G3D_CACHE_SIZE_MAX_ENV_VAR "G3D_MAX_CACHE_SIZE"
  30. #define G3D_FILE_FLOAT_ENV_VAR "G3D_WRITE_FLOAT"
  31. #define G3D_FILE_DOUBLE_ENV_VAR "G3D_WRITE_DOUBLE"
  32. #define G3D_TILE_DIM_X_ENV_VAR "G3D_TILE_DIMENSION_X"
  33. #define G3D_TILE_DIM_Y_ENV_VAR "G3D_TILE_DIMENSION_Y"
  34. #define G3D_TILE_DIM_Z_ENV_VAR "G3D_TILE_DIMENSION_Z"
  35. #define G3D_FATAL_ERROR_ENV_VAR "G3D_USE_FATAL_ERROR"
  36. #define G3D_PRINT_ERROR_ENV_VAR "G3D_USE_PRINT_ERROR"
  37. #define G3D_DEFAULT_WINDOW3D "G3D_DEFAULT_WINDOW3D"
  38. /*---------------------------------------------------------------------------*/
  39. int g3d_do_compression = G3D_NO_DEFAULT;
  40. int g3d_do_lzw_compression = G3D_NO_DEFAULT;
  41. int g3d_do_rle_compression = G3D_NO_DEFAULT;
  42. int g3d_precision = G3D_NO_DEFAULT;
  43. int g3d_cache_default = G3D_NO_DEFAULT;
  44. int g3d_cache_max = G3D_NO_DEFAULT;
  45. int g3d_file_type = G3D_NO_DEFAULT;
  46. int g3d_tile_dimension[3] =
  47. { G3D_NO_DEFAULT, G3D_NO_DEFAULT, G3D_NO_DEFAULT };
  48. void (*g3d_error_fun) (const char *) = NULL;
  49. char *g3d_unit_default = NULL;
  50. /*---------------------------------------------------------------------------*/
  51. /*!
  52. * \brief
  53. *
  54. * <em>doCompress</em> should be one of G3D_NO_COMPRESSION and
  55. * G3D_COMPRESSION, <em>doRle</em> should be either G3D_NO_RLE or
  56. * G3D_USE_RLE, and <em>precision</em> should be either G3D_MAX_PRECISION or
  57. * a positive integer.
  58. *
  59. * \param doCompress
  60. * \param doLzw
  61. * \param doRle
  62. * \param precision
  63. * \return void
  64. */
  65. void
  66. G3d_setCompressionMode(int doCompress, int doLzw, int doRle, int precision)
  67. {
  68. if ((doCompress != G3D_NO_COMPRESSION) && (doCompress != G3D_COMPRESSION))
  69. G3d_fatalError("G3d_setCompressionMode: wrong value for doCompress.");
  70. g3d_do_compression = doCompress;
  71. if (doCompress == G3D_NO_COMPRESSION)
  72. return;
  73. if ((doLzw != G3D_NO_LZW) && (doLzw != G3D_USE_LZW))
  74. G3d_fatalError("G3d_setCompressionMode: wrong value for doLzw.");
  75. if ((doRle != G3D_NO_RLE) && (doRle != G3D_USE_RLE))
  76. G3d_fatalError("G3d_setCompressionMode: wrong value for doRle.");
  77. if (precision < -1)
  78. G3d_fatalError("G3d_setCompressionMode: wrong value for precision.");
  79. g3d_do_lzw_compression = doLzw;
  80. g3d_do_rle_compression = doRle;
  81. g3d_precision = precision;
  82. }
  83. /*---------------------------------------------------------------------------*/
  84. /*!
  85. * \brief
  86. *
  87. *
  88. *
  89. * \param doCompress
  90. * \param doLzw
  91. * \param doRle
  92. * \param precision
  93. * \return void
  94. */
  95. void
  96. G3d_getCompressionMode(int *doCompress, int *doLzw, int *doRle,
  97. int *precision)
  98. {
  99. if (doCompress != NULL)
  100. *doCompress = g3d_do_compression;
  101. if (doLzw != NULL)
  102. *doLzw = g3d_do_lzw_compression;
  103. if (doRle != NULL)
  104. *doRle = g3d_do_rle_compression;
  105. if (precision != NULL)
  106. *precision = g3d_precision;
  107. }
  108. /*---------------------------------------------------------------------------*/
  109. /*!
  110. * \brief
  111. *
  112. * set cache size
  113. *
  114. * \param nTiles
  115. * \return void
  116. */
  117. void G3d_setCacheSize(int nTiles)
  118. {
  119. if (nTiles < 0)
  120. G3d_fatalError("G3d_setCacheSize: size out of range.");
  121. g3d_cache_default = nTiles;
  122. }
  123. /*---------------------------------------------------------------------------*/
  124. /*!
  125. * \brief
  126. *
  127. * get cache size
  128. *
  129. * \return int
  130. */
  131. int G3d_getCacheSize()
  132. {
  133. return g3d_cache_default;
  134. }
  135. /*---------------------------------------------------------------------------*/
  136. /*!
  137. * \brief Set cache limit
  138. *
  139. * set cache limit
  140. *
  141. * \param nBytes
  142. * \return void
  143. */
  144. void G3d_setCacheLimit(int nBytes)
  145. {
  146. if (nBytes <= 0)
  147. G3d_fatalError("G3d_setCacheLimit: size out of range.");
  148. g3d_cache_max = nBytes;
  149. }
  150. /*---------------------------------------------------------------------------*/
  151. /*!
  152. * \brief Get cache limit
  153. *
  154. * get cache limit
  155. *
  156. * \param nBytes
  157. * \return int
  158. */
  159. int G3d_getCacheLimit()
  160. {
  161. return g3d_cache_max;
  162. }
  163. /*---------------------------------------------------------------------------*/
  164. /*!
  165. * \brief
  166. *
  167. * set G3d file type
  168. *
  169. * \param type
  170. * \return void
  171. */
  172. void G3d_setFileType(int type)
  173. {
  174. if ((type != FCELL_TYPE) && (type != DCELL_TYPE))
  175. G3d_fatalError("G3d_setFileTypeDefault: invalid type");
  176. g3d_file_type = type;
  177. }
  178. /*---------------------------------------------------------------------------*/
  179. /*!
  180. * \brief
  181. *
  182. * get G3d file type
  183. *
  184. * \param type
  185. * \return int
  186. */
  187. int G3d_getFileType()
  188. {
  189. return g3d_file_type;
  190. }
  191. /*---------------------------------------------------------------------------*/
  192. /*!
  193. * \brief
  194. *
  195. * set Tile Dimension
  196. *
  197. * \param tileX
  198. * \param tileY
  199. * \param tileZ
  200. * \return void
  201. */
  202. void G3d_setTileDimension(int tileX, int tileY, int tileZ)
  203. {
  204. if ((g3d_tile_dimension[0] = tileX) <= 0)
  205. G3d_fatalError
  206. ("G3d_setTileDimension: value for tile x environment variable out of range");
  207. if ((g3d_tile_dimension[1] = tileY) <= 0)
  208. G3d_fatalError
  209. ("G3d_setTileDimension: value for tile y environment variable out of range");
  210. if ((g3d_tile_dimension[2] = tileZ) <= 0)
  211. G3d_fatalError
  212. ("G3d_setTileDimension: value for tile z environment variable out of range");
  213. }
  214. /*---------------------------------------------------------------------------*/
  215. /*!
  216. * \brief
  217. *
  218. * get Tile Dimension
  219. *
  220. * \param tileX
  221. * \param tileY
  222. * \param tileZ
  223. * \return void
  224. */
  225. void G3d_getTileDimension(int *tileX, int *tileY, int *tileZ)
  226. {
  227. *tileX = g3d_tile_dimension[0];
  228. *tileY = g3d_tile_dimension[1];
  229. *tileZ = g3d_tile_dimension[2];
  230. }
  231. /*---------------------------------------------------------------------------*/
  232. /*!
  233. * \brief
  234. *
  235. * set error function
  236. *
  237. * \param
  238. * \return void
  239. */
  240. void G3d_setErrorFun(void (*fun) (const char *))
  241. {
  242. g3d_error_fun = fun;
  243. }
  244. /*---------------------------------------------------------------------------*/
  245. /*!
  246. * \brief
  247. *
  248. * set G3d unit
  249. *
  250. * \param unit
  251. * \return void
  252. */
  253. void G3d_setUnit(const char *unit)
  254. {
  255. G3d_free(g3d_unit_default);
  256. g3d_unit_default = G_store(unit);
  257. }
  258. /*---------------------------------------------------------------------------*/
  259. /*!
  260. * \brief
  261. *
  262. * Initializes the default values described
  263. * in G3D Defaults. Applications have to use this function only if they need to
  264. * query the default values before the first file (either old or new) has been
  265. * opened.
  266. *
  267. * \return void
  268. */
  269. void G3d_initDefaults(void)
  270. {
  271. static int firstTime = 1;
  272. const char *value, *windowName;
  273. G3D_Region window;
  274. if (!firstTime)
  275. return;
  276. firstTime = 0;
  277. if (g3d_do_compression == G3D_NO_DEFAULT) {
  278. if (NULL != getenv(G3D_COMPRESSION_ENV_VAR_YES)) {
  279. g3d_do_compression = G3D_COMPRESSION;
  280. }
  281. else {
  282. if (NULL != getenv(G3D_COMPRESSION_ENV_VAR_NO)) {
  283. g3d_do_compression = G3D_NO_COMPRESSION;
  284. }
  285. else {
  286. g3d_do_compression = G3D_COMPRESSION_DEFAULT;
  287. }
  288. }
  289. }
  290. if (g3d_do_lzw_compression == G3D_NO_DEFAULT) {
  291. if (NULL != getenv(G3D_LZW_ENV_VAR_YES)) {
  292. g3d_do_lzw_compression = G3D_USE_LZW;
  293. }
  294. else {
  295. if (NULL != getenv(G3D_LZW_ENV_VAR_NO)) {
  296. g3d_do_lzw_compression = G3D_NO_LZW;
  297. }
  298. else {
  299. g3d_do_lzw_compression = G3D_USE_LZW_DEFAULT;
  300. }
  301. }
  302. }
  303. if (g3d_do_rle_compression == G3D_NO_DEFAULT) {
  304. if (NULL != getenv(G3D_RLE_ENV_VAR_YES)) {
  305. g3d_do_rle_compression = G3D_USE_RLE;
  306. }
  307. else {
  308. if (NULL != getenv(G3D_RLE_ENV_VAR_NO)) {
  309. g3d_do_rle_compression = G3D_NO_RLE;
  310. }
  311. else {
  312. g3d_do_rle_compression = G3D_USE_RLE_DEFAULT;
  313. }
  314. }
  315. }
  316. if (g3d_precision == G3D_NO_DEFAULT) {
  317. if (NULL != getenv(G3D_PRECISION_ENV_VAR_MAX)) {
  318. g3d_precision = G3D_MAX_PRECISION;
  319. }
  320. else {
  321. value = getenv(G3D_PRECISION_ENV_VAR);
  322. if (value == NULL) {
  323. g3d_precision = G3D_PRECISION_DEFAULT;
  324. }
  325. else {
  326. if (sscanf(value, "%d", &g3d_precision) != 1) {
  327. G3d_fatalError
  328. ("G3d_initDefaults: precision environment variable has invalid value");
  329. }
  330. else {
  331. if (g3d_precision < -1) {
  332. G3d_fatalError
  333. ("G3d_initDefaults: value for cache environment variable out of range");
  334. }
  335. }
  336. }
  337. }
  338. }
  339. if (g3d_file_type == G3D_NO_DEFAULT) {
  340. if (NULL != getenv(G3D_FILE_FLOAT_ENV_VAR)) {
  341. g3d_file_type = FCELL_TYPE;
  342. }
  343. else {
  344. if (NULL != getenv(G3D_FILE_DOUBLE_ENV_VAR)) {
  345. g3d_file_type = DCELL_TYPE;
  346. }
  347. else {
  348. g3d_file_type = G3D_FILE_TYPE_DEFAULT;
  349. }
  350. }
  351. }
  352. if (g3d_cache_default == G3D_NO_DEFAULT) {
  353. value = getenv(G3D_CACHE_SIZE_ENV_VAR);
  354. if (value == NULL) {
  355. g3d_cache_default = G3D_CACHE_SIZE_DEFAULT;
  356. }
  357. else {
  358. if (sscanf(value, "%d", &g3d_cache_default) != 1) {
  359. G3d_fatalError
  360. ("G3d_initDefaults: cache environment variable has invalid value");
  361. }
  362. if (g3d_cache_default < 0) {
  363. G3d_fatalError
  364. ("G3d_initDefaults: value for cache environment variable out of range");
  365. }
  366. }
  367. }
  368. if (g3d_cache_max == G3D_NO_DEFAULT) {
  369. value = getenv(G3D_CACHE_SIZE_MAX_ENV_VAR);
  370. if (value == NULL) {
  371. g3d_cache_max = G3D_CACHE_SIZE_MAX_DEFAULT;
  372. }
  373. else {
  374. if (sscanf(value, "%d", &g3d_cache_max) != 1) {
  375. G3d_fatalError
  376. ("G3d_initDefaults: cache environment variable has invalid value");
  377. }
  378. if (g3d_cache_max < 0) {
  379. G3d_fatalError
  380. ("G3d_initDefaults: value for cache environment variable out of range");
  381. }
  382. }
  383. }
  384. if (g3d_tile_dimension[0] == G3D_NO_DEFAULT) {
  385. value = getenv(G3D_TILE_DIM_X_ENV_VAR);
  386. if (value == NULL) {
  387. g3d_tile_dimension[0] = G3D_TILE_X_DEFAULT;
  388. }
  389. else {
  390. if (sscanf(value, "%d", g3d_tile_dimension) != 1) {
  391. G3d_fatalError
  392. ("G3d_initDefaults: tile dimension x environment variable has invalid value");
  393. }
  394. if (g3d_tile_dimension[0] <= 0) {
  395. G3d_fatalError
  396. ("G3d_initDefaults: value for tile x environment variable out of range");
  397. }
  398. }
  399. value = getenv(G3D_TILE_DIM_Y_ENV_VAR);
  400. if (value == NULL) {
  401. g3d_tile_dimension[1] = G3D_TILE_Y_DEFAULT;
  402. }
  403. else {
  404. if (sscanf(value, "%d", g3d_tile_dimension + 1) != 1) {
  405. G3d_fatalError
  406. ("G3d_initDefaults: tile dimension y environment variable has invalid value");
  407. }
  408. if (g3d_tile_dimension[1] <= 0) {
  409. G3d_fatalError
  410. ("G3d_initDefaults: value for tile y environment variable out of range");
  411. }
  412. }
  413. value = getenv(G3D_TILE_DIM_Z_ENV_VAR);
  414. if (value == NULL) {
  415. g3d_tile_dimension[2] = G3D_TILE_Z_DEFAULT;
  416. }
  417. else {
  418. if (sscanf(value, "%d", g3d_tile_dimension + 2) != 1) {
  419. G3d_fatalError
  420. ("G3d_initDefaults: tile dimension z environment variable has invalid value");
  421. }
  422. if (g3d_tile_dimension[2] <= 0) {
  423. G3d_fatalError
  424. ("G3d_initDefaults: value for tile z environment variable out of range");
  425. }
  426. }
  427. }
  428. if (g3d_error_fun == NULL) {
  429. value = getenv(G3D_FATAL_ERROR_ENV_VAR);
  430. if (value != NULL) {
  431. g3d_error_fun = G3d_fatalError_noargs;
  432. }
  433. else {
  434. value = getenv(G3D_PRINT_ERROR_ENV_VAR);
  435. if (value != NULL) {
  436. g3d_error_fun = G3d_printError;
  437. }
  438. else {
  439. g3d_error_fun = G3D_ERROR_FUN_DEFAULT;
  440. }
  441. }
  442. }
  443. if (g3d_unit_default == NULL)
  444. g3d_unit_default = G_store(G3D_UNIT_DEFAULT);
  445. windowName = G3d_getWindowParams();
  446. if (windowName == NULL) {
  447. value = getenv(G3D_DEFAULT_WINDOW3D);
  448. if (value != NULL)
  449. if (*value != 0)
  450. windowName = value;
  451. }
  452. if (!G3d_readWindow(&window, windowName))
  453. G3d_fatalError("G3d_initDefaults: Error reading window");
  454. G3d_setWindow(&window);
  455. }