GRASS Programmer's Manual  6.4.2(2012)
retile.c
Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <sys/types.h>
00004 #include <unistd.h>
00005 #include <grass/G3d.h>
00006 
00007 /*---------------------------------------------------------------------------*/
00008 
00009 static void
00010 retileNocache(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
00011 {
00012     void *map2;
00013     int x, y, z, saveType, nx, ny, nz;
00014     int typeIntern;
00015     void *data;
00016     int tileXsave, tileYsave, tileZsave;
00017     G3D_Region region;
00018 
00019     saveType = G3d_getFileType();
00020     G3d_setFileType(G3d_fileTypeMap(map));
00021     G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
00022     G3d_setTileDimension(tileX, tileY, tileZ);
00023     typeIntern = G3d_tileTypeMap(map);
00024     G3d_getRegionStructMap(map, &region);
00025 
00026     map2 = G3d_openCellNew(nameOut, typeIntern, G3D_NO_CACHE, &region);
00027 
00028     if (map2 == NULL)
00029         G3d_fatalError("G3d_retile: error in G3d_openCellNew");
00030 
00031     G3d_setFileType(saveType);
00032     G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
00033 
00034     data = G3d_allocTiles(map2, 1);
00035     if (data == NULL)
00036         G3d_fatalError("G3d_retile: error in G3d_allocTiles");
00037 
00038     G3d_getNofTilesMap(map2, &nx, &ny, &nz);
00039 
00040     for (z = 0; z < nz; z++)
00041         for (y = 0; y < ny; y++)
00042             for (x = 0; x < nx; x++) {
00043 
00044                 G3d_getBlock(map, x * tileX, y * tileY, z * tileZ,
00045                              tileX, tileY, tileZ, data, typeIntern);
00046                 if (!G3d_writeTile
00047                     (map2, G3d_tile2tileIndex(map2, x, y, z), data,
00048                      typeIntern))
00049                     G3d_fatalError
00050                         ("G3d_retileNocache: error in G3d_writeTile");
00051             }
00052 
00053     G3d_freeTiles(data);
00054     G3d_closeCell(map2);
00055 }
00056 
00057 /*---------------------------------------------------------------------------*/
00058 
00059 
00075 void
00076 G3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
00077 {
00078     void *map2;
00079     double value;
00080     int x, y, z, saveType;
00081     int rows, cols, depths, typeIntern;
00082     int xTile, yTile, zTile;
00083     int xOffs, yOffs, zOffs, prev;
00084     int tileXsave, tileYsave, tileZsave;
00085     G3D_Region region;
00086 
00087     if (!G3d_tileUseCacheMap(map)) {
00088         retileNocache(map, nameOut, tileX, tileY, tileZ);
00089         return;
00090     }
00091 
00092     saveType = G3d_getFileType();
00093     G3d_setFileType(G3d_fileTypeMap(map));
00094     G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
00095     G3d_setTileDimension(tileX, tileY, tileZ);
00096 
00097     typeIntern = G3d_tileTypeMap(map);
00098     G3d_getRegionStructMap(map, &region);
00099 
00100     map2 =
00101         G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, &region);
00102     if (map2 == NULL)
00103         G3d_fatalError("G3d_retile: error in G3d_openCellNew");
00104 
00105     G3d_setFileType(saveType);
00106     G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
00107 
00108     G3d_coord2tileCoord(map2, 0, 0, 0,
00109                         &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs);
00110 
00111     prev = zTile;
00112 
00113     x = 0;
00114     y = 0;
00115 
00116     G3d_getCoordsMap(map, &rows, &cols, &depths);
00117 
00118     for (z = 0; z < depths; z++) {
00119         G3d_coord2tileCoord(map2, x, y, z, &xTile, &yTile, &zTile,
00120                             &xOffs, &yOffs, &zOffs);
00121         if (zTile > prev) {
00122             if (!G3d_flushAllTiles(map2))
00123                 G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
00124             prev++;
00125         }
00126 
00127         for (y = 0; y < rows; y++)
00128             for (x = 0; x < cols; x++) {
00129 
00130                 G3d_getValueRegion(map, x, y, z, &value, typeIntern);
00131                 if (!G3d_putValue(map2, x, y, z, &value, typeIntern))
00132                     G3d_fatalError("G3d_retile: error in G3d_putValue");
00133             }
00134     }
00135 
00136     if (!G3d_flushAllTiles(map2))
00137         G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
00138     if (!G3d_closeCell(map2))
00139         G3d_fatalError("G3d_retile: error in G3d_closeCell");
00140 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines