From 0617266273ade741b4ed34648f5f7cb55741ddec Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 2 May 2024 22:05:03 +0000 Subject: [PATCH] Test using double's in IUP optimizatio code. Trying to resolve delta differences on MINGW 32bit. --- src/hb-subset-instancer-iup.cc | 46 +++++++++++++++++----------------- src/hb-subset-instancer-iup.hh | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/hb-subset-instancer-iup.cc b/src/hb-subset-instancer-iup.cc index 35a964d08..117f0fcde 100644 --- a/src/hb-subset-instancer-iup.cc +++ b/src/hb-subset-instancer-iup.cc @@ -38,7 +38,7 @@ static void _iup_contour_bound_forced_set (const hb_array_t x_deltas, const hb_array_t y_deltas, hb_set_t& forced_set, /* OUT */ - float tolerance = 0.f) + double tolerance = 0.0) { unsigned len = contour_points.length; unsigned next_i = 0; @@ -47,7 +47,7 @@ static void _iup_contour_bound_forced_set (const hb_array_t contour_points const contour_point_t& p1, const contour_point_t& p2, int p1_dx, int p2_dx, int p1_dy, int p2_dy, - hb_vector_t& interp_x_deltas, /* OUT */ - hb_vector_t& interp_y_deltas /* OUT */) + hb_vector_t& interp_x_deltas, /* OUT */ + hb_vector_t& interp_y_deltas /* OUT */) { unsigned n = contour_points.length; if (unlikely (!interp_x_deltas.resize (n, false) || @@ -190,8 +190,8 @@ static bool _iup_segment (const hb_array_t contour_points for (unsigned j = 0; j < 2; j++) { - float x1, x2, d1, d2; - float *out; + double x1, x2, d1, d2; + double *out; if (j == 0) { x1 = p1.x; @@ -230,11 +230,11 @@ static bool _iup_segment (const hb_array_t contour_points hb_swap (d1, d2); } - float scale = (d2 - d1) / (x2 - x1); + double scale = (d2 - d1) / (x2 - x1); for (unsigned i = 0; i < n; i++) { - float x = j == 0 ? contour_points.arrayZ[i].x : contour_points.arrayZ[i].y; - float d; + double x = j == 0 ? contour_points.arrayZ[i].x : contour_points.arrayZ[i].y; + double d; if (x <= x1) d = d1; else if (x >= x2) @@ -254,9 +254,9 @@ static bool _can_iup_in_between (const hb_array_t contour const contour_point_t& p1, const contour_point_t& p2, int p1_dx, int p2_dx, int p1_dy, int p2_dy, - float tolerance) + double tolerance) { - hb_vector_t interp_x_deltas, interp_y_deltas; + hb_vector_t interp_x_deltas, interp_y_deltas; if (!_iup_segment (contour_points, x_deltas, y_deltas, p1, p2, p1_dx, p2_dx, p1_dy, p2_dy, interp_x_deltas, interp_y_deltas)) @@ -266,10 +266,10 @@ static bool _can_iup_in_between (const hb_array_t contour for (unsigned i = 0; i < num; i++) { - float dx = x_deltas.arrayZ[i] - interp_x_deltas.arrayZ[i]; - float dy = y_deltas.arrayZ[i] - interp_y_deltas.arrayZ[i]; + double dx = x_deltas.arrayZ[i] - interp_x_deltas.arrayZ[i]; + double dy = y_deltas.arrayZ[i] - interp_y_deltas.arrayZ[i]; - if (sqrtf ((float)dx * dx + (float)dy * dy) > tolerance) + if (sqrt ((double)dx * dx + (double)dy * dy) > tolerance) return false; } return true; @@ -279,7 +279,7 @@ static bool _iup_contour_optimize_dp (const contour_point_vector_t& contour_poin const hb_vector_t& x_deltas, const hb_vector_t& y_deltas, const hb_set_t& forced_set, - float tolerance, + double tolerance, unsigned lookback, hb_vector_t& costs, /* OUT */ hb_vector_t& chain /* OUT */) @@ -333,7 +333,7 @@ static bool _iup_contour_optimize (const hb_array_t conto const hb_array_t x_deltas, const hb_array_t y_deltas, hb_array_t opt_indices, /* OUT */ - float tolerance = 0.f) + double tolerance = 0.0) { unsigned n = contour_points.length; if (opt_indices.length != n || @@ -346,7 +346,7 @@ static bool _iup_contour_optimize (const hb_array_t conto { int dx = x_deltas.arrayZ[i]; int dy = y_deltas.arrayZ[i]; - if (sqrtf ((float)dx * dx + (float)dy * dy) > tolerance) + if (sqrt ((double) dx * dx + (double) dy * dy) > tolerance) { all_within_tolerance = false; break; @@ -443,11 +443,11 @@ static bool _iup_contour_optimize (const hb_array_t conto unsigned contour_point_size = hb_static_size (contour_point_t); for (unsigned i = 0; i < n; i++) { - hb_memcpy ((void *) repeat_x_deltas.arrayZ, (const void *) x_deltas.arrayZ, n * sizeof (float)); - hb_memcpy ((void *) (repeat_x_deltas.arrayZ + n), (const void *) x_deltas.arrayZ, n * sizeof (float)); + hb_memcpy ((void *) repeat_x_deltas.arrayZ, (const void *) x_deltas.arrayZ, n * sizeof (int)); + hb_memcpy ((void *) (repeat_x_deltas.arrayZ + n), (const void *) x_deltas.arrayZ, n * sizeof (int)); - hb_memcpy ((void *) repeat_y_deltas.arrayZ, (const void *) y_deltas.arrayZ, n * sizeof (float)); - hb_memcpy ((void *) (repeat_y_deltas.arrayZ + n), (const void *) y_deltas.arrayZ, n * sizeof (float)); + hb_memcpy ((void *) repeat_y_deltas.arrayZ, (const void *) y_deltas.arrayZ, n * sizeof (int)); + hb_memcpy ((void *) (repeat_y_deltas.arrayZ + n), (const void *) y_deltas.arrayZ, n * sizeof (int)); hb_memcpy ((void *) repeat_points.arrayZ, (const void *) contour_points.arrayZ, n * contour_point_size); hb_memcpy ((void *) (repeat_points.arrayZ + n), (const void *) contour_points.arrayZ, n * contour_point_size); @@ -496,7 +496,7 @@ bool iup_delta_optimize (const contour_point_vector_t& contour_points, const hb_vector_t& x_deltas, const hb_vector_t& y_deltas, hb_vector_t& opt_indices, /* OUT */ - float tolerance) + double tolerance) { if (!opt_indices.resize (contour_points.length)) return false; diff --git a/src/hb-subset-instancer-iup.hh b/src/hb-subset-instancer-iup.hh index 7eac5935a..01987bd25 100644 --- a/src/hb-subset-instancer-iup.hh +++ b/src/hb-subset-instancer-iup.hh @@ -32,6 +32,6 @@ HB_INTERNAL bool iup_delta_optimize (const contour_point_vector_t& contour_point const hb_vector_t& x_deltas, const hb_vector_t& y_deltas, hb_vector_t& opt_indices, /* OUT */ - float tolerance = 0.f); + double tolerance = 0.0); #endif /* HB_SUBSET_INSTANCER_IUP_HH */