GRASS Programmer's Manual  6.4.3(2013)-r
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Pages
changeprecision.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <grass/G3d.h>
6 
7 /*---------------------------------------------------------------------------*/
8 
9 
23 void G3d_changePrecision(void *map, int precision, const char *nameOut)
24 {
25  void *map2;
26  int x, y, z, savePrecision, saveCompression, saveLzw, saveRle;
27  char *data;
28  G3D_Region region;
29  int typeIntern;
30  int nx, ny, nz;
31  int tileXsave, tileYsave, tileZsave, tileX, tileY, tileZ, saveType;
32 
33  saveType = G3d_getFileType();
34  /* G3d_setFileType (G3d_fileTypeMap (map)); */
35  G3d_getCompressionMode(&saveCompression, &saveLzw, &saveRle,
36  &savePrecision);
37  G3d_setCompressionMode(G3D_COMPRESSION, saveLzw, saveRle, precision);
38  G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
39  G3d_getTileDimensionsMap(map, &tileX, &tileY, &tileZ);
40  G3d_setTileDimension(tileX, tileY, tileZ);
41 
42  typeIntern = G3d_tileTypeMap(map);
43  G3d_getRegionStructMap(map, &region);
44 
45  map2 =
46  G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, &region);
47  if (map2 == NULL)
48  G3d_fatalError("G3d_changePrecision: error in G3d_openCellNew");
49 
50  G3d_setFileType(saveType);
51  G3d_setCompressionMode(saveCompression, saveLzw, saveRle, savePrecision);
52  G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
53 
54  data = G3d_allocTiles(map, 1);
55  if (data == NULL)
56  G3d_fatalError("G3d_changePrecision: error in G3d_allocTiles");
57  G3d_getNofTilesMap(map2, &nx, &ny, &nz);
58 
59  for (z = 0; z < nz; z++)
60  for (y = 0; y < ny; y++)
61  for (x = 0; x < nx; x++) {
62  if (!G3d_readTile(map, G3d_tile2tileIndex(map, x, y, z), data,
63  typeIntern))
65  ("G3d_changePrecision: error in G3d_readTile");
66  if (!G3d_writeTile
67  (map2, G3d_tile2tileIndex(map2, x, y, z), data,
68  typeIntern))
70  ("G3d_changePrecision: error in G3d_writeTile");
71  }
72 
73  G3d_freeTiles(data);
74  if (!G3d_closeCell(map2))
75  G3d_fatalError("G3d_changePrecision: error in G3d_closeCell");
76 }