Reorder includes.
[bertos.git] / gfx / charts.c
1 /*!
2  * \file
3  * <!--
4  * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
5  * Copyright 1999, 2000, 2001, 2003 Bernardo Innocenti <bernie@develer.com>
6  * This file is part of DevLib - See README.devlib for information.
7  * -->
8  *
9  * \brief Simple charts on top of mware/gfx routines (implementation).
10  *
11  * Sample usage:
12  *
13  * \code
14  *      bm = chart_init(0, ymax, N_POINTS_CURVE, ymin);
15  *
16  *      chart_drawCurve(bm, curve_y, curve_points + 1);
17  *      gfx_setViewRect(bm, xmin, ymax, xmax, ymin);
18  *      chart_drawDots(bm, samples_x, samples_y, samples_cnt);
19  *
20  *      print_bitmap(bm);
21  * \endcode
22  *
23  * \version $Id$
24  * \author Bernardo Innocenti <bernie@develer.com>
25  */
26
27 /*#*
28  *#* $Log$
29  *#* Revision 1.3  2005/11/27 23:33:29  bernie
30  *#* Reorder includes.
31  *#*
32  *#* Revision 1.2  2005/11/04 18:17:45  bernie
33  *#* Fix header guards and includes for new location of gfx module.
34  *#*
35  *#* Revision 1.1  2005/11/04 18:11:35  bernie
36  *#* Move graphics stuff from mware/ to gfx/.
37  *#*
38  *#* Revision 1.7  2005/11/04 16:20:02  bernie
39  *#* Fix reference to README.devlib in header.
40  *#*
41  *#* Revision 1.6  2004/11/16 21:04:23  bernie
42  *#* Update to new naming scheme in mware/gfx.c.
43  *#*
44  *#* Revision 1.5  2004/09/14 20:56:39  bernie
45  *#* Make more generic and adapt to new gfx functions.
46  *#*
47  *#* Revision 1.3  2004/08/11 19:39:12  bernie
48  *#* Use chart_x_t and chart_y_t for the input dataset.
49  *#*
50  *#* Revision 1.1  2004/08/04 03:16:30  bernie
51  *#* Import simple chart drawing code.
52  *#*
53  *#*/
54
55 #include "charts.h"
56 #include <gfx/gfx.h>
57
58
59 #ifndef CONFIG_CHART_ARROWS
60 #define CONFIG_CHART_ARROWS 0
61 #endif
62
63
64 void chart_init(Bitmap *bm, coord_t xmin, coord_t ymin, coord_t xmax, coord_t ymax)
65 {
66         /* Clear the chart area */
67         gfx_rectClear(bm, xmin, ymin, xmax, ymax);
68
69         gfx_setClipRect(bm, xmin + CHART_BORDERLEFT, ymin + CHART_BORDERTOP,
70                 xmax - CHART_BORDERRIGHT, ymax - CHART_BORDERBOTTOM);
71
72         chart_drawAxis(bm);
73 }
74
75
76 void chart_setScale(Bitmap *bm, chart_x_t xmin, chart_y_t ymin, chart_x_t xmax, chart_y_t ymax)
77 {
78         gfx_setViewRect(bm, xmin, ymin, xmax, ymax);
79 }
80
81
82 /*!
83  * Draw the chart axes
84  */
85 void chart_drawAxis(Bitmap *bm)
86 {
87 #if CONFIG_CHART_ARROWS
88
89         /* Draw axis */
90         gfx_moveTo(bm, bm->cr.xmin, bm->cr.ymin + 4);
91         gfx_lineTo(bm, bm->cr.xmin, bm->cr.ymax - 1);
92         gfx_lineTo(bm, bm->cr.xmax - 4 - 1, bm->cr.ymax - 1);
93
94         /* Draw up arrow */
95         gfx_moveTo(bm, bm->cr.xmin - 2, bm->cr.ymin + 3);
96         gfx_lineTo(bm, bm->cr.xmin + 2, bm->cr.ymin + 3);
97         gfx_lineTo(bm, bm->cr.xmin, bm->cr.ymin);
98         gfx_lineTo(bm, bm->cr.xmin - 2, bm->cr.ymin + 3);
99
100         /* Draw right arrow */
101         gfx_moveTo(bm, bm->cr.xmax - 4, bm->cr.ymax - 3);
102         gfx_lineTo(bm, bm->cr.xmax - 4, bm->cr.ymax + 1);
103         gfx_lineTo(bm, bm->cr.xmax - 1, bm->cr.ymax - 1);
104         gfx_lineTo(bm, bm->cr.xmax - 4, bm->cr.ymax - 3);
105
106 #else /* CONFIG_CHART_ARROWS */
107
108         /* Draw a box around the chart */
109         gfx_rectDraw(bm, bm->cr.xmin, bm->cr.ymin, bm->cr.xmax, bm->cr.ymax);
110
111 #endif /* CONFIG_CHART_ARROWS */
112
113         //CHECK_WALL(wall_before_raster, WALL_SIZE);
114         //CHECK_WALL(wall_after_raster, WALL_SIZE);
115 }
116
117
118 /*!
119  * Draw a set of \a curve_cnt connected segments, whose Y coordinates
120  * are identified by the \a curve_y array and X-coordinates are
121  * are evenly spaced by one virtual unit.
122  */
123 void chart_drawCurve(Bitmap *bm, const chart_y_t *curve_y, int curve_cnt)
124 {
125         int i;
126
127         gfx_moveTo(bm, gfx_transformX(bm, 0), gfx_transformY(bm, curve_y[0]));
128
129         for (i = 1; i < curve_cnt; i++)
130                 gfx_lineTo(bm, gfx_transformX(bm, i), gfx_transformY(bm, curve_y[i]));
131
132         //CHECK_WALL(wall_before_raster, WALL_SIZE);
133         //CHECK_WALL(wall_after_raster, WALL_SIZE);
134 }
135
136
137 /*!
138  * Disegna dei dot in corrispondenza delle coppie (dotsx[i];dotsy[i])
139  * Se dotsx e' NULL, i punti vengono disegnati ad intervalli regolari.
140  */
141 void chart_drawDots(Bitmap *bm, const chart_x_t *dots_x, const chart_y_t *dots_y, int cnt)
142 {
143         int i;
144         coord_t x, y;
145
146         for (i = 0; i < cnt; i++)
147         {
148                 if (dots_x)
149                         x = gfx_transformX(bm, dots_x[i]);
150                 else
151                         x = gfx_transformX(bm, i);
152
153                 y = gfx_transformY(bm, dots_y[i]);
154
155                 /* Draw tick over the curve */
156                 gfx_rectFill(bm,
157                         x - TICKS_WIDTH / 2, y - TICKS_HEIGHT / 2,
158                         x + (TICKS_WIDTH + 1) / 2, y + (TICKS_HEIGHT + 1) / 2);
159
160                 /* Draw vertical line from the curve to the X-axis */
161                 //gfx_drawLine(bm, x, y, x, bm->cr.ymax - 1);
162         }
163
164         //CHECK_WALL(wall_before_raster, WALL_SIZE);
165         //CHECK_WALL(wall_after_raster, WALL_SIZE);
166 }
167