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");
void G_xdr_put_float(void *, const float *)
void G_xdr_put_double(void *, const double *)
int Rast3d_tile_type_map(RASTER3D_Map *)
Returns the type in which tiles of map are stored in memory.
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...
void Rast3d_autolock_on(RASTER3D_Map *)
Turns autolock mode on.
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_tile_dimensions_map(RASTER3D_Map *, int *, int *, int *)
Returns the tile dimensions used for map.
int Rast3d_unlock_all(RASTER3D_Map *)
Unlocks every tile in cache of map.
void Rast3d_min_unlocked(RASTER3D_Map *, int)
Sets the minimum number of unlocked tiles to minUnlocked. This function should be used in combination...
int Rast3d_is_null_value_num(const void *, int)
int Rast3d_tile_precision_map(RASTER3D_Map *)
Returns the precision used to store map.
void Rast3d_get_coords_map(RASTER3D_Map *, int *, int *, int *)
Returns the size of the region of map in cells.
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_use_cache_map(RASTER3D_Map *)
Returns 1 if map uses cache, returns 0 otherwise.
void Rast3d_print_header(RASTER3D_Map *)
Prints the header information of map.
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 ...
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...
void Rast3d_fatal_error(const char *,...) __attribute__((format(printf
int Rast3d_close(RASTER3D_Map *)
Close 3D raster map files.
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....
dglInt32_t sign(dglInt32_t x)
#define RASTER3D_DEFAULT_WINDOW
#define RASTER3D_USE_CACHE_DEFAULT
#define RASTER3D_TILE_SAME_AS_FILE