9 static unsigned char clearMask[9] =
10 { 255, 128, 192, 224, 240, 248, 252, 254, 255 };
14 static void Rast3d_float2xdrFloat(
const float *f,
float *xdrf)
21 static void Rast3d_double2xdrDouble(
const double *d,
double *xdrd)
28 static void Rast3d_truncFloat(
float *f,
int p)
32 if ((p == -1) || (p >= 23))
35 c = (
unsigned char *)f;
39 *c++ &= clearMask[(p + 1) % 8];
47 *c++ &= clearMask[(p + 1) % 8];
53 *c &= clearMask[(p + 1) % 8];
59 static void Rast3d_truncDouble(
double *d,
int p)
63 if ((p == -1) || (p >= 52))
66 c = (
unsigned char *)d;
70 *c++ &= clearMask[(p + 4) % 8];
82 *c++ &= clearMask[(p + 4) % 8];
93 *c++ &= clearMask[(p + 4) % 8];
103 *c++ &= clearMask[(p + 4) % 8];
112 *c++ &= clearMask[(p + 4) % 8];
120 *c++ &= clearMask[(p + 4) % 8];
126 *c &= clearMask[(p + 4) % 8];
132 static void Rast3d_float2Double(
float *f,
double *d)
134 unsigned char *c1, *c2,
sign, c;
137 c1 = (
unsigned char *)f;
138 c2 = (
unsigned char *)d;
140 sign = (*c1 & (
unsigned char)128);
141 e = (((*c1 & (
unsigned char)127) << 1) |
142 ((*(c1 + 1) & (
unsigned char)128) >> 7));
144 if ((*c1 != 0) || (*(c1 + 1) != 0) || (*(c1 + 2) != 0) ||
155 *c2++ |= ((*c1 & (
unsigned char)127) >> 3);
157 *c2 = ((*c1++ & (
unsigned char)7) << 5);
160 *c2 = ((*c1++ & (
unsigned char)7) << 5);
163 *c2++ = ((*c1 & (
unsigned char)7) << 5);
165 *c2++ = (
unsigned char)0;
166 *c2++ = (
unsigned char)0;
167 *c2 = (
unsigned char)0;
172 static int Rast3d_compareFloats(
float *f1,
int p1,
float *f2,
int p2)
174 unsigned char *c1, *c2;
180 Rast3d_float2xdrFloat(f1, &xdrf1);
181 Rast3d_float2xdrFloat(f2, &xdrf2);
183 c1 = (
unsigned char *)&xdrf1;
184 c2 = (
unsigned char *)&xdrf2;
188 if ((p1 != -1) && (p1 < 23) && ((p1 < p2) || (p2 == -1)))
189 Rast3d_truncFloat(&xdrf2, p1);
190 if ((p2 != -1) && (p2 < 23) && ((p2 < p1) || (p1 == -1)))
191 Rast3d_truncFloat(&xdrf1, p2);
195 return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
196 (*(c1 + 2) == *(c2 + 2))
197 && (*(c1 + 3) == *(c2 + 3));
203 static int Rast3d_compareDoubles(
double *d1,
int p1,
double *d2,
int p2)
205 unsigned char *c1, *c2;
211 Rast3d_double2xdrDouble(d1, &xdrd1);
212 Rast3d_double2xdrDouble(d2, &xdrd2);
214 c1 = (
unsigned char *)&xdrd1;
215 c2 = (
unsigned char *)&xdrd2;
219 if ((p1 != -1) && (p1 < 52) && ((p1 < p2) || (p2 == -1)))
220 Rast3d_truncDouble(&xdrd2, p1);
221 if ((p2 != -1) && (p2 < 52) && ((p2 < p1) || (p1 == -1)))
222 Rast3d_truncDouble(&xdrd1, p2);
226 return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
227 (*(c1 + 2) == *(c2 + 2))
228 && (*(c1 + 3) == *(c2 + 3)) && (*(c1 + 4) == *(c2 + 4))
229 && (*(c1 + 5) == *(c2 + 5)) && (*(c1 + 6) == *(c2 + 6))
230 && (*(c1 + 7) == *(c2 + 7));
236 static int Rast3d_compareFloatDouble(
float *f,
int p1,
double *d,
int p2)
238 unsigned char *c1, *c2;
240 double xdrd, xdrd2, dTmp;
253 Rast3d_float2xdrFloat(f, &xdrf);
254 Rast3d_float2Double(&xdrf, &xdrd2);
255 Rast3d_double2xdrDouble(&dTmp, &xdrd);
257 c1 = (
unsigned char *)&xdrd2;
258 c2 = (
unsigned char *)&xdrd;
263 if (((p1 != -1) && ((p1 < p2) || (p2 == -1))) ||
264 ((p1 == -1) && ((p2 > 23) || (p2 == -1))))
265 Rast3d_truncDouble(&xdrd, (p1 != -1 ? p1 : 23));
266 if ((p2 != -1) && (p2 < 23) && ((p2 < p1) || (p1 == -1)))
267 Rast3d_truncDouble(&xdrd2, p2);
271 return (*c1 == *c2) && (*(c1 + 1) == *(c2 + 1)) &&
272 (*(c1 + 2) == *(c2 + 2))
273 && (*(c1 + 3) == *(c2 + 3)) && (*(c1 + 4) == *(c2 + 4))
274 && (*(c1 + 5) == *(c2 + 5)) && (*(c1 + 6) == *(c2 + 6))
275 && (*(c1 + 7) == *(c2 + 7));
280 static void compareFilesNocache(
void *map,
void *map2)
282 double n1 = 0, n2 = 0;
285 int x, y, z, correct;
287 int tileX, tileY, tileZ, typeIntern, typeIntern2;
303 for (z = 0; z < nz * tileZ; z++) {
304 printf(
"comparing: z = %d\n", z);
306 for (y = 0; y < ny * tileY; y++) {
307 for (x = 0; x < nx * tileX; x++) {
314 correct = Rast3d_compareFloats(f1p, p1, f2p, p2);
316 correct = Rast3d_compareFloatDouble(f1p, p1, n2p, p2);
320 correct = Rast3d_compareFloatDouble(f2p, p2, n1p, p1);
322 correct = Rast3d_compareDoubles(n1p, p1, n2p, p2);
326 int xTile, yTile, zTile, xOffs, yOffs, zOffs;
329 &xOffs, &yOffs, &zOffs);
330 printf(
"(%d %d %d) (%d %d %d) (%d %d %d) %.20f %.20f\n",
331 x, y, z, xTile, yTile, zTile, xOffs, yOffs, zOffs,
334 (
"compareFilesNocache: files don't match\n");
340 printf(
"Files are identical up to precision.\n");
368 double n1 = 0, n2 = 0;
371 int x, y, z, correct;
373 int rows, cols, depths;
374 int tileX, tileY, tileZ, typeIntern, typeIntern2, tileX2, tileY2, tileZ2;
377 printf(
"\nComparing %s and %s\n", f1, f2);
405 compareFilesNocache(map, map2);
424 for (z = 0; z < depths; z++) {
425 printf(
"comparing: z = %d\n", z);
427 if ((z % tileZ) == 0) {
431 if ((z % tileZ2) == 0) {
436 for (y = 0; y < rows; y++) {
437 for (x = 0; x < cols; x++) {
446 correct = Rast3d_compareFloats(f1p, p1, f2p, p2);
448 correct = Rast3d_compareFloatDouble(f1p, p1, n2p, p2);
452 correct = Rast3d_compareFloatDouble(f2p, p2, n1p, p1);
454 correct = Rast3d_compareDoubles(n1p, p1, n2p, p2);
458 int xTile, yTile, zTile, xOffs, yOffs, zOffs;
461 &xOffs, &yOffs, &zOffs);
468 printf(
"Files are identical up to precision.\n");
#define RASTER3D_USE_CACHE_DEFAULT
void * Rast3d_open_cell_old(const char *, const char *, RASTER3D_Region *, int, int)
Opens existing g3d-file name in mapset. Tiles are stored in memory with type which must be any of FCE...
void Rast3d_get_coords_map(RASTER3D_Map *, int *, int *, int *)
Returns the size of the region of map in cells.
void Rast3d_min_unlocked(RASTER3D_Map *, int)
Sets the minimum number of unlocked tiles to minUnlocked. This function should be used in combination...
void Rast3d_get_tile_dimensions_map(RASTER3D_Map *, int *, int *, int *)
Returns the tile dimensions used for map.
int Rast3d_tile_use_cache_map(RASTER3D_Map *)
Returns 1 if map uses cache, returns 0 otherwise.
#define RASTER3D_DEFAULT_WINDOW
int Rast3d_close(RASTER3D_Map *)
Close 3D raster map files.
void Rast3d_autolock_on(RASTER3D_Map *)
Turns autolock mode on.
void Rast3d_fatal_error(const char *,...) __attribute__((format(printf
void Rast3d_get_block(RASTER3D_Map *, int, int, int, int, int, int, void *, int)
Copies the cells contained in the block (cube) with vertices (x0, y0, z0) and (x0 + nx - 1...
int Rast3d_tile_precision_map(RASTER3D_Map *)
Returns the precision used to store map.
void G_xdr_put_double(void *, const double *)
void G_xdr_put_float(void *, const float *)
void Rast3d_get_value_region(RASTER3D_Map *, int, int, int, void *, int)
Returns in *value the cell-value of the cell with region-coordinate (x, y, z). The value returned is ...
#define RASTER3D_TILE_SAME_AS_FILE
void Rast3d_print_header(RASTER3D_Map *)
Prints the header information of map.
void Rast3d_coord2tile_coord(RASTER3D_Map *, int, int, int, int *, int *, int *, int *, int *, int *)
Converts cell-coordinates (x, y, z) into tile-coordinates (xTile, yTile, zTile) and the coordinate of...
int Rast3d_is_null_value_num(const void *, int)
void Rast3d_compare_files(const char *f1, const char *mapset1, const char *f2, const char *mapset2)
Compares the cell-values of file f1 in mapset mapset1 and file f2 in mapset mapset2. The values are compared up to precision. Terminates in error if the files don't match. This function uses the more advanced features of the cache. The source code can be found in filecompare.c.
dglInt32_t sign(dglInt32_t x)
int Rast3d_unlock_all(RASTER3D_Map *)
Unlocks every tile in cache of map.
void Rast3d_get_nof_tiles_map(RASTER3D_Map *, int *, int *, int *)
Returns the dimensions of the tile-cube used to tile the region of map. These numbers include partial...
int Rast3d_tile_type_map(RASTER3D_Map *)
Returns the type in which tiles of map are stored in memory.