1 /* 2 * bltGrElem.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_ELEM_H 26 #define _BLT_GR_ELEM_H 27 28 #define SEARCH_X 0 29 #define SEARCH_Y 1 30 #define SEARCH_BOTH 2 31 32 #define SHOW_NONE 0 33 #define SHOW_X 1 34 #define SHOW_Y 2 35 #define SHOW_BOTH 3 36 37 #define SEARCH_POINTS 0 /* Search for closest data point. */ 38 #define SEARCH_TRACES 1 /* Search for closest point on trace. 39 * Interpolate the connecting line segments 40 * if necessary. */ 41 #define SEARCH_AUTO 2 /* Automatically determine whether to search 42 * for data points or traces. Look for 43 * traces if the linewidth is > 0 and if 44 * there is more than one data point. */ 45 46 #define ELEM_ACTIVE (1<<8) /* Non-zero indicates that the element 47 * should be drawn in its active 48 * foreground and background 49 * colors. */ 50 #define ACTIVE_PENDING (1<<7) 51 52 #define LABEL_ACTIVE (1<<9) /* Non-zero indicates that the 53 * element's entry in the legend 54 * should be drawn in its active 55 * foreground and background 56 * colors. */ 57 #define SCALE_SYMBOL (1<<10) 58 59 #define NumberOfPoints(e) MIN((e)->x.nValues, (e)->y.nValues) 60 61 /* 62 * ------------------------------------------------------------------- 63 * 64 * Weight -- 65 * 66 * Designates a range of values by a minimum and maximum limit. 67 * 68 * ------------------------------------------------------------------- 69 */ 70 typedef struct { 71 double min, max, range; 72 } Weight; 73 74 #define SetRange(l) \ 75 ((l).range = ((l).max > (l).min) ? ((l).max - (l).min) : DBL_EPSILON) 76 #define SetScale(l) \ 77 ((l).scale = 1.0 / (l).range) 78 #define SetWeight(l, lo, hi) \ 79 ((l).min = (lo), (l).max = (hi), SetRange(l)) 80 81 /* 82 * An element has one or more vectors plus several attributes, such as 83 * line style, thickness, color, and symbol type. It has an 84 * identifier which distinguishes it among the list of all elements. 85 */ 86 typedef struct { 87 Weight weight; /* Weight range where this pen is valid. */ 88 89 Pen *penPtr; /* Pen to use. */ 90 91 Segment2D *xErrorBars; /* Point to start of this pen's X-error bar 92 * segments in the element's array. */ 93 94 Segment2D *yErrorBars; /* Point to start of this pen's Y-error bar 95 * segments in the element's array. */ 96 97 int xErrorBarCnt; /* # of error bars for this pen. */ 98 99 int yErrorBarCnt; /* # of error bars for this pen. */ 100 101 int errorBarCapWidth; /* Length of the cap ends on each 102 * error bar. */ 103 104 int symbolSize; /* Size of the pen's symbol scaled to 105 * the current graph size. */ 106 } PenStyle; 107 108 109 typedef struct { 110 XColor *color; /* Color of error bar */ 111 int lineWidth; /* Width of the error bar segments. */ 112 GC gc; 113 int show; /* Flags for errorbars: none, x, y, or both */ 114 115 } ErrorBarAttributes; 116 117 typedef struct { 118 int halo; /* Maximal distance a candidate point 119 * can be from the sample window 120 * coordinate */ 121 122 int mode; /* Indicates whether to find the closest 123 * data point or the closest point on the 124 * trace by interpolating the line segments. 125 * Can also be SEARCH_AUTO, indicating to 126 * choose how to search.*/ 127 128 int x, y; /* Screen coordinates of test point */ 129 130 int along; /* Indicates to let search run along a 131 * particular axis: x, y, or both. */ 132 133 /* Output */ 134 Element *elemPtr; /* Name of the closest element */ 135 136 Point2D point; /* Graph coordinates of closest point */ 137 138 int index; /* Index of closest data point */ 139 140 double dist; /* Distance in screen coordinates */ 141 142 } ClosestSearch; 143 144 typedef void (ElementDrawProc) _ANSI_ARGS_((Graph *graphPtr, Drawable drawable, 145 Element *elemPtr)); 146 typedef void (ElementToPostScriptProc) _ANSI_ARGS_((Graph *graphPtr, 147 PsToken psToken, Element *elemPtr)); 148 typedef void (ElementDestroyProc) _ANSI_ARGS_((Graph *graphPtr, 149 Element *elemPtr)); 150 typedef int (ElementConfigProc) _ANSI_ARGS_((Graph *graphPtr, 151 Element *elemPtr)); 152 typedef void (ElementMapProc) _ANSI_ARGS_((Graph *graphPtr, 153 Element *elemPtr)); 154 typedef void (ElementExtentsProc) _ANSI_ARGS_((Element *elemPtr, 155 Extents2D *extsPtr)); 156 typedef void (ElementClosestProc) _ANSI_ARGS_((Graph *graphPtr, 157 Element *elemPtr, ClosestSearch *searchPtr)); 158 typedef void (ElementDrawSymbolProc) _ANSI_ARGS_((Graph *graphPtr, 159 Drawable drawable, Element *elemPtr, int x, int y, int symbolSize)); 160 typedef void (ElementSymbolToPostScriptProc) _ANSI_ARGS_((Graph *graphPtr, 161 PsToken psToken, Element *elemPtr, double x, double y, int symSize)); 162 163 typedef struct { 164 ElementClosestProc *closestProc; 165 ElementConfigProc *configProc; 166 ElementDestroyProc *destroyProc; 167 ElementDrawProc *drawActiveProc; 168 ElementDrawProc *drawNormalProc; 169 ElementDrawSymbolProc *drawSymbolProc; 170 ElementExtentsProc *extentsProc; 171 ElementToPostScriptProc *printActiveProc; 172 ElementToPostScriptProc *printNormalProc; 173 ElementSymbolToPostScriptProc *printSymbolProc; 174 ElementMapProc *mapProc; 175 } ElementProcs; 176 177 /* 178 * The data structure below contains information pertaining to a line 179 * vector. It consists of an array of floating point data values and 180 * for convenience, the number and minimum/maximum values. 181 */ 182 183 typedef struct { 184 Blt_Vector *vecPtr; 185 186 double *valueArr; 187 188 int nValues; 189 190 int arraySize; 191 192 double min, max; 193 194 Blt_VectorId clientId; /* If non-NULL, a client token identifying the 195 * external vector. */ 196 197 Element *elemPtr; /* Element associated with vector. */ 198 199 } ElemVector; 200 201 202 struct ElementStruct { 203 char *name; /* Identifier to refer the element. 204 * Used in the "insert", "delete", or 205 * "show", commands. */ 206 207 Blt_Uid classUid; /* Type of element */ 208 209 Graph *graphPtr; /* Graph widget of element*/ 210 211 unsigned int flags; /* Indicates if the entire element is 212 * active, or if coordinates need to 213 * be calculated */ 214 215 char **tags; 216 217 int hidden; /* If non-zero, don't display the element. */ 218 219 Blt_HashEntry *hashPtr; 220 221 char *label; /* Label displayed in legend */ 222 223 int labelRelief; /* Relief of label in legend. */ 224 225 Axis2D axes; /* X-axis and Y-axis mapping the element */ 226 227 ElemVector x, y, w; /* Contains array of floating point 228 * graph coordinate values. Also holds 229 * min/max and the number of 230 * coordinates */ 231 232 ElemVector xError; /* Relative/symmetric X error values. */ 233 ElemVector yError; /* Relative/symmetric Y error values. */ 234 ElemVector xHigh, xLow; /* Absolute/asymmetric X-coordinate high/low 235 error values. */ 236 ElemVector yHigh, yLow; /* Absolute/asymmetric Y-coordinate high/low 237 error values. */ 238 239 int *activeIndices; /* Array of indices (malloc-ed) which 240 * indicate which data points are 241 * active (drawn with "active" 242 * colors). */ 243 244 int nActiveIndices; /* Number of active data points. 245 * Special case: if nActiveIndices < 0 246 * and the active bit is set in 247 * "flags", then all data points are 248 * drawn active. */ 249 250 ElementProcs *procsPtr; 251 252 Tk_ConfigSpec *specsPtr; /* Configuration specifications. */ 253 254 Segment2D *xErrorBars; /* Point to start of this pen's X-error bar 255 * segments in the element's array. */ 256 Segment2D *yErrorBars; /* Point to start of this pen's Y-error bar 257 * segments in the element's array. */ 258 int xErrorBarCnt; /* # of error bars for this pen. */ 259 int yErrorBarCnt; /* # of error bars for this pen. */ 260 261 int *xErrorToData; /* Maps error bar segments back to the data 262 * point. */ 263 int *yErrorToData; /* Maps error bar segments back to the data 264 * point. */ 265 266 int errorBarCapWidth; /* Length of cap on error bars */ 267 268 Pen *activePenPtr; /* Standard Pens */ 269 Pen *normalPenPtr; 270 271 Blt_Chain *palette; /* Palette of pens. */ 272 273 /* Symbol scaling */ 274 int scaleSymbols; /* If non-zero, the symbols will scale 275 * in size as the graph is zoomed 276 * in/out. */ 277 278 double xRange, yRange; /* Initial X-axis and Y-axis ranges: 279 * used to scale the size of element's 280 * symbol. */ 281 int state; 282 }; 283 284 285 extern double Blt_FindElemVectorMinimum _ANSI_ARGS_((ElemVector *vecPtr, 286 double minLimit)); 287 extern void Blt_ResizeStatusArray _ANSI_ARGS_((Element *elemPtr, int nPoints)); 288 extern int Blt_GetPenStyle _ANSI_ARGS_((Graph *graphPtr, char *name, 289 Blt_Uid classUid, PenStyle *stylePtr)); 290 extern void Blt_FreePalette _ANSI_ARGS_((Graph *graphPtr, Blt_Chain *palette)); 291 extern PenStyle **Blt_StyleMap _ANSI_ARGS_((Element *elemPtr)); 292 extern void Blt_MapErrorBars _ANSI_ARGS_((Graph *graphPtr, Element *elemPtr, 293 PenStyle **dataToStyle)); 294 295 #endif /* _BLT_GR_ELEM_H */ 296