commit 522d79db125cc8b0c1329eaf55bf1677df2de072 parent c4289066fc550eac32cf87fc8081c4b9dbfe687f Author: Christophe Coustet <christophe.coustet@meso-star.com> Date: Fri, 3 Feb 2023 15:59:24 +0100 Change in-range test to use Clipper2's method Diffstat:
| M | src/scpr_c.h | | | 16 | ++++++++++------ |
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/scpr_c.h b/src/scpr_c.h @@ -91,21 +91,25 @@ check_and_truncate_vertex (double pt[2]) { double scale = pow(10, PRECISION); + const int64_t MAX_COORD = INT64_MAX >> 2; + const int64_t MIN_COORD = -MAX_COORD; + const double max_coord_d = (double)MAX_COORD; + const double min_coord_d = (double)MIN_COORD; double tmp[2]; int64_t tmp2[2]; ASSERT(pt); + /* Check value is in-range like Clipper2Lib::ScalePath */ + if((pt[0] * scale < min_coord_d) || (pt[0] * scale > max_coord_d) + || (pt[1] * scale < min_coord_d) || (pt[1] * scale > max_coord_d)) + { + return RES_BAD_ARG; + } /* Truncate precision to ensure further consistency */ tmp2[0] = std::llround(pt[0] * scale); tmp2[1] = std::llround(pt[1] * scale); /* Store truncated vertex */ tmp[0] = (double)tmp2[0] / scale; tmp[1] = (double)tmp2[1] / scale; - if(fabs(tmp[0] - pt[0]) > scale) { - return RES_BAD_ARG; - } - if(fabs(tmp[1] - pt[1]) * scale > 1) { - return RES_BAD_ARG; - } d2_set(pt, tmp); return RES_OK; }