gint64 rg_table_get_end_time (RgTable *self) { RgTableIter iter; g_return_val_if_fail (RG_IS_TABLE (self), 0); if (rg_table_get_iter_last (self, &iter)) return rg_table_iter_get_timestamp (&iter); return g_get_monotonic_time (); }
static void rg_graph_ensure_surface (RgGraph *self) { RgGraphPrivate *priv = rg_graph_get_instance_private (self); GtkAllocation alloc; RgTableIter iter; gint64 begin_time; gint64 end_time; gdouble y_begin; gdouble y_end; cairo_t *cr; gsize i; g_assert (RG_IS_GRAPH (self)); gtk_widget_get_allocation (GTK_WIDGET (self), &alloc); if (priv->surface == NULL) { priv->surface_dirty = TRUE; priv->surface = gdk_window_create_similar_surface (gtk_widget_get_window (GTK_WIDGET (self)), CAIRO_CONTENT_COLOR_ALPHA, alloc.width, alloc.height); } if (priv->table == NULL) return; if (priv->surface_dirty) { priv->surface_dirty = FALSE; cr = cairo_create (priv->surface); cairo_save (cr); cairo_rectangle (cr, 0, 0, alloc.width, alloc.height); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_fill (cr); cairo_restore (cr); g_object_get (priv->table, "value-min", &y_begin, "value-max", &y_end, NULL); rg_table_get_iter_last (priv->table, &iter); end_time = rg_table_iter_get_timestamp (&iter); begin_time = end_time - rg_table_get_timespan (priv->table); for (i = 0; i < priv->renderers->len; i++) { RgRenderer *renderer; renderer = g_ptr_array_index (priv->renderers, i); cairo_save (cr); rg_renderer_render (renderer, priv->table, begin_time, end_time, y_begin, y_end, cr, &alloc); cairo_restore (cr); } cairo_destroy (cr); priv->x_offset = 0; } if (priv->tick_handler == 0) priv->tick_handler = gtk_widget_add_tick_callback (GTK_WIDGET (self), rg_graph_tick_cb, self, NULL); }