1 /*
2  * bltGrAxis.h --
3  *
4  * Copyright 1991-1998 Lucent Technologies, Inc.
5  *
6  * Permission to use, copy, modify, and distribute this software and
7  * its documentation for any purpose and without fee is hereby
8  * granted, provided that the above copyright notice appear in all
9  * copies and that both that the copyright notice and warranty
10  * disclaimer appear in supporting documentation, and that the names
11  * of Lucent Technologies any of their entities not be used in
12  * advertising or publicity pertaining to distribution of the software
13  * without specific, written prior permission.
14  *
15  * Lucent Technologies disclaims all warranties with regard to this
16  * software, including all implied warranties of merchantability and
17  * fitness.  In no event shall Lucent Technologies be liable for any
18  * special, indirect or consequential damages or any damages
19  * whatsoever resulting from loss of use, data or profits, whether in
20  * an action of contract, negligence or other tortuous action, arising
21  * out of or in connection with the use or performance of this
22  * software.
23  */
24 
25 #ifndef _BLT_GR_AXIS_H
26 #define _BLT_GR_AXIS_H
27 
28 #include "bltList.h"
29 
30 /*
31  * -------------------------------------------------------------------
32  *
33  * AxisRange --
34  *
35  *	Designates a range of values by a minimum and maximum limit.
36  *
37  * -------------------------------------------------------------------
38  */
39 typedef struct {
40     double min, max, range, scale;
41 } AxisRange;
42 
43 /*
44  * ----------------------------------------------------------------------
45  *
46  * TickLabel --
47  *
48  * 	Structure containing the X-Y screen coordinates of the tick
49  * 	label (anchored at its center).
50  *
51  * ----------------------------------------------------------------------
52  */
53 typedef struct {
54     Point2D anchorPos;
55     int width, height;
56     char string[1];
57 } TickLabel;
58 
59 /*
60  * ----------------------------------------------------------------------
61  *
62  * Ticks --
63  *
64  * 	Structure containing information where the ticks (major or
65  *	minor) will be displayed on the graph.
66  *
67  * ----------------------------------------------------------------------
68  */
69 typedef struct {
70     int nTicks;			/* # of ticks on axis */
71     double values[1];		/* Array of tick values (malloc-ed). */
72 } Ticks;
73 
74 /*
75  * ----------------------------------------------------------------------
76  *
77  * TickSweep --
78  *
79  * 	Structure containing information where the ticks (major or
80  *	minor) will be displayed on the graph.
81  *
82  * ----------------------------------------------------------------------
83  */
84 typedef struct {
85     double initial;		/* Initial value */
86     double step;		/* Size of interval */
87     int nSteps;			/* Number of intervals. */
88 } TickSweep;
89 
90 /*
91  * ----------------------------------------------------------------------
92  *
93  * Axis --
94  *
95  * 	Structure contains options controlling how the axis will be
96  * 	displayed.
97  *
98  * ----------------------------------------------------------------------
99  */
100 typedef struct {
101     char *name;			/* Identifier to refer the element.
102 				 * Used in the "insert", "delete", or
103 				 * "show", commands. */
104 
105     Blt_Uid classUid;		/* Type of axis. */
106 
107     Graph *graphPtr;		/* Graph widget of element*/
108 
109     unsigned int flags;		/* Set bit field definitions below */
110 
111     /*
112      * AXIS_DRAWN		Axis is designated as a logical axis
113      * AXIS_DIRTY
114      *
115      * AXIS_CONFIG_MAJOR	User specified major ticks.
116      * AXIS_CONFIG_MINOR	User specified minor ticks.
117      */
118 
119     char **tags;
120 
121     char *detail;
122 
123     int deletePending;		/* Indicates that the axis was
124 				 * scheduled for deletion. The actual
125 				 * deletion may be deferred until the
126 				 * axis is no longer in use.  */
127 
128     int refCount;		/* Number of elements referencing this
129 				 * axis. */
130 
131     Blt_HashEntry *hashPtr;	/* Points to axis entry in hash
132 				 * table. Used to quickly remove axis
133 				 * entries. */
134 
135     int logScale;		/* If non-zero, scale the axis values
136 				 * logarithmically. */
137 
138     int hidden;			/* If non-zero, don't display the
139 				 * axis title, ticks, or line. */
140 
141     int showTicks;		/* If non-zero, display tick marks and
142 				 * labels. */
143 
144     int descending;		/* If non-zero, display the range of
145 				 * values on the axis in descending
146 				 * order, from high to low. */
147 
148     int looseMin, looseMax;	/* If non-zero, axis range extends to
149 				 * the outer major ticks, otherwise at
150 				 * the limits of the data values. This
151 				 * is overriddened by setting the -min
152 				 * and -max options.  */
153 
154     char *title;		/* Title of the axis. */
155 
156     TextStyle titleTextStyle;	/* Text attributes (color, font,
157 				 * rotation, etc.)  of the axis
158 				 * title. */
159 
160     int titleAlternate;		/* Indicates whether to position the
161 				 * title above/left of the axis. */
162 
163     Point2D titlePos;		/* Position of the title */
164 
165     unsigned short int titleWidth, titleHeight;
166 
167     int lineWidth;		/* Width of lines representing axis
168 				 * (including ticks).  If zero, then
169 				 * no axis lines or ticks are
170 				 * drawn. */
171 
172     char **limitsFormats;	/* One or two strings of sprintf-like
173 				 * formats describing how to display
174 				 * virtual axis limits. If NULL,
175 				 * display no limits. */
176     int nFormats;
177 
178     TextStyle limitsTextStyle;	/* Text attributes (color, font,
179 				 * rotation, etc.)  of the limits. */
180 
181     double windowSize;		/* Size of a sliding window of values
182 				 * used to scale the axis automatically
183 				 * as new data values are added. The axis
184 				 * will always display the latest values
185 				 * in this range. */
186 
187     double shiftBy;		/* Shift maximum by this interval. */
188 
189     int tickLength;		/* Length of major ticks in pixels */
190 
191     TextStyle tickTextStyle;	/* Text attributes (color, font, rotation,
192 				 * etc.) for labels at each major tick. */
193 
194     char *formatCmd;		/* Specifies a Tcl command, to be invoked
195 				 * by the axis whenever it has to generate
196 				 * tick labels. */
197 
198     char *scrollCmdPrefix;
199     int scrollUnits;
200 
201     double min, max;		/* The actual axis range. */
202 
203     double reqMin, reqMax;	/* Requested axis bounds. Consult the
204 				 * axisPtr->flags field for
205 				 * AXIS_CONFIG_MIN and AXIS_CONFIG_MAX
206 				 * to see if the requested bound have
207 				 * been set.  They override the
208 				 * computed range of the axis
209 				 * (determined by auto-scaling). */
210 
211     double scrollMin, scrollMax;/* Defines the scrolling reqion of the axis.
212 				 * Normally the region is determined from
213 				 * the data limits. If specified, these
214 				 * values override the data-range. */
215 
216     AxisRange valueRange;	/* Range of data values of elements mapped
217 				 * to this axis. This is used to auto-scale
218 				 * the axis in "tight" mode. */
219 
220     AxisRange axisRange;	/* Smallest and largest major tick values
221 				 * for the axis.  The tick values lie outside
222 				 * the range of data values.  This is used to
223 				 * auto-scale the axis in "loose" mode. */
224 
225     double prevMin, prevMax;
226 
227     double reqStep;		/* If > 0.0, overrides the computed major
228 				 * tick interval.  Otherwise a stepsize
229 				 * is automatically calculated, based
230 				 * upon the range of elements mapped to the
231 				 * axis. The default value is 0.0. */
232 
233     double tickZoom;		/* If > 0.0, overrides the computed major
234 				 * tick interval.  Otherwise a stepsize
235 				 * is automatically calculated, based
236 				 * upon the range of elements mapped to the
237 				 * axis. The default value is 0.0. */
238 
239 
240     GC tickGC;			/* Graphics context for axis and tick labels */
241 
242     Ticks *t1Ptr;		/* Array of major tick positions. May be
243 				 * set by the user or generated from the
244 				 * major sweep below. */
245 
246     Ticks *t2Ptr;		/* Array of minor tick positions. May be
247 				 * set by the user or generated from the
248 				 * minor sweep below. */
249 
250     TickSweep minorSweep, majorSweep;
251 
252     int reqNumMinorTicks;	/* If non-zero, represents the
253 				 * requested the number of minor ticks
254 				 * to be uniformally displayed along
255 				 * each major tick. */
256 
257 
258     int labelOffset;		/* If non-zero, indicates that the tick
259 				 * label should be offset to sit in the
260 				 * middle of the next interval. */
261 
262     /* The following fields are specific to logical axes */
263 
264     Blt_ChainLink *linkPtr;	/* Axis link in margin list. */
265     Blt_Chain *chainPtr;
266 
267     short int width, height;	/* Extents of axis */
268 
269     Segment2D *segments;	/* Array of line segments representing
270 				 * the major and minor ticks, but also
271 				 * the axis line itself. The segment
272 				 * coordinates are relative to the
273 				 * axis. */
274 
275     int nSegments;		/* Number of segments in the above array. */
276 
277     Blt_Chain *tickLabels;	/* Contains major tick label strings
278 				 * and their offsets along the axis. */
279     Region2D region;
280 
281     Tk_3DBorder border;
282     int borderWidth;
283     int relief;
284 } Axis;
285 
286 #define AXIS_CONFIG_MAJOR (1<<4) /* User specified major tick intervals. */
287 #define AXIS_CONFIG_MINOR (1<<5) /* User specified minor tick intervals. */
288 #define AXIS_ONSCREEN	  (1<<6) /* Axis is displayed on the screen via
289 				  * the "use" operation */
290 #define AXIS_DIRTY	  (1<<7)
291 #define AXIS_ALLOW_NULL   (1<<12)
292 
293 /*
294  * -------------------------------------------------------------------
295  *
296  * Axis2D --
297  *
298  *	The pair of axes mapping a point onto the graph.
299  *
300  * -------------------------------------------------------------------
301  */
302 typedef struct {
303     Axis *x, *y;
304 } Axis2D;
305 
306 #endif /* _BLT_GR_AXIS_H */
307