float x, y;
};
+struct ScreenPoint {
+ float x, y;
+};
+
G_DEFINE_TYPE_WITH_CODE(BVChart, bv_chart, GTK_TYPE_DRAWING_AREA,
G_ADD_PRIVATE(BVChart))
typedef void (*cairo_draw_func)(cairo_t *cr, double x, double y);
+static struct ScreenPoint to_screen(BVChartPrivate *priv,
+ GtkAllocation *allocation,
+ struct BVChartPoint *p) {
+ int margin = 3;
+ float xscale = (allocation->width - 2 * margin) / (priv->maxx - priv->minx);
+ float yscale = (allocation->height - 2 * margin) / (priv->miny - priv->maxy);
+ struct ScreenPoint screen_p = {
+ .x = xscale * (p->x - priv->minx) + margin,
+ .y = yscale * (p->y - priv->maxy) + margin,
+ };
+ return screen_p;
+}
+
static gboolean bv_chart_draw(GtkWidget *widget, cairo_t *cr) {
BVChart *chart = BV_CHART(widget);
BVChartPrivate *priv = bv_chart_get_instance_private(chart);
GtkAllocation allocation;
gtk_widget_get_allocation(widget, &allocation);
- int margin = 3;
- float xscale = (allocation.width - 2 * margin) / (priv->maxx - priv->minx);
- float yscale = (allocation.height - 2 * margin) / (priv->miny - priv->maxy);
cairo_set_source_rgb(cr, 0.0, 0.0, 1.0);
float gap_threshold = 3.0;
float prevx = 0.0;
&g_array_index(priv->points, struct BVChartPoint, i);
gboolean is_gap = p->x - prevx > gap_threshold;
cairo_draw_func f = is_gap ? cairo_move_to : cairo_line_to;
- float screen_x = xscale * (p->x - priv->minx) + margin;
- float screen_y = yscale * (p->y - priv->maxy) + margin;
- f(cr, screen_x, screen_y);
+ struct ScreenPoint screen_p = to_screen(priv, &allocation, p);
+ f(cr, screen_p.x, screen_p.y);
prevx = p->x;
}
cairo_stroke(cr);