1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
|
/*
* This file is subject to the terms of the GFX License. If a copy of
* the license was not distributed with this file, you can obtain one at:
*
* http://ugfx.org/license.html
*/
/**
* @file src/gwin/gwin_graph.h
* @brief GWIN GRAPH module header file
*
* @defgroup Graph Graph
* @ingroup Windows
*
* @brief Graph window. Used to display highly customizable graphs.
*
* @details GWIN allows it to easily draw graphs.
*
* @pre GFX_USE_GWIN must be set to GFXON in your gfxconf.h
* @pre GWIN_NEED_GRAPH must be set to GFXON in your gfxconf.h
*
* @{
*/
#ifndef _GWIN_GRAPH_H
#define _GWIN_GRAPH_H
/* This file is included within "src/gwin/gwin.h" */
typedef enum GGraphPointType_e {
GGRAPH_POINT_NONE, GGRAPH_POINT_DOT, GGRAPH_POINT_SQUARE, GGRAPH_POINT_CIRCLE
} GGraphPointType;
typedef struct GGraphPointStyle_t {
GGraphPointType type;
gCoord size;
gColor color;
} GGraphPointStyle;
typedef enum GGraphLineType_e {
GGRAPH_LINE_NONE, GGRAPH_LINE_SOLID, GGRAPH_LINE_DOT, GGRAPH_LINE_DASH
} GGraphLineType;
typedef struct GGraphLineStyle_t {
GGraphLineType type;
gCoord size;
gColor color;
} GGraphLineStyle;
typedef struct GGraphGridStyle_t {
GGraphLineType type;
gCoord size;
gColor color;
gCoord spacing;
} GGraphGridStyle;
typedef struct GGraphStyle_t {
GGraphPointStyle point;
GGraphLineStyle line;
GGraphLineStyle xaxis;
GGraphLineStyle yaxis;
GGraphGridStyle xgrid;
GGraphGridStyle ygrid;
uint16_t flags;
#define GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS 0x0001
#define GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS 0x0002
#define GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS 0x0004
#define GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS 0x0008
#define GWIN_GRAPH_STYLE_POSITIVE_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS)
#define GWIN_GRAPH_STYLE_NEGATIVE_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS)
#define GWIN_GRAPH_STYLE_XAXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_XAXIS_NEGATIVE_ARROWS)
#define GWIN_GRAPH_STYLE_YAXIS_ARROWS (GWIN_GRAPH_STYLE_YAXIS_POSITIVE_ARROWS|GWIN_GRAPH_STYLE_YAXIS_NEGATIVE_ARROWS)
#define GWIN_GRAPH_STYLE_ALL_AXIS_ARROWS (GWIN_GRAPH_STYLE_XAXIS_ARROWS|GWIN_GRAPH_STYLE_YAXIS_ARROWS)
} GGraphStyle;
// A graph window
typedef struct GGraphObject {
GWindowObject g;
GGraphStyle style;
gCoord xorigin, yorigin;
gCoord lastx, lasty;
} GGraphObject;
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
/**
* @brief Create a graph window.
* @return NULL if there is no resultant drawing area, otherwise a window handle.
*
* @param[in] g The GDisplay to display this window on
* @param[in] gg The GGraphObject structure to initialise. If this is NULL the structure is dynamically allocated.
* @param[in] pInit The initialization parameters to use
*
* @note The drawing color and the background color get set to the current defaults. If you haven't called
* @p gwinSetDefaultColor() or @p gwinSetDefaultBgColor() then these are GFX_WHITE and GFX_BLACK respectively.
* @note The font gets set to the current default font. If you haven't called @p gwinSetDefaultFont() then there
* is no default font and text drawing operations will no nothing.
* @note The dimensions and position may be changed to fit on the real screen.
* @note A graph does not save the drawing state. It is not automatically redrawn if the window is moved or
* its visibility state is changed.
* @note The coordinate system within the window for graphing operations (but not for any other drawing
* operation) is relative to the bottom left corner and then shifted right and up by the specified
* graphing x and y origin. Note that this system is inverted in the y direction relative to the display.
* This gives the best graphing arrangement ie. increasing y values are closer to the top of the display.
*
* @api
*/
GHandle gwinGGraphCreate(GDisplay *g, GGraphObject *gg, const GWindowInit *pInit);
#define gwinGraphCreate(gg, pInit) gwinGGraphCreate(GDISP, gg, pInit)
/**
* @brief Set the style of the graphing operations.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] pstyle The graph style to set.
* @note The graph is not automatically redrawn. The new style will apply to any new drawing operations.
*
* @api
*/
void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle);
/**
* @brief Set the origin for graphing operations.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] x, y The new origin for the graph (in graph coordinates relative to the bottom left corner).
* @note The graph is not automatically redrawn. The new origin will apply to any new drawing operations.
*
* @api
*/
void gwinGraphSetOrigin(GHandle gh, gCoord x, gCoord y);
/**
* @brief Draw the axis and the background grid.
*
* @param[in] gh The window handle (must be a graph window)
* @note The graph is not automatically cleared. You must do that first by calling gwinClear().
*
* @api
*/
void gwinGraphDrawAxis(GHandle gh);
/**
* @brief Start a new set of graphing data.
* @details This prevents a line being drawn from the last data point to the next point to be drawn.
*
* @param[in] gh The window handle (must be a graph window)
*
* @api
*/
void gwinGraphStartSet(GHandle gh);
/**
* @brief Draw a graph point.
* @details A graph point and a line connecting to the previous point will be drawn.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] x, y The new point for the graph.
*
* @api
*/
void gwinGraphDrawPoint(GHandle gh, gCoord x, gCoord y);
/**
* @brief Draw multiple graph points.
* @details A graph point and a line connecting to each previous point will be drawn.
*
* @param[in] gh The window handle (must be a graph window)
* @param[in] points The array of points for the graph.
* @param[in] count The number of points in the array.
* @note This is slightly more efficient than calling gwinGraphDrawPoint() repeatedly.
*
* @api
*/
void gwinGraphDrawPoints(GHandle gh, const gPoint *points, unsigned count);
#endif /* _GWIN_GRAPH_H */
/** @} */
|