From 8f4c1fdd2b59b651574100aa9f1c3dbce119a612 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Sun, 25 Jan 2009 19:56:56 +1100 Subject: [PATCH] Split drawing of title and labels into its own function. This will make things much more clear as we now add functions for drawing the chart outline, the ticks, and the data itself. --- acre.c | 96 ++++++++++++++++++++++++++++++++++++---------------------- acre.h | 2 +- 2 files changed, 60 insertions(+), 38 deletions(-) diff --git a/acre.c b/acre.c index e7b4a0f..6e75ab7 100644 --- a/acre.c +++ b/acre.c @@ -44,6 +44,16 @@ struct _acre { acre_data_t **data; unsigned int data_size; unsigned int num_data; + + /* Data for drawing. */ + cairo_t *cr; + + /* Total size including labels. */ + int width; + int height; + + /* Position and size of chart alone. */ + PangoRectangle chart; }; /* Create a new, empty plot. */ @@ -131,26 +141,16 @@ acre_add_data (acre_t *acre, acre_data_t *data) #define ACRE_PAD (ACRE_FONT_SIZE) #define ACRE_TICK_SIZE 4 -/* Draw the plot to the given cairo context within a user-space - * rectangle from (0, 0) to (width, height). This size includes all - * space for extra-plot elements (such as the title, the axis labels, - * etc.) - */ -void -acre_draw (acre_t *acre, cairo_t *cr, double width, double height) +static void +_draw_title_and_labels (acre_t *acre) { + cairo_t *cr = acre->cr; PangoFontDescription *acre_font, *title_font; PangoLayout *title_layout, *x_axis_layout, *y_axis_layout; int title_width, title_height; int x_axis_width, x_axis_height; int y_axis_width, y_axis_height; - PangoRectangle chart, new_chart; - - cairo_save (cr); - - cairo_set_source_rgb (cr, 1, 1, 1); - - cairo_paint (cr); + PangoRectangle new_chart; acre_font = pango_font_description_new (); pango_font_description_set_family (acre_font, ACRE_FONT_FAMILY); @@ -181,14 +181,14 @@ acre_draw (acre_t *acre, cairo_t *cr, double width, double height) * are stable, (this requires iteration since we don't know what * to set their widths to in advance due to the wrapping of the * other elements). */ - chart.x = 0; - chart.y = 0; - chart.width = width; - chart.height = height; + acre->chart.x = 0; + acre->chart.y = 0; + acre->chart.width = acre->width; + acre->chart.height = acre->height; while (1) { - pango_layout_set_width (title_layout, chart.width * PANGO_SCALE); - pango_layout_set_width (x_axis_layout, chart.width * PANGO_SCALE); - pango_layout_set_width (y_axis_layout, chart.height * PANGO_SCALE); + pango_layout_set_width (title_layout, acre->chart.width * PANGO_SCALE); + pango_layout_set_width (x_axis_layout, acre->chart.width * PANGO_SCALE); + pango_layout_set_width (y_axis_layout, acre->chart.height * PANGO_SCALE); pango_layout_get_pixel_size (title_layout, &title_width, &title_height); pango_layout_get_pixel_size (x_axis_layout, &x_axis_width, &x_axis_height); @@ -196,46 +196,68 @@ acre_draw (acre_t *acre, cairo_t *cr, double width, double height) new_chart.x = ACRE_PAD + y_axis_height + ACRE_PAD + ACRE_FONT_SIZE; - new_chart.width = width - chart.x - ACRE_PAD; + new_chart.width = acre->width - acre->chart.x - ACRE_PAD; new_chart.y = ACRE_PAD + title_height + ACRE_PAD; - new_chart.height = height - chart.y - (ACRE_FONT_SIZE + ACRE_PAD + x_axis_height + ACRE_PAD); + new_chart.height = acre->height - acre->chart.y - (ACRE_FONT_SIZE + ACRE_PAD + x_axis_height + ACRE_PAD); - if (new_chart.x == chart.x && - new_chart.y == chart.y && - new_chart.width == chart.width && - new_chart.height == chart.height) + if (new_chart.x == acre->chart.x && + new_chart.y == acre->chart.y && + new_chart.width == acre->chart.width && + new_chart.height == acre->chart.height) { break; } - chart.x = new_chart.x; - chart.y = new_chart.y; - chart.width = new_chart.width; - chart.height = new_chart.height; + acre->chart.x = new_chart.x; + acre->chart.y = new_chart.y; + acre->chart.width = new_chart.width; + acre->chart.height = new_chart.height; } cairo_set_source_rgb (cr, 0, 0, 0); - cairo_move_to (cr, chart.x, ACRE_PAD); + cairo_move_to (cr, acre->chart.x, ACRE_PAD); pango_cairo_show_layout (cr, title_layout); cairo_save (cr); { - cairo_translate (cr, ACRE_PAD, chart.y + chart.height); + cairo_translate (cr, ACRE_PAD, acre->chart.y + acre->chart.height); cairo_rotate (cr, - M_PI / 2.0); cairo_move_to (cr, 0, 0); pango_cairo_show_layout (cr, y_axis_layout); } cairo_restore (cr); - cairo_move_to (cr, chart.x, - chart.y + chart.height + ACRE_FONT_SIZE + ACRE_PAD); + cairo_move_to (cr, acre->chart.x, + acre->chart.y + acre->chart.height + + ACRE_FONT_SIZE + ACRE_PAD); pango_cairo_show_layout (cr, x_axis_layout); +} + +/* Draw the plot to the given cairo context within a user-space + * rectangle from (0, 0) to (width, height). This size includes all + * space for extra-plot elements (such as the title, the axis labels, + * etc.) + */ +void +acre_draw (acre_t *acre, cairo_t *cr, int width, int height) +{ + acre->cr = cr; + acre->width = width; + acre->height = height; + + cairo_save (cr); + + cairo_set_source_rgb (cr, 1, 1, 1); + + cairo_paint (cr); + + _draw_title_and_labels (acre); cairo_rectangle (cr, - chart.x - 0.5, chart.y - 0.5, - chart.width + 1.0, chart.height + 1.0); + 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_stroke (cr); } diff --git a/acre.h b/acre.h index 89079ff..0c602c1 100644 --- a/acre.h +++ b/acre.h @@ -53,7 +53,7 @@ acre_add_data (acre_t *acre, acre_data_t *data); * etc.) */ void -acre_draw (acre_t *acre, cairo_t *cr, double width, double height); +acre_draw (acre_t *acre, cairo_t *cr, int width, int height); /* Create a new dataset---a collection of (x, y) datapoints. A single * plot can contain multiple datasets, (see acre_add_data). */ -- 2.43.0