static inline int box2df_from_gbox_p(GBOX *box, BOX2DF *a) { a->xmin = next_float_down(box->xmin); a->xmax = next_float_up(box->xmax); a->ymin = next_float_down(box->ymin); a->ymax = next_float_up(box->ymax); return LW_SUCCESS; }
int gbox_same_2d_float(const GBOX *g1, const GBOX *g2) { if ((g1->xmax == g2->xmax || next_float_up(g1->xmax) == next_float_up(g2->xmax)) && (g1->ymax == g2->ymax || next_float_up(g1->ymax) == next_float_up(g2->ymax)) && (g1->xmin == g2->xmin || next_float_down(g1->xmin) == next_float_down(g1->xmin)) && (g1->ymin == g2->ymin || next_float_down(g2->ymin) == next_float_down(g2->ymin))) return LW_TRUE; return LW_FALSE; }
/* Convert a double-based GBOX into a float-based GIDX, ensuring the float box is larger than the double box */ static int gidx_from_gbox_p(GBOX box, GIDX *a) { int ndims; ndims = FLAGS_NDIMS_GIDX(box.flags); SET_VARSIZE(a, VARHDRSZ + ndims * 2 * sizeof(float)); GIDX_SET_MIN(a,0,next_float_down(box.xmin)); GIDX_SET_MAX(a,0,next_float_up(box.xmax)); GIDX_SET_MIN(a,1,next_float_down(box.ymin)); GIDX_SET_MAX(a,1,next_float_up(box.ymax)); /* Geodetic indexes are always 3d, geocentric x/y/z */ if ( FLAGS_GET_GEODETIC(box.flags) ) { GIDX_SET_MIN(a,2,next_float_down(box.zmin)); GIDX_SET_MAX(a,2,next_float_up(box.zmax)); } else { /* Cartesian with Z implies Z is third dimension */ if ( FLAGS_GET_Z(box.flags) ) { GIDX_SET_MIN(a,2,next_float_down(box.zmin)); GIDX_SET_MAX(a,2,next_float_up(box.zmax)); } /* M is always fourth dimension, we pad if needed */ if ( FLAGS_GET_M(box.flags) ) { if ( ! FLAGS_GET_Z(box.flags) ) { GIDX_SET_MIN(a,2,-1*FLT_MAX); GIDX_SET_MAX(a,2,FLT_MAX); } GIDX_SET_MIN(a,3,next_float_down(box.mmin)); GIDX_SET_MAX(a,3,next_float_up(box.mmax)); } } POSTGIS_DEBUGF(5, "converted %s to %s", gbox_to_string(&box), gidx_to_string(a)); return LW_SUCCESS; }
void gbox_float_round(GBOX *gbox) { gbox->xmin = next_float_down(gbox->xmin); gbox->xmax = next_float_up(gbox->xmax); gbox->ymin = next_float_down(gbox->ymin); gbox->ymax = next_float_up(gbox->ymax); if ( FLAGS_GET_M(gbox->flags) ) { gbox->mmin = next_float_down(gbox->mmin); gbox->mmax = next_float_up(gbox->mmax); } if ( FLAGS_GET_Z(gbox->flags) ) { gbox->zmin = next_float_down(gbox->zmin); gbox->zmax = next_float_up(gbox->zmax); } }
static size_t gserialized_from_gbox(const GBOX *gbox, uint8_t *buf) { uint8_t *loc = buf; float f; size_t return_size; assert(buf); f = next_float_down(gbox->xmin); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_up(gbox->xmax); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_down(gbox->ymin); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_up(gbox->ymax); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); if ( FLAGS_GET_GEODETIC(gbox->flags) ) { f = next_float_down(gbox->zmin); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_up(gbox->zmax); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); return_size = (size_t)(loc - buf); LWDEBUGF(4, "returning size %d", return_size); return return_size; } if ( FLAGS_GET_Z(gbox->flags) ) { f = next_float_down(gbox->zmin); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_up(gbox->zmax); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); } if ( FLAGS_GET_M(gbox->flags) ) { f = next_float_down(gbox->mmin); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); f = next_float_up(gbox->mmax); memcpy(loc, &f, sizeof(float)); loc += sizeof(float); } return_size = (size_t)(loc - buf); LWDEBUGF(4, "returning size %d", return_size); return return_size; }