From cf7d9dc7a444ce59f365a9cc00f65ffc8bf74ea7 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Tue, 27 Jun 2023 13:08:45 -0700 Subject: [PATCH] libsysprof-gtk: add pathological check for axis That way we don't give values back that will not make any sense. --- src/libsysprof-gtk/sysprof-axis-private.h | 18 ++++++++++++++---- src/libsysprof-gtk/sysprof-value-axis.c | 9 +++++++++ src/libsysprof-gtk/sysprof-xy-layer.c | 11 +++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/libsysprof-gtk/sysprof-axis-private.h b/src/libsysprof-gtk/sysprof-axis-private.h index 853fcda0..9c605318 100644 --- a/src/libsysprof-gtk/sysprof-axis-private.h +++ b/src/libsysprof-gtk/sysprof-axis-private.h @@ -34,10 +34,11 @@ struct _SysprofAxisClass { GObjectClass parent_class; - void (*get_min_value) (SysprofAxis *axis, - GValue *min_value); - double (*normalize) (SysprofAxis *axis, - const GValue *value); + void (*get_min_value) (SysprofAxis *axis, + GValue *min_value); + double (*normalize) (SysprofAxis *axis, + const GValue *value); + gboolean (*is_pathological) (SysprofAxis *axis); }; #define SYSPROF_AXIS_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS(obj, SYSPROF_TYPE_AXIS, SysprofAxisClass) @@ -56,6 +57,15 @@ _sysprof_axis_normalize (SysprofAxis *axis, return SYSPROF_AXIS_GET_CLASS (axis)->normalize (axis, value); } +static inline double +_sysprof_axis_is_pathological (SysprofAxis *axis) +{ + if (SYSPROF_AXIS_GET_CLASS (axis)->is_pathological) + return SYSPROF_AXIS_GET_CLASS (axis)->is_pathological (axis); + + return FALSE; +} + void _sysprof_axis_emit_range_changed (SysprofAxis *self); G_END_DECLS diff --git a/src/libsysprof-gtk/sysprof-value-axis.c b/src/libsysprof-gtk/sysprof-value-axis.c index 2e5bba54..0f054802 100644 --- a/src/libsysprof-gtk/sysprof-value-axis.c +++ b/src/libsysprof-gtk/sysprof-value-axis.c @@ -105,6 +105,14 @@ sysprof_value_axis_normalize (SysprofAxis *axis, return r; } +static gboolean +sysprof_value_axis_is_pathological (SysprofAxis *axis) +{ + SysprofValueAxis *self = SYSPROF_VALUE_AXIS (axis); + + return self->min_value == self->max_value; +} + static void sysprof_value_axis_get_property (GObject *object, guint prop_id, @@ -162,6 +170,7 @@ sysprof_value_axis_class_init (SysprofValueAxisClass *klass) axis_class->get_min_value = sysprof_value_axis_real_get_min_value; axis_class->normalize = sysprof_value_axis_normalize; + axis_class->is_pathological = sysprof_value_axis_is_pathological; properties[PROP_MIN_VALUE] = g_param_spec_double ("min-value", NULL, NULL, diff --git a/src/libsysprof-gtk/sysprof-xy-layer.c b/src/libsysprof-gtk/sysprof-xy-layer.c index 28d84980..7c6bb7dc 100644 --- a/src/libsysprof-gtk/sysprof-xy-layer.c +++ b/src/libsysprof-gtk/sysprof-xy-layer.c @@ -20,6 +20,7 @@ #include "config.h" +#include "sysprof-axis-private.h" #include "sysprof-xy-layer-private.h" enum { @@ -192,6 +193,16 @@ _sysprof_xy_layer_get_xy (SysprofXYLayer *self, g_return_if_fail (y_values != NULL); g_return_if_fail (n_values != NULL); + if (self->x_axis == NULL || _sysprof_axis_is_pathological (self->x_axis) || + self->y_axis == NULL || _sysprof_axis_is_pathological (self->y_axis)) + { + *n_values = 0; + *x_values = NULL; + *y_values = NULL; + + return; + } + *x_values = sysprof_normalized_series_get_values (self->normal_x, &n_x_values); *y_values = sysprof_normalized_series_get_values (self->normal_y, &n_y_values); *n_values = MIN (n_x_values, n_y_values);