diff --git a/src/libsysprof-gtk/sysprof-column-layer.c b/src/libsysprof-gtk/sysprof-column-layer.c index d7436f9e..4d7b2f32 100644 --- a/src/libsysprof-gtk/sysprof-column-layer.c +++ b/src/libsysprof-gtk/sysprof-column-layer.c @@ -53,7 +53,6 @@ sysprof_column_layer_snapshot (GtkWidget *widget, GtkSnapshot *snapshot) { SysprofColumnLayer *self = (SysprofColumnLayer *)widget; - graphene_matrix_t flip_y; const float *x_values; const float *y_values; const GdkRGBA *color; @@ -79,8 +78,13 @@ sysprof_column_layer_snapshot (GtkWidget *widget, gtk_snapshot_save (snapshot); - graphene_matrix_init_from_2d (&flip_y, 1, 0, 0, -1, 0, height); - gtk_snapshot_transform_matrix (snapshot, &flip_y); + if (!sysprof_xy_layer_get_flip_y (SYSPROF_XY_LAYER (self))) + { + graphene_matrix_t flip_y; + + graphene_matrix_init_from_2d (&flip_y, 1, 0, 0, -1, 0, height); + gtk_snapshot_transform_matrix (snapshot, &flip_y); + } for (guint i = 0; i < n_values; i++) { @@ -106,6 +110,8 @@ sysprof_column_layer_get_index_at_coord (SysprofColumnLayer *self, graphene_point_t point; const float *x_values; const float *y_values; + gboolean flip_y; + guint best = GTK_INVALID_LIST_POSITION; guint n_values; int width; int height; @@ -114,6 +120,7 @@ sysprof_column_layer_get_index_at_coord (SysprofColumnLayer *self, width = gtk_widget_get_width (GTK_WIDGET (self)); height = gtk_widget_get_height (GTK_WIDGET (self)); + flip_y = sysprof_xy_layer_get_flip_y (SYSPROF_XY_LAYER (self)); _sysprof_xy_layer_get_xy (SYSPROF_XY_LAYER (self), &x_values, &y_values, &n_values); @@ -124,7 +131,18 @@ sysprof_column_layer_get_index_at_coord (SysprofColumnLayer *self, for (guint i = 0; i < n_values; i++) { - graphene_rect_t rect = GRAPHENE_RECT_INIT (x_values[i]*width, height, 1, -(y_values[i]*height)); + graphene_rect_t rect; + + if (flip_y) + rect = GRAPHENE_RECT_INIT (x_values[i]*width, + 0, + 1, + y_values[i]*height); + else + rect = GRAPHENE_RECT_INIT (x_values[i]*width, + height - y_values[i]*height, + 1, + y_values[i]*height); if (graphene_rect_contains_point (&rect, &point)) { @@ -133,9 +151,18 @@ sysprof_column_layer_get_index_at_coord (SysprofColumnLayer *self, return i; } + + if (rect.origin.x <= x && + rect.origin.x + rect.size.width >= x) + { + if (area != NULL) + *area = rect; + + best = i; + } } - return GTK_INVALID_LIST_POSITION; + return best; } static void diff --git a/src/libsysprof-gtk/sysprof-line-layer.c b/src/libsysprof-gtk/sysprof-line-layer.c index 2613c651..4c05edbf 100644 --- a/src/libsysprof-gtk/sysprof-line-layer.c +++ b/src/libsysprof-gtk/sysprof-line-layer.c @@ -38,7 +38,6 @@ struct _SysprofLineLayer guint color_set : 1; guint dashed : 1; guint fill : 1; - guint flip_y : 1; guint spline : 1; }; @@ -54,7 +53,6 @@ enum { PROP_COLOR, PROP_DASHED, PROP_FILL, - PROP_FLIP_Y, PROP_SPLINE, N_PROPS }; @@ -104,8 +102,7 @@ sysprof_line_layer_snapshot (GtkWidget *widget, cairo_set_line_width (cr, 1); - if (!self->flip_y) - cairo_set_matrix (cr, &(cairo_matrix_t) {1, 0, 0, -1, 0, height}); + cairo_set_matrix (cr, &(cairo_matrix_t) {1, 0, 0, -1, 0, height}); first_x = last_x = floor (x_values[0] * width); first_y = last_y = floor (y_values[0] * height); @@ -246,9 +243,6 @@ sysprof_line_layer_snapshot_motion (SysprofChartLayer *layer, graphene_rect_t area; cairo_t *cr; - if (self->flip_y) - best_y = height - best_y; - area = GRAPHENE_RECT_INIT (best_x - half_size, best_y - half_size, size, size); cr = gtk_snapshot_append_cairo (snapshot, &area); @@ -289,10 +283,6 @@ sysprof_line_layer_get_property (GObject *object, g_value_set_boolean (value, sysprof_line_layer_get_fill (self)); break; - case PROP_FLIP_Y: - g_value_set_boolean (value, sysprof_line_layer_get_flip_y (self)); - break; - case PROP_SPLINE: g_value_set_boolean (value, sysprof_line_layer_get_spline (self)); break; @@ -324,10 +314,6 @@ sysprof_line_layer_set_property (GObject *object, sysprof_line_layer_set_fill (self, g_value_get_boolean (value)); break; - case PROP_FLIP_Y: - sysprof_line_layer_set_flip_y (self, g_value_get_boolean (value)); - break; - case PROP_SPLINE: sysprof_line_layer_set_spline (self, g_value_get_boolean (value)); break; @@ -366,11 +352,6 @@ sysprof_line_layer_class_init (SysprofLineLayerClass *klass) FALSE, (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); - properties [PROP_FLIP_Y] = - g_param_spec_boolean ("flip-y", NULL, NULL, - FALSE, - (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); - properties [PROP_SPLINE] = g_param_spec_boolean ("spline", NULL, NULL, FALSE, @@ -461,30 +442,6 @@ sysprof_line_layer_set_fill (SysprofLineLayer *self, } } -gboolean -sysprof_line_layer_get_flip_y (SysprofLineLayer *self) -{ - g_return_val_if_fail (SYSPROF_IS_LINE_LAYER (self), FALSE); - - return self->flip_y; -} - -void -sysprof_line_layer_set_flip_y (SysprofLineLayer *self, - gboolean flip_y) -{ - g_return_if_fail (SYSPROF_IS_LINE_LAYER (self)); - - flip_y = !!flip_y; - - if (flip_y != self->flip_y) - { - self->flip_y = flip_y; - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FLIP_Y]); - gtk_widget_queue_draw (GTK_WIDGET (self)); - } -} - gboolean sysprof_line_layer_get_spline (SysprofLineLayer *self) { diff --git a/src/libsysprof-gtk/sysprof-xy-layer-private.h b/src/libsysprof-gtk/sysprof-xy-layer-private.h index ddaa9ded..d6458b70 100644 --- a/src/libsysprof-gtk/sysprof-xy-layer-private.h +++ b/src/libsysprof-gtk/sysprof-xy-layer-private.h @@ -37,6 +37,8 @@ struct _SysprofXYLayer SysprofNormalizedSeries *normal_x; SysprofNormalizedSeries *normal_y; + + guint flip_y : 1; }; struct _SysprofXYLayerClass diff --git a/src/libsysprof-gtk/sysprof-xy-layer.c b/src/libsysprof-gtk/sysprof-xy-layer.c index 7c6bb7dc..0c7c5a6a 100644 --- a/src/libsysprof-gtk/sysprof-xy-layer.c +++ b/src/libsysprof-gtk/sysprof-xy-layer.c @@ -25,11 +25,12 @@ enum { PROP_0, + PROP_FLIP_Y, + PROP_NORMALIZED_X, + PROP_NORMALIZED_Y, PROP_SERIES, PROP_X_AXIS, PROP_Y_AXIS, - PROP_NORMALIZED_X, - PROP_NORMALIZED_Y, N_PROPS }; @@ -84,6 +85,10 @@ sysprof_xy_layer_get_property (GObject *object, g_value_set_object (value, self->normal_y); break; + case PROP_FLIP_Y: + g_value_set_boolean (value, sysprof_xy_layer_get_flip_y (self)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -111,6 +116,10 @@ sysprof_xy_layer_set_property (GObject *object, sysprof_xy_layer_set_y_axis (self, g_value_get_object (value)); break; + case PROP_FLIP_Y: + sysprof_xy_layer_set_flip_y (self, g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -150,6 +159,11 @@ sysprof_xy_layer_class_init (SysprofXYLayerClass *klass) SYSPROF_TYPE_NORMALIZED_SERIES, (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + properties [PROP_FLIP_Y] = + g_param_spec_boolean ("flip-y", NULL, NULL, + FALSE, + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_properties (object_class, N_PROPS, properties); } @@ -295,3 +309,28 @@ sysprof_xy_layer_set_y_axis (SysprofXYLayer *self, sysprof_normalized_series_set_axis (self->normal_y, y_axis); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_Y_AXIS]); } + +gboolean +sysprof_xy_layer_get_flip_y (SysprofXYLayer *self) +{ + g_return_val_if_fail (SYSPROF_IS_XY_LAYER (self), FALSE); + + return self->flip_y; +} + +void +sysprof_xy_layer_set_flip_y (SysprofXYLayer *self, + gboolean flip_y) +{ + g_return_if_fail (SYSPROF_IS_XY_LAYER (self)); + + flip_y = !!flip_y; + + if (flip_y != self->flip_y) + { + self->flip_y = flip_y; + sysprof_normalized_series_set_inverted (self->normal_y, flip_y); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FLIP_Y]); + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} diff --git a/src/libsysprof-gtk/sysprof-xy-layer.h b/src/libsysprof-gtk/sysprof-xy-layer.h index be4fc869..330ce50c 100644 --- a/src/libsysprof-gtk/sysprof-xy-layer.h +++ b/src/libsysprof-gtk/sysprof-xy-layer.h @@ -36,6 +36,11 @@ G_DECLARE_FINAL_TYPE (SysprofXYLayer, sysprof_xy_layer, SYSPROF, XY_LAYER, Syspr SYSPROF_AVAILABLE_IN_ALL SysprofChartLayer *sysprof_xy_layer_new (void); SYSPROF_AVAILABLE_IN_ALL +gboolean sysprof_xy_layer_get_flip_y (SysprofXYLayer *self); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_xy_layer_set_flip_y (SysprofXYLayer *self, + gboolean flip_y); +SYSPROF_AVAILABLE_IN_ALL SysprofXYSeries *sysprof_xy_layer_get_series (SysprofXYLayer *self); SYSPROF_AVAILABLE_IN_ALL void sysprof_xy_layer_set_series (SysprofXYLayer *self,