+
+ cairo_restore (cr);
+}
+
+static void
+_compute_axis_ranges (acre_t *acre)
+{
+ unsigned int d, i;
+ acre_data_t *data;
+
+ for (d = 0; d < acre->num_data; d++) {
+ data = acre->data[d];
+ for (i = 0; i < data->num_points; i++) {
+ if (data->points[i].x < acre->x_axis.min)
+ acre->x_axis.min = data->points[i].x;
+ if (data->points[i].x > acre->x_axis.max)
+ acre->x_axis.max = data->points[i].x;
+
+ if (data->points[i].y < acre->y_axis.min)
+ acre->y_axis.min = data->points[i].y;
+ if (data->points[i].y > acre->y_axis.max)
+ acre->y_axis.max = data->points[i].y;
+ }
+ }
+}
+
+static void
+_draw_data (acre_t *acre)
+{
+ cairo_t *cr = acre->cr;
+ unsigned int d, i;
+ acre_data_t *data;
+
+ cairo_save (cr);
+
+ cairo_set_source_rgb (cr, 0, 0, 0);
+
+ cairo_translate (cr,
+ acre->chart.x + 0.5,
+ acre->chart.y + acre->chart.height - 0.5);
+ cairo_scale (cr,
+ acre->chart.width / (acre->x_axis.max - acre->x_axis.min),
+ - acre->chart.height /(acre->y_axis.max - acre->y_axis.min));
+ cairo_translate (cr, -acre->x_axis.min, -acre->y_axis.min);
+
+ for (d = 0; d < acre->num_data; d++) {
+ data = acre->data[d];
+ cairo_new_path (cr);
+ for (i = 0; i < data->num_points; i++) {
+ cairo_line_to (cr,
+ data->points[i].x,
+ data->points[i].y);
+ }
+ cairo_save (cr);
+ {
+ cairo_identity_matrix (cr);
+ cairo_set_line_width (cr, 1.0);
+ cairo_stroke (cr);
+ }
+ cairo_restore (cr);
+ }
+
+ cairo_restore (cr);
+}
+
+static void
+_draw_frame_and_ticks (acre_t *acre)
+{
+ cairo_t *cr = acre->cr;
+
+ cairo_save (cr);
+
+ cairo_rectangle (cr,
+ acre->chart.x - 0.5, acre->chart.y - 0.5,
+ acre->chart.width + 1.0, acre->chart.height + 1.0);
+ cairo_set_line_width (cr, 1.0);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_stroke (cr);
+
+ cairo_restore (cr);