+const struct chart_colour data_colour[N_CHART_COLOURS] =
+ {
+ { 165, 42, 42 }, /* brown */
+ { 255, 0, 0 }, /* red */
+ { 255, 165, 0 }, /* orange */
+ { 255, 255, 0 }, /* yellow */
+ { 0, 255, 0 }, /* green */
+ { 0, 0, 255 }, /* blue */
+ { 238, 130, 238 }, /* violet */
+ { 190, 190, 190 }, /* grey */
+ { 255, 192, 203 }, /* pink */
+ };
+
+void
+chart_draw_marker (cairo_t *cr, double x, double y, enum marker_type marker,
+ double size)
+{
+ cairo_save (cr);
+ cairo_translate (cr, x, y);
+ cairo_scale (cr, size / 2.0, size / 2.0);
+ cairo_set_line_width (cr, cairo_get_line_width (cr) / (size / 2.0));
+ switch (marker)
+ {
+ case MARKER_CIRCLE:
+ cairo_arc (cr, 0, 0, 1.0, 0, 2 * M_PI);
+ cairo_stroke (cr);
+ break;
+
+ case MARKER_ASTERISK:
+ cairo_move_to (cr, 0, -1.0); /* | */
+ cairo_line_to (cr, 0, 1.0);
+ cairo_move_to (cr, -M_SQRT1_2, -M_SQRT1_2); /* / */
+ cairo_line_to (cr, M_SQRT1_2, M_SQRT1_2);
+ cairo_move_to (cr, -M_SQRT1_2, M_SQRT1_2); /* \ */
+ cairo_line_to (cr, M_SQRT1_2, -M_SQRT1_2);
+ cairo_stroke (cr);
+ break;
+
+ case MARKER_SQUARE:
+ cairo_rectangle (cr, -1.0, -1.0, 2.0, 2.0);
+ cairo_stroke (cr);
+ break;
+ }
+ cairo_restore (cr);
+}
+
+void
+chart_label (cairo_t *cr, int horz_justify, int vert_justify, double font_size,
+ const char *string)
+{
+ PangoFontDescription *desc;
+ PangoLayout *layout;
+ double x, y;
+
+ desc = pango_font_description_from_string ("sans serif");
+ if (desc == NULL)
+ {
+ cairo_new_path (cr);
+ return;
+ }
+ pango_font_description_set_absolute_size (desc, font_size * PANGO_SCALE);
+
+ cairo_save (cr);
+ cairo_get_current_point (cr, &x, &y);
+ cairo_translate (cr, x, y);
+ cairo_move_to (cr, 0, 0);
+ cairo_scale (cr, 1.0, -1.0);
+
+ layout = pango_cairo_create_layout (cr);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, string, -1);
+ if (horz_justify != 'l')
+ {
+ int width_pango;
+ double width;
+
+ pango_layout_get_size (layout, &width_pango, NULL);
+ width = (double) width_pango / PANGO_SCALE;
+ if (horz_justify == 'r')
+ cairo_rel_move_to (cr, -width, 0);
+ else
+ cairo_rel_move_to (cr, -width / 2.0, 0);
+ }
+ if (vert_justify == 'x')
+ {
+ int baseline_pango = pango_layout_get_baseline (layout);
+ double baseline = (double) baseline_pango / PANGO_SCALE;
+ cairo_rel_move_to (cr, 0, -baseline);
+ }
+ else if (vert_justify != 't')
+ {
+ int height_pango;
+ double height;
+
+ pango_layout_get_size (layout, NULL, &height_pango);
+ height = (double) height_pango / PANGO_SCALE;
+ if (vert_justify == 'b')
+ cairo_rel_move_to (cr, 0, -height);
+ else if (vert_justify == 'c')
+ cairo_rel_move_to (cr, 0, -height / 2.0);
+ }
+ pango_cairo_show_layout (cr, layout);
+ g_object_unref (layout);
+
+ cairo_restore (cr);