libsysprof-gtk: add pathological check for axis

That way we don't give values back that will not make any sense.
This commit is contained in:
Christian Hergert
2023-06-27 13:08:45 -07:00
parent f803b5ea3d
commit cf7d9dc7a4
3 changed files with 34 additions and 4 deletions

View File

@ -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

View File

@ -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,

View File

@ -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);