summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2024-01-16 14:44:12 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2024-01-30 14:29:25 +1000
commit72eca2db562e43c69b97f6b6f0aa99686c200499 (patch)
tree83d49279f998802f2d8cfbd37396366123125a02
parentf20eefbc5924c1d2d3da56fd3351668fc17beab9 (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.c15
-rw-r--r--src/util-input-event.h12
-rw-r--r--test/test-tablet.c5
-rw-r--r--test/test-utils.c40
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;