From 19d6347ff36465760cb05ed74efd7d65e5c8040a Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 28 Jun 2023 12:50:49 -0700 Subject: [PATCH] libsysprof-gtk: add antialias option --- src/libsysprof-gtk/sysprof-line-layer.c | 45 +++++++++++++++++++++++++ src/libsysprof-gtk/sysprof-line-layer.h | 37 +++++++++++--------- src/libsysprof-gtk/tests/test-charts.ui | 1 + 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/libsysprof-gtk/sysprof-line-layer.c b/src/libsysprof-gtk/sysprof-line-layer.c index 4c05edbf..af820967 100644 --- a/src/libsysprof-gtk/sysprof-line-layer.c +++ b/src/libsysprof-gtk/sysprof-line-layer.c @@ -35,6 +35,7 @@ struct _SysprofLineLayer GdkRGBA color; + guint antialias : 1; guint color_set : 1; guint dashed : 1; guint fill : 1; @@ -50,6 +51,7 @@ G_DEFINE_FINAL_TYPE (SysprofLineLayer, sysprof_line_layer, SYSPROF_TYPE_XY_LAYER enum { PROP_0, + PROP_ANTIALIAS, PROP_COLOR, PROP_DASHED, PROP_FILL, @@ -100,6 +102,11 @@ sysprof_line_layer_snapshot (GtkWidget *widget, cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height)); + if (self->antialias) + cairo_set_antialias (cr, CAIRO_ANTIALIAS_GRAY); + else + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_set_line_width (cr, 1); cairo_set_matrix (cr, &(cairo_matrix_t) {1, 0, 0, -1, 0, height}); @@ -271,6 +278,10 @@ sysprof_line_layer_get_property (GObject *object, switch (prop_id) { + case PROP_ANTIALIAS: + g_value_set_boolean (value, sysprof_line_layer_get_antialias (self)); + break; + case PROP_COLOR: g_value_set_boxed (value, sysprof_line_layer_get_color (self)); break; @@ -302,6 +313,10 @@ sysprof_line_layer_set_property (GObject *object, switch (prop_id) { + case PROP_ANTIALIAS: + sysprof_line_layer_set_antialias (self, g_value_get_boolean (value)); + break; + case PROP_COLOR: sysprof_line_layer_set_color (self, g_value_get_boxed (value)); break; @@ -337,6 +352,11 @@ sysprof_line_layer_class_init (SysprofLineLayerClass *klass) chart_layer_class->snapshot_motion = sysprof_line_layer_snapshot_motion; + properties [PROP_ANTIALIAS] = + g_param_spec_boolean ("antialias", NULL, NULL, + TRUE, + (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); + properties[PROP_COLOR] = g_param_spec_boxed ("color", NULL, NULL, GDK_TYPE_RGBA, @@ -364,6 +384,7 @@ static void sysprof_line_layer_init (SysprofLineLayer *self) { self->color.alpha = 1; + self->antialias = TRUE; } const GdkRGBA * @@ -465,3 +486,27 @@ sysprof_line_layer_set_spline (SysprofLineLayer *self, gtk_widget_queue_draw (GTK_WIDGET (self)); } } + +gboolean +sysprof_line_layer_get_antialias (SysprofLineLayer *self) +{ + g_return_val_if_fail (SYSPROF_IS_LINE_LAYER (self), FALSE); + + return self->antialias; +} + +void +sysprof_line_layer_set_antialias (SysprofLineLayer *self, + gboolean antialias) +{ + g_return_if_fail (SYSPROF_IS_LINE_LAYER (self)); + + antialias = !!antialias; + + if (antialias != self->antialias) + { + self->antialias = antialias; + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ANTIALIAS]); + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} diff --git a/src/libsysprof-gtk/sysprof-line-layer.h b/src/libsysprof-gtk/sysprof-line-layer.h index 02eb3c84..8cd06d77 100644 --- a/src/libsysprof-gtk/sysprof-line-layer.h +++ b/src/libsysprof-gtk/sysprof-line-layer.h @@ -33,31 +33,36 @@ SYSPROF_AVAILABLE_IN_ALL G_DECLARE_FINAL_TYPE (SysprofLineLayer, sysprof_line_layer, SYSPROF, LINE_LAYER, SysprofXYLayer) SYSPROF_AVAILABLE_IN_ALL -SysprofChartLayer *sysprof_line_layer_new (void); +SysprofChartLayer *sysprof_line_layer_new (void); SYSPROF_AVAILABLE_IN_ALL -const GdkRGBA *sysprof_line_layer_get_color (SysprofLineLayer *self); +gboolean sysprof_line_layer_get_antialias (SysprofLineLayer *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_line_layer_set_color (SysprofLineLayer *self, - const GdkRGBA *color); +void sysprof_line_layer_set_antialias (SysprofLineLayer *self, + gboolean antialias); SYSPROF_AVAILABLE_IN_ALL -gboolean sysprof_line_layer_get_dashed (SysprofLineLayer *self); +const GdkRGBA *sysprof_line_layer_get_color (SysprofLineLayer *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_line_layer_set_dashed (SysprofLineLayer *self, - gboolean dashed); +void sysprof_line_layer_set_color (SysprofLineLayer *self, + const GdkRGBA *color); SYSPROF_AVAILABLE_IN_ALL -gboolean sysprof_line_layer_get_fill (SysprofLineLayer *self); +gboolean sysprof_line_layer_get_dashed (SysprofLineLayer *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_line_layer_set_fill (SysprofLineLayer *self, - gboolean fill); +void sysprof_line_layer_set_dashed (SysprofLineLayer *self, + gboolean dashed); SYSPROF_AVAILABLE_IN_ALL -gboolean sysprof_line_layer_get_flip_y (SysprofLineLayer *self); +gboolean sysprof_line_layer_get_fill (SysprofLineLayer *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_line_layer_set_flip_y (SysprofLineLayer *self, - gboolean flip_y); +void sysprof_line_layer_set_fill (SysprofLineLayer *self, + gboolean fill); SYSPROF_AVAILABLE_IN_ALL -gboolean sysprof_line_layer_get_spline (SysprofLineLayer *self); +gboolean sysprof_line_layer_get_flip_y (SysprofLineLayer *self); SYSPROF_AVAILABLE_IN_ALL -void sysprof_line_layer_set_spline (SysprofLineLayer *self, - gboolean spline); +void sysprof_line_layer_set_flip_y (SysprofLineLayer *self, + gboolean flip_y); +SYSPROF_AVAILABLE_IN_ALL +gboolean sysprof_line_layer_get_spline (SysprofLineLayer *self); +SYSPROF_AVAILABLE_IN_ALL +void sysprof_line_layer_set_spline (SysprofLineLayer *self, + gboolean spline); G_END_DECLS diff --git a/src/libsysprof-gtk/tests/test-charts.ui b/src/libsysprof-gtk/tests/test-charts.ui index fb4e5bd8..616da6d3 100644 --- a/src/libsysprof-gtk/tests/test-charts.ui +++ b/src/libsysprof-gtk/tests/test-charts.ui @@ -108,6 +108,7 @@ + false true true