mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
line-visualizer: teach draw code how to fill in lines
We don't expose this via API yet, but it's handy to have it here so we can build upon it for doing stacked drawings (as useful for things like memory usage graphs by type).
This commit is contained in:
@ -72,6 +72,7 @@ typedef struct
|
|||||||
GdkRGBA background;
|
GdkRGBA background;
|
||||||
GdkRGBA foreground;
|
GdkRGBA foreground;
|
||||||
guint use_default_style : 1;
|
guint use_default_style : 1;
|
||||||
|
guint fill : 1;
|
||||||
} LineInfo;
|
} LineInfo;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -139,12 +140,15 @@ sp_line_visualizer_row_draw (GtkWidget *widget,
|
|||||||
SpLineVisualizerRowPrivate *priv = sp_line_visualizer_row_get_instance_private (self);
|
SpLineVisualizerRowPrivate *priv = sp_line_visualizer_row_get_instance_private (self);
|
||||||
GtkStyleContext *style_context;
|
GtkStyleContext *style_context;
|
||||||
GtkStateFlags flags;
|
GtkStateFlags flags;
|
||||||
|
GtkAllocation alloc;
|
||||||
GdkRGBA foreground;
|
GdkRGBA foreground;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
g_assert (SP_IS_LINE_VISUALIZER_ROW (widget));
|
g_assert (SP_IS_LINE_VISUALIZER_ROW (widget));
|
||||||
g_assert (cr != NULL);
|
g_assert (cr != NULL);
|
||||||
|
|
||||||
|
gtk_widget_get_allocation (widget, &alloc);
|
||||||
|
|
||||||
ret = GTK_WIDGET_CLASS (sp_line_visualizer_row_parent_class)->draw (widget, cr);
|
ret = GTK_WIDGET_CLASS (sp_line_visualizer_row_parent_class)->draw (widget, cr);
|
||||||
|
|
||||||
if (priv->cache == NULL)
|
if (priv->cache == NULL)
|
||||||
@ -160,6 +164,7 @@ sp_line_visualizer_row_draw (GtkWidget *widget,
|
|||||||
const LineInfo *line_info = &g_array_index (priv->lines, LineInfo, line);
|
const LineInfo *line_info = &g_array_index (priv->lines, LineInfo, line);
|
||||||
const Point *fpoints;
|
const Point *fpoints;
|
||||||
guint n_fpoints = 0;
|
guint n_fpoints = 0;
|
||||||
|
GdkRGBA color;
|
||||||
|
|
||||||
fpoints = point_cache_get_points (priv->cache, line_info->id, &n_fpoints);
|
fpoints = point_cache_get_points (priv->cache, line_info->id, &n_fpoints);
|
||||||
|
|
||||||
@ -179,7 +184,15 @@ sp_line_visualizer_row_draw (GtkWidget *widget,
|
|||||||
last_x = points[0].x;
|
last_x = points[0].x;
|
||||||
last_y = points[0].y;
|
last_y = points[0].y;
|
||||||
|
|
||||||
cairo_move_to (cr, last_x, last_y);
|
if (line_info->fill)
|
||||||
|
{
|
||||||
|
cairo_move_to (cr, last_x, alloc.height);
|
||||||
|
cairo_line_to (cr, last_x, last_y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cairo_move_to (cr, last_x, last_y);
|
||||||
|
}
|
||||||
|
|
||||||
for (guint i = 1; i < n_fpoints; i++)
|
for (guint i = 1; i < n_fpoints; i++)
|
||||||
{
|
{
|
||||||
@ -194,14 +207,25 @@ sp_line_visualizer_row_draw (GtkWidget *widget,
|
|||||||
last_y = points[i].y;
|
last_y = points[i].y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (line_info->fill)
|
||||||
|
{
|
||||||
|
cairo_line_to (cr, last_x, alloc.height);
|
||||||
|
cairo_close_path (cr);
|
||||||
|
}
|
||||||
|
|
||||||
cairo_set_line_width (cr, line_info->line_width);
|
cairo_set_line_width (cr, line_info->line_width);
|
||||||
|
|
||||||
if (line_info->use_default_style)
|
if (line_info->use_default_style)
|
||||||
gdk_cairo_set_source_rgba (cr, &foreground);
|
color = foreground;
|
||||||
else
|
else
|
||||||
gdk_cairo_set_source_rgba (cr, &line_info->foreground);
|
color = line_info->foreground;
|
||||||
|
|
||||||
cairo_stroke (cr);
|
gdk_cairo_set_source_rgba (cr, &color);
|
||||||
|
|
||||||
|
if (line_info->fill)
|
||||||
|
cairo_fill (cr);
|
||||||
|
else
|
||||||
|
cairo_stroke (cr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user