retile.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <grass/G3d.h>
  6. /*---------------------------------------------------------------------------*/
  7. static void
  8. retileNocache(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
  9. {
  10. void *map2;
  11. int x, y, z, saveType, nx, ny, nz;
  12. int typeIntern;
  13. void *data;
  14. int tileXsave, tileYsave, tileZsave;
  15. G3D_Region region;
  16. saveType = G3d_getFileType();
  17. G3d_setFileType(G3d_fileTypeMap(map));
  18. G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
  19. G3d_setTileDimension(tileX, tileY, tileZ);
  20. typeIntern = G3d_tileTypeMap(map);
  21. G3d_getRegionStructMap(map, &region);
  22. map2 = G3d_openCellNew(nameOut, typeIntern, G3D_NO_CACHE, &region);
  23. if (map2 == NULL)
  24. G3d_fatalError("G3d_retile: error in G3d_openCellNew");
  25. G3d_setFileType(saveType);
  26. G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
  27. data = G3d_allocTiles(map2, 1);
  28. if (data == NULL)
  29. G3d_fatalError("G3d_retile: error in G3d_allocTiles");
  30. G3d_getNofTilesMap(map2, &nx, &ny, &nz);
  31. for (z = 0; z < nz; z++)
  32. for (y = 0; y < ny; y++)
  33. for (x = 0; x < nx; x++) {
  34. G3d_getBlock(map, x * tileX, y * tileY, z * tileZ,
  35. tileX, tileY, tileZ, data, typeIntern);
  36. if (!G3d_writeTile
  37. (map2, G3d_tile2tileIndex(map2, x, y, z), data,
  38. typeIntern))
  39. G3d_fatalError
  40. ("G3d_retileNocache: error in G3d_writeTile");
  41. }
  42. G3d_freeTiles(data);
  43. G3d_closeCell(map2);
  44. }
  45. /*---------------------------------------------------------------------------*/
  46. /*!
  47. * \brief
  48. *
  49. * Makes a copy of <em>map</em> with name <em>nameOut</em> which has
  50. * tile dimensions <em>tileX</em>, <em>tileY</em>, <em>tileZ</em>.
  51. * The source code can be found in <em>retile.c</em>.
  52. *
  53. * \param map
  54. * \param nameOut
  55. * \param tileX
  56. * \param tileY
  57. * \param tileZ
  58. * \return void
  59. */
  60. void
  61. G3d_retile(void *map, const char *nameOut, int tileX, int tileY, int tileZ)
  62. {
  63. void *map2;
  64. double value;
  65. int x, y, z, saveType;
  66. int rows, cols, depths, typeIntern;
  67. int xTile, yTile, zTile;
  68. int xOffs, yOffs, zOffs, prev;
  69. int tileXsave, tileYsave, tileZsave;
  70. G3D_Region region;
  71. if (!G3d_tileUseCacheMap(map)) {
  72. retileNocache(map, nameOut, tileX, tileY, tileZ);
  73. return;
  74. }
  75. saveType = G3d_getFileType();
  76. G3d_setFileType(G3d_fileTypeMap(map));
  77. G3d_getTileDimension(&tileXsave, &tileYsave, &tileZsave);
  78. G3d_setTileDimension(tileX, tileY, tileZ);
  79. typeIntern = G3d_tileTypeMap(map);
  80. G3d_getRegionStructMap(map, &region);
  81. map2 =
  82. G3d_openCellNew(nameOut, typeIntern, G3D_USE_CACHE_DEFAULT, &region);
  83. if (map2 == NULL)
  84. G3d_fatalError("G3d_retile: error in G3d_openCellNew");
  85. G3d_setFileType(saveType);
  86. G3d_setTileDimension(tileXsave, tileYsave, tileZsave);
  87. G3d_coord2tileCoord(map2, 0, 0, 0,
  88. &xTile, &yTile, &zTile, &xOffs, &yOffs, &zOffs);
  89. prev = zTile;
  90. x = 0;
  91. y = 0;
  92. G3d_getCoordsMap(map, &rows, &cols, &depths);
  93. for (z = 0; z < depths; z++) {
  94. G3d_coord2tileCoord(map2, x, y, z, &xTile, &yTile, &zTile,
  95. &xOffs, &yOffs, &zOffs);
  96. if (zTile > prev) {
  97. if (!G3d_flushAllTiles(map2))
  98. G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
  99. prev++;
  100. }
  101. for (y = 0; y < rows; y++)
  102. for (x = 0; x < cols; x++) {
  103. G3d_getValueRegion(map, x, y, z, &value, typeIntern);
  104. if (!G3d_putValue(map2, x, y, z, &value, typeIntern))
  105. G3d_fatalError("G3d_retile: error in G3d_putValue");
  106. }
  107. }
  108. if (!G3d_flushAllTiles(map2))
  109. G3d_fatalError("G3d_retile: error in G3d_flushAllTiles");
  110. if (!G3d_closeCell(map2))
  111. G3d_fatalError("G3d_retile: error in G3d_closeCell");
  112. }