#include #include #include #include #include /*---------------------------------------------------------------------------*/ /*! * \brief * * Makes a copy of map with name nameOut which is * written with precision. * The source code can be found in changeprecision.c. * * \param map * \param precision * \param nameOut * \return void */ void G3d_changePrecision (void *map, int precision, char *nameOut) { void *map2; int x, y, z, savePrecision, saveCompression, saveLzw, saveRle; char *data; G3D_Region region; int typeIntern; int nx, ny, nz; int tileXsave, tileYsave, tileZsave, tileX, tileY, tileZ, saveType; saveType = G3d_getFileType (); /* G3d_setFileType (G3d_fileTypeMap (map)); */ G3d_getCompressionMode (&saveCompression, &saveLzw, &saveRle, &savePrecision); G3d_setCompressionMode (G3D_COMPRESSION, saveLzw, saveRle, precision); G3d_getTileDimension (&tileXsave, &tileYsave, &tileZsave); G3d_getTileDimensionsMap (map, &tileX, &tileY, &tileZ); G3d_setTileDimension (tileX, tileY, tileZ); typeIntern = G3d_tileTypeMap (map); G3d_getRegionStructMap (map, ®ion); map2 = G3d_openCellNew (nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, ®ion); if (map2 == NULL) G3d_fatalError ("G3d_changePrecision: error in G3d_openCellNew"); G3d_setFileType (saveType); G3d_setCompressionMode (saveCompression, saveLzw, saveRle, savePrecision); G3d_setTileDimension (tileXsave, tileYsave, tileZsave); data = G3d_allocTiles (map, 1); if (data == NULL) G3d_fatalError ("G3d_changePrecision: error in G3d_allocTiles"); G3d_getNofTilesMap (map2, &nx, &ny, &nz); for (z = 0; z < nz; z++) for (y = 0; y < ny; y++) for (x = 0; x < nx; x++) { if (! G3d_readTile (map, G3d_tile2tileIndex (map, x, y, z), data, typeIntern)) G3d_fatalError ("G3d_changePrecision: error in G3d_readTile"); if (! G3d_writeTile (map2, G3d_tile2tileIndex (map2, x, y, z), data, typeIntern)) G3d_fatalError ("G3d_changePrecision: error in G3d_writeTile"); } G3d_freeTiles (data); if (! G3d_closeCell (map2)) G3d_fatalError ("G3d_changePrecision: error in G3d_closeCell"); }