GRASS Programmer's Manual  6.4.3(2013)-r
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Pages
retile.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 static void
10 retileNocache(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
11 {
12  void *map2;
13  int x, y, z, saveType, nx, ny, nz;
14  int typeIntern;
15  void *data;
16  int tileXsave, tileYsave, tileZsave;
17  G3D_Region region;
18 
19  saveType = G3d_getFileType();
21  G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
22  G3d_setTileDimension(tileX, tileY, tileZ);
23  typeIntern = G3d_tileTypeMap(map);
24  G3d_getRegionStructMap(map, &region);
25 
26  map2 = G3d_openCellNew(nameOut, typeIntern, G3D_NO_CACHE, &region);
27 
28  if (map2 == NULL)
29  G3d_fatalError("G3d_retile: error in G3d_openCellNew");
30 
31  G3d_setFileType(saveType);
32  G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
33 
34  data = G3d_allocTiles(map2, 1);
35  if (data == NULL)
36  G3d_fatalError("G3d_retile: error in G3d_allocTiles");
37 
38  G3d_getNofTilesMap(map2, &nx, &ny, &nz);
39 
40  for (z = 0; z < nz; z++)
41  for (y = 0; y < ny; y++)
42  for (x = 0; x < nx; x++) {
43 
44  G3d_getBlock(map, x * tileX, y * tileY, z * tileZ,
45  tileX, tileY, tileZ, data, typeIntern);
46  if (!G3d_writeTile
47  (map2, G3d_tile2tileIndex(map2, x, y, z), data,
48  typeIntern))
50  ("G3d_retileNocache: error in G3d_writeTile");
51  }
52 
53  G3d_freeTiles(data);
54  G3d_closeCell(map2);
55 }
56 
57 /*---------------------------------------------------------------------------*/
58 
59 
75 void
76 G3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
77 {
78  void *map2;
79  double value;
80  int x, y, z, saveType;
81  int rows, cols, depths, typeIntern;
82  int xTile, yTile, zTile;
83  int xOffs, yOffs, zOffs, prev;
84  int tileXsave, tileYsave, tileZsave;
85  G3D_Region region;
86 
87  if (!G3d_tileUseCacheMap(map)) {
88  retileNocache(map, nameOut, tileX, tileY, tileZ);
89  return;
90  }
91 
92  saveType = G3d_getFileType();
94  G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
95  G3d_setTileDimension(tileX, tileY, tileZ);
96 
97  typeIntern = G3d_tileTypeMap(map);
98  G3d_getRegionStructMap(map, &region);
99 
100  map2 =
101  G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, &region);
102  if (map2 == NULL)
103  G3d_fatalError("G3d_retile: error in G3d_openCellNew");
104 
105  G3d_setFileType(saveType);
106  G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
107 
108  G3d_coord2tileCoord(map2, 0, 0, 0,
109  &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs);
110 
111  prev = zTile;
112 
113  x = 0;
114  y = 0;
115 
116  G3d_getCoordsMap(map, &rows, &cols, &depths);
117 
118  for (z = 0; z < depths; z++) {
119  G3d_coord2tileCoord(map2, x, y, z, &xTile, &yTile, &zTile,
120  &xOffs, &yOffs, &zOffs);
121  if (zTile > prev) {
122  if (!G3d_flushAllTiles(map2))
123  G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
124  prev++;
125  }
126 
127  for (y = 0; y < rows; y++)
128  for (x = 0; x < cols; x++) {
129 
130  G3d_getValueRegion(map, x, y, z, &value, typeIntern);
131  if (!G3d_putValue(map2, x, y, z, &value, typeIntern))
132  G3d_fatalError("G3d_retile: error in G3d_putValue");
133  }
134  }
135 
136  if (!G3d_flushAllTiles(map2))
137  G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
138  if (!G3d_closeCell(map2))
139  G3d_fatalError("G3d_retile: error in G3d_closeCell");
140 }