1 /*
2  * FIG : Facility for Interactive Generation of figures
3  * Copyright (c) 1985 by Supoj Sutanthavibul
4  * Parts Copyright (c) 1994 by Brian V. Smith
5  * Parts Copyright (c) 1991 by Paul King
6  *
7  * The X Consortium, and any party obtaining a copy of these files from
8  * the X Consortium, directly or indirectly, is granted, free of charge, a
9  * full and unrestricted irrevocable, world-wide, paid up, royalty-free,
10  * nonexclusive right and license to deal in this software and
11  * documentation files (the "Software"), including without limitation the
12  * rights to use, copy, modify, merge, publish, distribute, sublicense,
13  * and/or sell copies of the Software, and to permit persons who receive
14  * copies from any such party to do so, with the only requirement being
15  * that this copyright notice remain intact.  This license includes without
16  * limitation a license to do the foregoing actions under any patents of
17  * the party supplying this software to the X Consortium.
18  */
19 
20 /* This file has been modified for use with Gnuplot 3.6 by
21  * Ian MacPhedran.
22  */
23 
24 /* DEFAULT is used for many things - font, color etc */
25 
26 #define		DEFAULT		      (-1)
27 #define		SOLID_LINE		0
28 #define		DASH_LINE		1
29 #define		DOTTED_LINE		2
30 #define		RUBBER_LINE		3
31 #define		PANEL_LINE		4
32 
33 #define		Color			int
34 
35 #define		BLACK			0
36 #define		BLUE			1
37 #define		GREEN			2
38 #define		CYAN			3
39 #define		RED			4
40 #define		MAGENTA			5
41 #define		YELLOW			6
42 #define		WHITE			7
43 
44 /** VERY IMPORTANT:  The f_line, f_spline and f_arc objects all must have the
45 		components up to and including the arrows in the same order.
46 		This is for the get/put_generic_arrows() in e_edit.c.
47 **/
48 
49 typedef struct f_point {
50     int		    x, y;
51 }
52 		F_point;
53 
54 typedef struct f_pos {
55     int		    x, y;
56 }
57 		F_pos;
58 
59 #define DEF_ARROW_WID (4 * ZOOM_FACTOR)
60 #define DEF_ARROW_HT (8 * ZOOM_FACTOR)
61 
62 typedef struct f_arrow {
63     int		    type;
64     int		    style;
65     float	    thickness;
66     float	    wid;
67     float	    ht;
68 }
69 		F_arrow;
70 
71 typedef struct f_ellipse {
72     int		    tagged;
73     int		    distrib;
74     int		    type;
75 #define					T_ELLIPSE_BY_RAD	1
76 #define					T_ELLIPSE_BY_DIA	2
77 #define					T_CIRCLE_BY_RAD		3
78 #define					T_CIRCLE_BY_DIA		4
79     int		    style;
80     int		    thickness;
81     Color	    pen_color;
82     Color	    fill_color;
83     int		    fill_style;
84     int		    depth;
85     float	    style_val;
86     int		    pen_style;
87     float	    angle;
88     int		    direction;
89 #define					UNFILLED	-1
90     struct f_pos    center;
91     struct f_pos    radiuses;
92     struct f_pos    start;
93     struct f_pos    end;
94     struct f_ellipse *next;
95 }
96 		F_ellipse;
97 
98 /* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_arc STRUCTURE */
99 
100 typedef struct f_arc {
101     int		    tagged;
102     int		    distrib;
103     int		    type;
104 				/* note: these arc types are the internal values */
105 				/* in the file, they are open=1, wedge=2 */
106 #define					T_OPEN_ARC		0
107 #define					T_PIE_WEDGE_ARC		1
108     int		    style;
109     int		    thickness;
110     Color	    pen_color;
111     Color	    fill_color;
112     int		    fill_style;
113     int		    depth;
114     int		    pen_style;
115     struct f_arrow *for_arrow;
116     struct f_arrow *back_arrow;
117 /* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
118     int		    cap_style;
119     float	    style_val;
120     int		    direction;
121     struct {
122 	float		x, y;
123     }		    center;
124     struct f_pos    point[3];
125     struct f_arc   *next;
126 }
127 		F_arc;
128 
129 #define		CLOSED_PATH		0
130 #define		OPEN_PATH		1
131 #define		DEF_BOXRADIUS		7
132 #define		DEF_DASHLENGTH		4
133 #define		DEF_DOTGAP		3
134 
135 typedef struct f_pic {
136 #ifndef PATH_MAX
137 #define PATH_MAX 128
138 #endif
139     char	    file[PATH_MAX];
140     int		    subtype;
141 #define T_PIC_EPS	1
142 #define T_PIC_BITMAP	2
143 #define T_PIC_PIXMAP	3
144 #define T_PIC_GIF	4
145 #define FileInvalid	-2
146     int		    flipped;
147     unsigned char   *bitmap;
148     int		    numcols;		/* number of colors in cmap */
149     float	    hw_ratio;
150     int		    size_x, size_y;	/* fig units */
151     struct f_pos    bit_size;		/* pixels */
152     Color	    color;		/* only used for XBM */
153     int		    pix_rotation, pix_width, pix_height, pix_flipped;
154 }
155 		F_pic;
156 
157 extern char	EMPTY_PIC[];
158 
159 /* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_line STRUCTURE */
160 
161 typedef struct f_line {
162     int		    tagged;
163     int		    distrib;
164     int		    type;
165 #define					T_POLYLINE	1
166 #define					T_BOX		2
167 #define					T_POLYGON	3
168 #define					T_ARC_BOX	4
169 #define					T_PIC_BOX	5
170     int		    style;
171     int		    thickness;
172     Color	    pen_color;
173     Color	    fill_color;
174     int		    fill_style;
175     int		    depth;
176     int		    pen_style;
177     struct f_arrow *for_arrow;
178     struct f_arrow *back_arrow;
179 /* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
180     int		    cap_style;		/* line cap style - Butt, Round, Bevel */
181 #define					CAP_BUTT	0
182 #define					CAP_ROUND	1
183 #define					CAP_PROJECT	2
184     struct f_point *points;	/* this must immediately follow cap_style */
185     int		    join_style;		/* join style - Miter, Round, Bevel */
186 #define					JOIN_MITER	0
187 #define					JOIN_ROUND	1
188 #define					JOIN_BEVEL	2
189     float	    style_val;
190     int		    radius;		/* corner radius for T_ARC_BOX */
191     struct f_pic   *pic;
192     struct f_line  *next;
193 }
194 		F_line;
195 
196 typedef struct f_text {
197     int		    tagged;
198     int		    distrib;
199     int		    type;
200 #define					T_LEFT_JUSTIFIED	0
201 #define					T_CENTER_JUSTIFIED	1
202 #define					T_RIGHT_JUSTIFIED	2
203     int		    font;
204 /*    PIX_FONT	    fontstruct; */
205     int		    size;	/* point size */
206     Color	    color;
207     int		    depth;
208     float	    angle;	/* in radians */
209 
210     int		    flags;
211 #define					RIGID_TEXT		1
212 #define					SPECIAL_TEXT		2
213 #define					PSFONT_TEXT		4
214 #define					HIDDEN_TEXT		8
215 
216     int		    ascent;	/* Fig units */
217     int		    length;	/* Fig units */
218     int		    descent;	/* from XTextExtents(), not in file */
219     int		    base_x;
220     int		    base_y;
221     int		    pen_style;
222     char	   *cstring;
223     struct f_text  *next;
224 }
225 		F_text;
226 
227 #define MAXFONT(T) (psfont_text(T) ? NUM_FONTS : NUM_LATEX_FONTS)
228 
229 #define		rigid_text(t) \
230 			(t->flags == DEFAULT \
231 				|| (t->flags & RIGID_TEXT))
232 
233 #define		special_text(t) \
234 			((t->flags != DEFAULT \
235 				&& (t->flags & SPECIAL_TEXT)))
236 
237 #define		psfont_text(t) \
238 			(t->flags != DEFAULT \
239 				&& (t->flags & PSFONT_TEXT))
240 
241 #define		hidden_text(t) \
242 			(t->flags != DEFAULT \
243 				&& (t->flags & HIDDEN_TEXT))
244 
245 #define		text_length(t) \
246 			(hidden_text(t) ? hidden_text_length : t->length)
247 
248 #define		using_ps	(cur_textflags & PSFONT_TEXT)
249 
250 typedef struct f_control {
251     float	    lx, ly, rx, ry;
252     struct f_control *next;
253 }
254 		F_control;
255 
256 /* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_spline STRUCTURE */
257 
258 #define		int_spline(s)		(s->type & 0x2)
259 #define		normal_spline(s)	(!(s->type & 0x2))
260 #define		closed_spline(s)	(s->type & 0x1)
261 #define		open_spline(s)		(!(s->type & 0x1))
262 
263 typedef struct f_spline {
264     int		    tagged;
265     int		    distrib;
266     int		    type;
267 #define					T_OPEN_NORMAL	0
268 #define					T_CLOSED_NORMAL 1
269 #define					T_OPEN_INTERP	2
270 #define					T_CLOSED_INTERP 3
271     int		    style;
272     int		    thickness;
273     Color	    pen_color;
274     Color	    fill_color;
275     int		    fill_style;
276     int		    depth;
277     int		    pen_style;
278     struct f_arrow *for_arrow;
279     struct f_arrow *back_arrow;
280 /* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
281     int		    cap_style;
282     /*
283      * For T_OPEN_NORMAL and T_CLOSED_NORMAL points are control points while
284      * they are knots for T_OPEN_INTERP and T_CLOSED_INTERP whose control
285      * points are stored in controls.
286      */
287     struct f_point *points;	/* this must immediately follow cap_style */
288     float	    style_val;
289     struct f_control *controls;
290     struct f_spline *next;
291 }
292 		F_spline;
293 
294 typedef struct f_compound {
295     int		    tagged;
296     int		    distrib;
297     struct f_pos    nwcorner;
298     struct f_pos    secorner;
299     struct f_line  *lines;
300     struct f_ellipse *ellipses;
301     struct f_spline *splines;
302     struct f_text  *texts;
303     struct f_arc   *arcs;
304     struct f_compound *compounds;
305     struct f_compound *next;
306 }
307 		F_compound;
308 
309 typedef struct f_linkinfo {
310     struct f_line  *line;
311     struct f_point *endpt;
312     struct f_point *prevpt;
313     int		    two_pts;
314     struct f_linkinfo *next;
315 }
316 		F_linkinfo;
317 
318 /* separate the "type" and the "style" from the cur_arrowtype */
319 #define		ARROW_TYPE(x)	((x)==0? 0 : ((x)+1)/2)
320 #define		ARROW_STYLE(x)	((x)==0? 0 : ((x)+1)%2)
321 
322 #define		ARROW_SIZE	sizeof(struct f_arrow)
323 #define		POINT_SIZE	sizeof(struct f_point)
324 #define		CONTROL_SIZE	sizeof(struct f_control)
325 #define		ELLOBJ_SIZE	sizeof(struct f_ellipse)
326 #define		ARCOBJ_SIZE	sizeof(struct f_arc)
327 #define		LINOBJ_SIZE	sizeof(struct f_line)
328 #define		TEXOBJ_SIZE	sizeof(struct f_text)
329 #define		SPLOBJ_SIZE	sizeof(struct f_spline)
330 #define		COMOBJ_SIZE	sizeof(struct f_compound)
331 #define		PIC_SIZE	sizeof(struct f_pic)
332 #define		LINKINFO_SIZE	sizeof(struct f_linkinfo)
333 
334 /**********************  object codes  **********************/
335 
336 #define		O_COLOR_DEF	0
337 #define		O_ELLIPSE	1
338 #define		O_POLYLINE	2
339 #define		O_SPLINE	3
340 /* HBB 990329: quick hack: 'O_TEXT' is in use by <fcntl.h> header
341  * on DOS/Windows platforms. Renamed to OBJ_TEXT */
342 #define         OBJ_TEXT          4
343 #define		O_ARC		5
344 #define		O_COMPOUND	6
345 #define		O_END_COMPOUND	-O_COMPOUND
346 #define		O_ALL_OBJECT	99
347 
348 /********************* object masks for update  ************************/
349 
350 #define M_NONE			0x000
351 #define M_POLYLINE_POLYGON	0x001
352 #define M_POLYLINE_LINE		0x002
353 #define M_POLYLINE_BOX		0x004	/* includes ARCBOX */
354 #define M_SPLINE_O_NORMAL	0x008
355 #define M_SPLINE_C_NORMAL	0x010
356 #define M_SPLINE_O_INTERP	0x020
357 #define M_SPLINE_C_INTERP	0x040
358 #define M_TEXT_NORMAL		0x080
359 #define M_TEXT_HIDDEN		0x100
360 #define M_ARC			0x200
361 #define M_ELLIPSE		0x400
362 #define M_COMPOUND		0x800
363 
364 #define M_TEXT		(M_TEXT_HIDDEN | M_TEXT_NORMAL)
365 #define M_SPLINE_O	(M_SPLINE_O_NORMAL | M_SPLINE_O_INTERP)
366 #define M_SPLINE_C	(M_SPLINE_C_NORMAL | M_SPLINE_C_INTERP)
367 #define M_SPLINE_NORMAL (M_SPLINE_O_NORMAL | M_SPLINE_C_NORMAL)
368 #define M_SPLINE_INTERP (M_SPLINE_O_INTERP | M_SPLINE_C_INTERP)
369 #define M_SPLINE	(M_SPLINE_NORMAL | M_SPLINE_INTERP)
370 #define M_POLYLINE	(M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_POLYLINE_BOX)
371 #define M_VARPTS_OBJECT (M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_SPLINE)
372 #define M_OPEN_OBJECT	(M_POLYLINE_LINE | M_SPLINE_O | M_ARC)
373 #define M_ROTATE_ANGLE	(M_VARPTS_OBJECT | M_ARC | M_TEXT | M_COMPOUND | M_ELLIPSE)
374 #define M_ELLTEXTANGLE	(M_ELLIPSE | M_TEXT)
375 #define M_OBJECT	(M_ELLIPSE | M_POLYLINE | M_SPLINE | M_TEXT | M_ARC)
376 #define M_NO_TEXT	(M_ELLIPSE | M_POLYLINE | M_SPLINE | M_COMPOUND | M_ARC)
377 #define M_ALL		(M_OBJECT | M_COMPOUND)
378 
379 /************************  Objects  **********************/
380 
381 extern F_compound objects;
382 
383 /************  global working pointers ************/
384 
385 extern F_line		*cur_l, *new_l, *old_l;
386 extern F_arc		*cur_a, *new_a, *old_a;
387 extern F_ellipse	*cur_e, *new_e, *old_e;
388 extern F_text		*cur_t, *new_t, *old_t;
389 extern F_spline		*cur_s, *new_s, *old_s;
390 extern F_compound	*cur_c, *new_c, *old_c;
391 extern F_point		*first_point, *cur_point;
392 extern F_linkinfo	*cur_links;
393 
394 /*************** object attribute settings ***********/
395 
396 /*  Lines  */
397 extern int	cur_linewidth;
398 extern int	cur_linestyle;
399 extern int	cur_joinstyle;
400 extern int	cur_capstyle;
401 extern float	cur_dashlength;
402 extern float	cur_dotgap;
403 extern float	cur_styleval;
404 extern Color	cur_fillcolor, cur_pencolor;
405 extern int	cur_fillstyle, cur_penstyle;
406 extern int	cur_boxradius;
407 extern int	cur_arrowmode;
408 extern int	cur_arrowtype;
409 extern int	cur_arctype;
410 
411 /* Text */
412 extern int	cur_fontsize;	/* font size */
413 extern int	cur_latex_font;
414 extern int	cur_ps_font;
415 extern int	cur_textjust;
416 extern int	cur_textflags;
417 
418 /* Misc */
419 extern float	cur_elltextangle;
420