1 /* acre - A cairo-based library for creating plots and charts.
3 * Copyright © 2009 Carl Worth <cworth@cworth.org>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 typedef struct _acre_data_point_2d {
28 } acre_data_point_2d_t;
33 acre_data_point_2d_t *points;
34 unsigned int points_size;
35 unsigned int num_points;
44 unsigned int data_size;
45 unsigned int num_data;
48 /* Create a new, empty plot. */
54 acre = xmalloc (sizeof (acre_t));
57 acre->x_axis_label = NULL;
58 acre->y_axis_label = NULL;
69 acre_destroy (acre_t *acre)
74 free (acre->x_axis_label);
75 free (acre->y_axis_label);
77 for (i = 0; i < acre->num_data; i++)
78 acre_data_destroy (acre->data[i]);
86 acre_set_title (acre_t *acre, const char *title)
90 acre->title = strdup (title);
94 acre_set_x_axis_label (acre_t *acre, const char *label)
96 free (acre->x_axis_label);
98 acre->x_axis_label = strdup (label);
102 acre_set_y_axis_label (acre_t *acre, const char *label)
104 free (acre->y_axis_label);
106 acre->y_axis_label = strdup (label);
109 /* Add a dataset to the plot. The plot assumes ownership of the
110 * dataset so it is not necessary to call acre_data_destroy on it. */
112 acre_add_data (acre_t *acre, acre_data_t *data)
114 if (acre->num_data >= acre->data_size) {
115 acre->data_size *= 2;
116 if (acre->data_size == 0)
118 acre->data = xrealloc_ab (acre->data,
120 sizeof (acre_data_t *));
123 acre->data[acre->num_data] = data;
127 /* Draw the plot to the given cairo context within a user-space
128 * rectangle from (0, 0) to (width, height). This size includes all
129 * space for extra-plot elements (such as the title, the axis labels,
133 acre_draw (acre_t *acre, cairo_t *cr, double width, double height)
137 cairo_rectangle (cr, 0, 0, width, height);
139 cairo_set_source_rgb (cr, 1, 0, 1);
144 /* Create a new dataset---a collection of (x, y) datapoints. A single
145 * plot can contain multiple datasets, (see acre_add_data). */
147 acre_data_create (void)
151 data = xmalloc (sizeof (acre_data_t));
156 data->points_size = 0;
157 data->num_points = 0;
162 /* Destroy an acre dataset. Do not call this function if the dataset
163 * has been added to an acre_t plot with acre_add_data. */
165 acre_data_destroy (acre_data_t *data)
172 /* Set the label for this dataset (to appear in the plot's key). */
174 acre_data_set_name (acre_data_t *data, const char *name)
178 data->name = strdup (name);
181 /* Add a datapoint to the given dataset. */
183 acre_data_add_point_2d (acre_data_t *data, double x, double y)
185 if (data->num_points >= data->points_size) {
186 data->points_size *= 2;
187 if (data->points_size == 0)
188 data->points_size = 16;
189 data->points = xrealloc_ab (data->points,
191 sizeof (acre_data_point_2d_t));
194 data->points[data->num_points].x = x;
195 data->points[data->num_points].y = y;