File: xgraphics.h

package info (click to toggle)
ucblogo 5.5-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,048 kB
  • ctags: 3,560
  • sloc: ansic: 15,086; lisp: 5,588; makefile: 175
file content (206 lines) | stat: -rw-r--r-- 6,798 bytes parent folder | download | duplicates (6)
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/* X window system graphics header file. */

#include <memory.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

extern int have_x;
extern int back_ground;

extern void real_window_init();
void logofill(void);

/* Some X-related defines. */
#define BORDER	1
#define FONT	"fixed"
#define NUMCOLORS 512
#define NUMINITCOLORS 16
#define EVENT_MASK  (StructureNotifyMask | PointerMotionMask \
		     | ButtonPressMask | ButtonReleaseMask)
#define DEFAULT_HEIGHT           500
#define DEFAULT_WIDTH            500

#define GR_SIZE         60000

#define checkX { \
    if (have_x < 0) real_window_init(); \
    if (!have_x) { \
	err_logo(BAD_GRAPH_INIT,NIL); \
	return; \
    } \
}

#define prepare_to_draw          {checkX; placate_x();}
#define done_drawing             XFlush(dpy)
extern void placate_x();

#define prepare_to_draw_turtle nop()
#define done_drawing_turtle nop()

#define screen_left              0
#define screen_right             (screen_width-1)
#define screen_top               0
#define screen_bottom            (screen_height-1)

/* #define screen_height (1 + screen_bottom - screen_top) */
/* #define screen_width (1 + screen_right - screen_left) */

#define screen_x_center (screen_left + (screen_width)/2)
#define screen_y_center (screen_top + (screen_height)/2)

#define turtle_left_max ((screen_left) - (screen_x_center))
#define turtle_right_max ((screen_right) - (screen_x_center))
#define turtle_top_max ((screen_y_center) - (screen_top))
#define turtle_bottom_max ((screen_y_center) - (screen_bottom))

#define screen_x_coord ((screen_x_center) + turtle_x)
#define screen_y_coord ((screen_y_center) - turtle_y)

#define turtle_height 18
#define turtle_half_bottom 6.0
#define turtle_side 19.0

#define clear_screen		 XClearWindow(dpy, win)

#define erase_screen()		 XClearWindow(dpy, win)

#define line_to(a,b)             if(xgr_pen.vis==0)\
                                 XDrawLine(dpy,win,xgr_pen.pm,\
                                 xgr_pen.xpos,xgr_pen.ypos,\
                                 (a),(b));\
                                 xgr_pen.xpos=(a);\
                                 xgr_pen.ypos=(b)

#define move_to(a,b)             xgr_pen.xpos=(a);\
                                 xgr_pen.ypos=(b)

#define draw_string(s)           XDrawString(dpy,win,xgr_pen.pm,\
                                 xgr_pen.xpos,xgr_pen.ypos,\
                                 (s),strlen((s)));

#define set_pen_vis(v)           xgr_pen.vis=(v)

#define set_pen_mode(m)          xgr_pen.pm=(m)

#define set_pen_color(c)         draw_turtle();\
                                 xgr_pen.color=c%NUMCOLORS;\
                                 XSetForeground(dpy,draw_gc,color[2+xgr_pen.color].pixel);\
                                 XSetForeground(dpy,reverse_gc,color[2+xgr_pen.color].pixel);\
                                 draw_turtle();

#define set_back_ground(c)       back_ground=c%NUMCOLORS;\
                                 XSetBackground(dpy,draw_gc,color[2+back_ground].pixel);\
                                 XSetBackground(dpy,reverse_gc,color[2+back_ground].pixel);\
                                 XSetBackground(dpy,erase_gc,color[2+back_ground].pixel);\
                                 XSetForeground(dpy,erase_gc,color[2+back_ground].pixel);\
				 XSetWindowBackground(dpy,win,color[2+back_ground].pixel);\
				 redraw_graphics();

#define set_pen_width(w)         XSetLineAttributes(dpy, draw_gc, w, LineSolid, \
						    CapProjecting, JoinMiter);\
				 XSetLineAttributes(dpy, erase_gc, w, LineSolid, \
						    CapProjecting, JoinMiter);\
				 XSetLineAttributes(dpy, reverse_gc, w, LineSolid, \
						    CapProjecting, JoinMiter);\
                                 xgr_pen.pw = w;

#define set_pen_height(h)        XSetLineAttributes(dpy, draw_gc, h, LineSolid, \
						    CapProjecting, JoinMiter);\
				 XSetLineAttributes(dpy, erase_gc, h, LineSolid, \
						    CapProjecting, JoinMiter);\
				 XSetLineAttributes(dpy, reverse_gc, h, LineSolid, \
						    CapProjecting, JoinMiter);\
                                 xgr_pen.ph = h;

#define set_pen_x(x)             nop()
#define set_pen_y(y)             nop()

/* pen_info is a stucture type with fields for the various
   pen characteristics including the location, size, color,
   mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */

typedef struct {
  int color;
  int xpos;
  int ypos;
  int vis;
  int pw;
  int ph;
  GC  pm;
} pen_info;

extern pen_info xgr_pen;

#define p_info_x(p)              (p.xpos)
#define p_info_y(p)              (p.ypos)

/* All these should take an argument, like the two just above.
   Then we could support multiple turtles.
 */

#define pen_width                xgr_pen.pw
#define pen_height               xgr_pen.ph
#define pen_color                xgr_pen.color
#define pen_mode                 xgr_pen.pm
#define pen_vis                  xgr_pen.vis
#define pen_x                    (xgr_pen.xpos)
#define pen_y                    (xgr_pen.ypos)
#define get_node_pen_pattern     (cons(make_intnode(-1), NIL))

#define pen_reverse              pen_mode=reverse_gc
#define pen_erase                pen_mode=erase_gc
#define pen_down                 pen_mode=draw_gc

#define button                   get_button()
#define mouse_x                  get_mouse_x()
#define mouse_y                  get_mouse_y()

/* There seems little point in implementing these unless we put
   everything in one window.  (Possibly use a slave xterm?)
 */
#define full_screen              nop()
#define split_screen             nop()
#define text_screen              nop()

#define plain_xor_pen()          pen_reverse

#define label(s)                 XDrawImageString(dpy,win,xgr_pen.pm,\
                                 xgr_pen.xpos,xgr_pen.ypos,\
                                 (s), strlen(s))

#define tone(p,d)                nop()
#define get_pen_pattern(p)       nop()
#define set_pen_pattern(p)       nop()
#define set_list_pen_pattern(p)  nop()

extern void set_palette(int, unsigned int, unsigned int, unsigned int);
extern void get_palette(int, unsigned int*, unsigned int*, unsigned int*);

/* The sparc has fmod.  So I use it. */
/* #define fmod(x,y)                x */


extern void nop();

/* Global X variables. */
extern int screen_height, screen_width;

extern Display    *dpy;		/* X server connection */
extern Window      win;		/* Window ID */
extern GC          draw_gc,     /* GC to draw with */
                   erase_gc,    /* GC to draw with */
                   reverse_gc;  /* GC to draw with */

extern XColor color[];
extern XColor dummy;

extern int get_mouse_x(), get_mouse_y();


/* Avoid name conflicts.  Note: if xgraphics.c uses True and
   False, bad things are likely to happen.
 */
#undef True
#undef False