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
|
/*
* Smithsonian Astrophysical Observatory, Cambridge, MA, USA
* This code has been modified under the terms listed below and is made
* available under the same terms.
*/
/*
* Copyright 1993-2004 George A Howlett.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __BltGrMisc_h__
#define __BltGrMisc_h__
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
#include <tk.h>
/*
* MAP_ITEM Indicates that the element/marker/axis
* configuration has changed such that
* its layout of the item (i.e. its
* position in the graph window) needs
* to be recalculated.
*
* MAP_ALL Indicates that the layout of the axes and
* all elements and markers and the graph need
* to be recalculated. Otherwise, the layout
* of only those markers and elements that
* have changed will be reset.
*
* GET_AXIS_GEOMETRY Indicates that the size of the axes needs
* to be recalculated.
*
* RESET_AXES Flag to call to Blt_ResetAxes routine.
* This routine recalculates the scale offset
* (used for mapping coordinates) of each axis.
* If an axis limit has changed, then it sets
* flags to re-layout and redraw the entire
* graph. This needs to happend before the axis
* can compute transformations between graph and
* screen coordinates.
*
* LAYOUT_NEEDED
*
* CACHE_DIRTY If set, redraw all elements into the pixmap
* used for buffering elements.
*
* REDRAW_PENDING Non-zero means a DoWhenIdle handler has
* already been queued to redraw this window.
*
*/
#define GRAPH_DELETED (1<<1)
#define REDRAW_PENDING (1<<2)
#define FOCUS (1<<3)
#define MAP_ITEM (1<<4)
#define MAP_ALL (1<<5)
#define LAYOUT_NEEDED (1<<6)
#define RESET_AXES (1<<7)
#define GET_AXIS_GEOMETRY (1<<8)
#define CACHE_DIRTY (1<<9)
#define MAP_WORLD (MAP_ALL|RESET_AXES|GET_AXIS_GEOMETRY)
#define MARGIN_NONE -1
#define MARGIN_BOTTOM 0 /* x */
#define MARGIN_LEFT 1 /* y */
#define MARGIN_TOP 2 /* x2 */
#define MARGIN_RIGHT 3 /* y2 */
class Graph;
typedef struct {
double x;
double y;
} Point2d;
typedef struct {
double left;
double right;
double top;
double bottom;
} Region2d;
typedef struct {
Point2d p;
Point2d q;
} Segment2d;
typedef enum {
CID_NONE, CID_AXIS_X, CID_AXIS_Y, CID_ELEM_BAR, CID_ELEM_LINE,
CID_MARKER_BITMAP, CID_MARKER_IMAGE, CID_MARKER_LINE, CID_MARKER_POLYGON,
CID_MARKER_TEXT, CID_LEGEND_ENTRY,
} ClassId;
typedef struct {
unsigned char values[12];
int offset;
} Blt_Dashes;
#define LineIsDashed(d) ((d).values[0] != 0)
namespace Blt {
extern char* dupstr(const char*);
};
extern void Blt_SetDashes (Display *display, GC gc, Blt_Dashes *dashesPtr);
extern int Blt_PointInPolygon(Point2d *samplePtr, Point2d *screenPts,
int nScreenPts);
extern int Blt_GetXY(Tcl_Interp* interp, Tk_Window tkwin,
const char *string, int *xPtr, int *yPtr);
extern int Blt_PolyRectClip(Region2d *extsPtr, Point2d *inputPts,
int nInputPts, Point2d *outputPts);
extern void Blt_Draw2DSegments(Display *display, Drawable drawable, GC gc,
Segment2d *segments, int nSegments);
extern int Blt_LineRectClip(Region2d *regionPtr, Point2d *p, Point2d *q);
extern GC Blt_GetPrivateGC(Tk_Window tkwin, unsigned long gcMask,
XGCValues *valuePtr);
extern void Blt_FreePrivateGC(Display *display, GC gc);
extern Point2d Blt_GetProjection (int x, int y, Point2d *p, Point2d *q);
extern long Blt_MaxRequestSize (Display *display, size_t elemSize);
extern Graph *Blt_GetGraphFromWindowData(Tk_Window tkwin);
#endif
|