diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2024-01-16 14:44:12 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2024-01-30 14:29:25 +1000 |
commit | 72eca2db562e43c69b97f6b6f0aa99686c200499 (patch) | |
tree | 83d49279f998802f2d8cfbd37396366123125a02 | |
parent | f20eefbc5924c1d2d3da56fd3351668fc17beab9 (diff) |
util: add a helper to normalize an axis to [0.0, 1.0]
Like the input axis, a normalized range has min/max inclusive so we
cannot use the absinfo_range() helper which assumes the max is exclusive.
Reverts parts of 4effe6b1b9245c694cd3166db3c4bd1a0ef1c823
-rw-r--r-- | src/evdev-tablet.c | 15 | ||||
-rw-r--r-- | src/util-input-event.h | 12 | ||||
-rw-r--r-- | test/test-tablet.c | 5 | ||||
-rw-r--r-- | test/test-utils.c | 40 |
4 files changed, 58 insertions, 14 deletions
diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c index 8d722ad8..3b454f02 100644 --- a/src/evdev-tablet.c +++ b/src/evdev-tablet.c @@ -335,17 +335,13 @@ tablet_update_tool(struct tablet_dispatch *tablet, static inline double normalize_slider(const struct input_absinfo *absinfo) { - double value = (absinfo->value - absinfo->minimum) / absinfo_range(absinfo); - - return value * 2 - 1; + return absinfo_normalize(absinfo) * 2 - 1; } static inline double normalize_distance(const struct input_absinfo *absinfo) { - double value = (absinfo->value - absinfo->minimum) / absinfo_range(absinfo); - - return value; + return absinfo_normalize(absinfo); } static inline double @@ -363,11 +359,10 @@ normalize_pressure(const struct input_absinfo *absinfo, * The axis is scaled into the range [lower, max] so that the lower * threshold is 0 pressure. */ - int base = tool->pressure.threshold.lower; - double range = absinfo->maximum - base; - double value = (absinfo->value - base) / range; + struct input_absinfo abs = *absinfo; + abs.minimum = tool->pressure.threshold.lower; - return max(0.0, value); + return absinfo_normalize(&abs); } static inline double diff --git a/src/util-input-event.h b/src/util-input-event.h index 9d8d6a2a..c9b02ab8 100644 --- a/src/util-input-event.h +++ b/src/util-input-event.h @@ -72,3 +72,15 @@ absinfo_range(const struct input_absinfo *abs) { return (double)(abs->maximum - abs->minimum + 1); } + +static inline double +absinfo_normalize_value(const struct input_absinfo *abs, int value) +{ + return min(1.0, max(0.0, (double)(value - abs->minimum)/(abs->maximum - abs->minimum))); +} + +static inline double +absinfo_normalize(const struct input_absinfo *abs) +{ + return absinfo_normalize_value(abs, abs->value); +} diff --git a/test/test-tablet.c b/test/test-tablet.c index 15a8c648..7ebd5049 100644 --- a/test/test-tablet.c +++ b/test/test-tablet.c @@ -3464,8 +3464,6 @@ START_TEST(airbrush_slider) struct libinput_event_tablet_tool *tev; const struct input_absinfo *abs; double val; - double scale; - double expected; int v; if (!libevdev_has_event_code(dev->evdev, @@ -3488,8 +3486,8 @@ START_TEST(airbrush_slider) litest_drain_events(li); - scale = absinfo_range(abs); for (v = abs->minimum; v < abs->maximum; v += 8) { + double expected = absinfo_normalize_value(abs, v) * 2 - 1; litest_event(dev, EV_ABS, ABS_WHEEL, v); litest_event(dev, EV_SYN, SYN_REPORT, 0); libinput_dispatch(li); @@ -3499,7 +3497,6 @@ START_TEST(airbrush_slider) ck_assert(libinput_event_tablet_tool_slider_has_changed(tev)); val = libinput_event_tablet_tool_get_slider_position(tev); - expected = ((v - abs->minimum)/scale) * 2 - 1; ck_assert_double_eq(val, expected); ck_assert_double_ge(val, -1.0); ck_assert_double_le(val, 1.0); diff --git a/test/test-utils.c b/test/test-utils.c index fa307031..8ac0bd66 100644 --- a/test/test-utils.c +++ b/test/test-utils.c @@ -35,6 +35,7 @@ #include "util-bits.h" #include "util-ratelimit.h" #include "util-matrix.h" +#include "util-input-event.h" #define TEST_VERSIONSORT #include "libinput-versionsort.h" @@ -1582,6 +1583,43 @@ START_TEST(trunkname_test) } END_TEST +START_TEST(absinfo_normalize_value_test) +{ + struct input_absinfo abs = { + .minimum = 0, + .maximum = 100, + }; + + ck_assert_double_eq(absinfo_normalize_value(&abs, -100), 0.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, -1), 0.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 0), 0.0); + ck_assert_double_gt(absinfo_normalize_value(&abs, 1), 0.0); + ck_assert_double_lt(absinfo_normalize_value(&abs, 99), 1.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 100), 1.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 101), 1.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 200), 1.0); + + abs.minimum = -50; + abs.maximum = 50; + + ck_assert_double_eq(absinfo_normalize_value(&abs, -51), 0.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, -50), 0.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 0), 0.5); + ck_assert_double_eq(absinfo_normalize_value(&abs, 50), 1.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 51), 1.0); + + + abs.minimum = -50; + abs.maximum = 0; + + ck_assert_double_eq(absinfo_normalize_value(&abs, -51), 0.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, -50), 0.0); + ck_assert_double_gt(absinfo_normalize_value(&abs, -49), 0.0); + ck_assert_double_lt(absinfo_normalize_value(&abs, -1), 1.0); + ck_assert_double_eq(absinfo_normalize_value(&abs, 0), 1.0); +} +END_TEST + static Suite * litest_utils_suite(void) { @@ -1635,6 +1673,8 @@ litest_utils_suite(void) tcase_add_test(tc, trunkname_test); tcase_add_test(tc, basename_test); + tcase_add_test(tc, absinfo_normalize_value_test); + suite_add_tcase(s, tc); return s; |