/*
 * FIG : Facility for Interactive Generation of figures
 * Copyright (c) 1985 by Supoj Sutanthavibul
 * Parts Copyright (c) 1994 by Brian V. Smith
 * Parts Copyright (c) 1991 by Paul King
 *
 * The X Consortium, and any party obtaining a copy of these files from
 * the X Consortium, directly or indirectly, is granted, free of charge, a
 * full and unrestricted irrevocable, world-wide, paid up, royalty-free,
 * nonexclusive right and license to deal in this software and
 * documentation files (the "Software"), including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons who receive
 * copies from any such party to do so, with the only requirement being
 * that this copyright notice remain intact.  This license includes without
 * limitation a license to do the foregoing actions under any patents of
 * the party supplying this software to the X Consortium.
 */

/* This file has been modified for use with Gnuplot 3.6 by
 * Ian MacPhedran.
 */

/* DEFAULT is used for many things - font, color etc */

#define		DEFAULT		      (-1)
#define		SOLID_LINE		0
#define		DASH_LINE		1
#define		DOTTED_LINE		2
#define		RUBBER_LINE		3
#define		PANEL_LINE		4

#define		Color			int

#define		BLACK			0
#define		BLUE			1
#define		GREEN			2
#define		CYAN			3
#define		RED			4
#define		MAGENTA			5
#define		YELLOW			6
#define		WHITE			7

/** VERY IMPORTANT:  The f_line, f_spline and f_arc objects all must have the
		components up to and including the arrows in the same order.
		This is for the get/put_generic_arrows() in e_edit.c.
**/

typedef struct f_point {
    int		    x, y;
}
		F_point;

typedef struct f_pos {
    int		    x, y;
}
		F_pos;

#define DEF_ARROW_WID (4 * ZOOM_FACTOR)
#define DEF_ARROW_HT (8 * ZOOM_FACTOR)

typedef struct f_arrow {
    int		    type;
    int		    style;
    float	    thickness;
    float	    wid;
    float	    ht;
}
		F_arrow;

typedef struct f_ellipse {
    int		    tagged;
    int		    distrib;
    int		    type;
#define					T_ELLIPSE_BY_RAD	1
#define					T_ELLIPSE_BY_DIA	2
#define					T_CIRCLE_BY_RAD		3
#define					T_CIRCLE_BY_DIA		4
    int		    style;
    int		    thickness;
    Color	    pen_color;
    Color	    fill_color;
    int		    fill_style;
    int		    depth;
    float	    style_val;
    int		    pen_style;
    float	    angle;
    int		    direction;
#define					UNFILLED	-1
    struct f_pos    center;
    struct f_pos    radiuses;
    struct f_pos    start;
    struct f_pos    end;
    struct f_ellipse *next;
}
		F_ellipse;

/* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_arc STRUCTURE */

typedef struct f_arc {
    int		    tagged;
    int		    distrib;
    int		    type;
				/* note: these arc types are the internal values */
				/* in the file, they are open=1, wedge=2 */
#define					T_OPEN_ARC		0
#define					T_PIE_WEDGE_ARC		1
    int		    style;
    int		    thickness;
    Color	    pen_color;
    Color	    fill_color;
    int		    fill_style;
    int		    depth;
    int		    pen_style;
    struct f_arrow *for_arrow;
    struct f_arrow *back_arrow;
/* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
    int		    cap_style;
    float	    style_val;
    int		    direction;
    struct {
	float		x, y;
    }		    center;
    struct f_pos    point[3];
    struct f_arc   *next;
}
		F_arc;

#define		CLOSED_PATH		0
#define		OPEN_PATH		1
#define		DEF_BOXRADIUS		7
#define		DEF_DASHLENGTH		4
#define		DEF_DOTGAP		3

typedef struct f_pic {
#ifndef PATH_MAX
#define PATH_MAX 128
#endif
    char	    file[PATH_MAX];
    int		    subtype;
#define T_PIC_EPS	1
#define T_PIC_BITMAP	2
#define T_PIC_PIXMAP	3
#define T_PIC_GIF	4
#define FileInvalid	-2
    int		    flipped;
    unsigned char   *bitmap;
    int		    numcols;		/* number of colors in cmap */
    float	    hw_ratio;
    int		    size_x, size_y;	/* fig units */
    struct f_pos    bit_size;		/* pixels */
    Color	    color;		/* only used for XBM */
    int		    pix_rotation, pix_width, pix_height, pix_flipped;
}
		F_pic;

extern char	EMPTY_PIC[];

/* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_line STRUCTURE */

typedef struct f_line {
    int		    tagged;
    int		    distrib;
    int		    type;
#define					T_POLYLINE	1
#define					T_BOX		2
#define					T_POLYGON	3
#define					T_ARC_BOX	4
#define					T_PIC_BOX	5
    int		    style;
    int		    thickness;
    Color	    pen_color;
    Color	    fill_color;
    int		    fill_style;
    int		    depth;
    int		    pen_style;
    struct f_arrow *for_arrow;
    struct f_arrow *back_arrow;
/* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
    int		    cap_style;		/* line cap style - Butt, Round, Bevel */
#define					CAP_BUTT	0
#define					CAP_ROUND	1
#define					CAP_PROJECT	2
    struct f_point *points;	/* this must immediately follow cap_style */
    int		    join_style;		/* join style - Miter, Round, Bevel */
#define					JOIN_MITER	0
#define					JOIN_ROUND	1
#define					JOIN_BEVEL	2
    float	    style_val;
    int		    radius;		/* corner radius for T_ARC_BOX */
    struct f_pic   *pic;
    struct f_line  *next;
}
		F_line;

typedef struct f_text {
    int		    tagged;
    int		    distrib;
    int		    type;
#define					T_LEFT_JUSTIFIED	0
#define					T_CENTER_JUSTIFIED	1
#define					T_RIGHT_JUSTIFIED	2
    int		    font;
/*    PIX_FONT	    fontstruct; */
    int		    size;	/* point size */
    Color	    color;
    int		    depth;
    float	    angle;	/* in radians */

    int		    flags;
#define					RIGID_TEXT		1
#define					SPECIAL_TEXT		2
#define					PSFONT_TEXT		4
#define					HIDDEN_TEXT		8

    int		    ascent;	/* Fig units */
    int		    length;	/* Fig units */
    int		    descent;	/* from XTextExtents(), not in file */
    int		    base_x;
    int		    base_y;
    int		    pen_style;
    char	   *cstring;
    struct f_text  *next;
}
		F_text;

#define MAXFONT(T) (psfont_text(T) ? NUM_FONTS : NUM_LATEX_FONTS)

#define		rigid_text(t) \
			(t->flags == DEFAULT \
				|| (t->flags & RIGID_TEXT))

#define		special_text(t) \
			((t->flags != DEFAULT \
				&& (t->flags & SPECIAL_TEXT)))

#define		psfont_text(t) \
			(t->flags != DEFAULT \
				&& (t->flags & PSFONT_TEXT))

#define		hidden_text(t) \
			(t->flags != DEFAULT \
				&& (t->flags & HIDDEN_TEXT))

#define		text_length(t) \
			(hidden_text(t) ? hidden_text_length : t->length)

#define		using_ps	(cur_textflags & PSFONT_TEXT)

typedef struct f_control {
    float	    lx, ly, rx, ry;
    struct f_control *next;
}
		F_control;

/* SEE NOTE AT TOP BEFORE CHANGING ANYTHING IN THE f_spline STRUCTURE */

#define		int_spline(s)		(s->type & 0x2)
#define		normal_spline(s)	(!(s->type & 0x2))
#define		closed_spline(s)	(s->type & 0x1)
#define		open_spline(s)		(!(s->type & 0x1))

typedef struct f_spline {
    int		    tagged;
    int		    distrib;
    int		    type;
#define					T_OPEN_NORMAL	0
#define					T_CLOSED_NORMAL 1
#define					T_OPEN_INTERP	2
#define					T_CLOSED_INTERP 3
    int		    style;
    int		    thickness;
    Color	    pen_color;
    Color	    fill_color;
    int		    fill_style;
    int		    depth;
    int		    pen_style;
    struct f_arrow *for_arrow;
    struct f_arrow *back_arrow;
/* THE PRECEDING VARS MUST BE IN THE SAME ORDER IN f_arc, f_line and f_spline */
    int		    cap_style;
    /*
     * For T_OPEN_NORMAL and T_CLOSED_NORMAL points are control points while
     * they are knots for T_OPEN_INTERP and T_CLOSED_INTERP whose control
     * points are stored in controls.
     */
    struct f_point *points;	/* this must immediately follow cap_style */
    float	    style_val;
    struct f_control *controls;
    struct f_spline *next;
}
		F_spline;

typedef struct f_compound {
    int		    tagged;
    int		    distrib;
    struct f_pos    nwcorner;
    struct f_pos    secorner;
    struct f_line  *lines;
    struct f_ellipse *ellipses;
    struct f_spline *splines;
    struct f_text  *texts;
    struct f_arc   *arcs;
    struct f_compound *compounds;
    struct f_compound *next;
}
		F_compound;

typedef struct f_linkinfo {
    struct f_line  *line;
    struct f_point *endpt;
    struct f_point *prevpt;
    int		    two_pts;
    struct f_linkinfo *next;
}
		F_linkinfo;

/* separate the "type" and the "style" from the cur_arrowtype */
#define		ARROW_TYPE(x)	((x)==0? 0 : ((x)+1)/2)
#define		ARROW_STYLE(x)	((x)==0? 0 : ((x)+1)%2)

#define		ARROW_SIZE	sizeof(struct f_arrow)
#define		POINT_SIZE	sizeof(struct f_point)
#define		CONTROL_SIZE	sizeof(struct f_control)
#define		ELLOBJ_SIZE	sizeof(struct f_ellipse)
#define		ARCOBJ_SIZE	sizeof(struct f_arc)
#define		LINOBJ_SIZE	sizeof(struct f_line)
#define		TEXOBJ_SIZE	sizeof(struct f_text)
#define		SPLOBJ_SIZE	sizeof(struct f_spline)
#define		COMOBJ_SIZE	sizeof(struct f_compound)
#define		PIC_SIZE	sizeof(struct f_pic)
#define		LINKINFO_SIZE	sizeof(struct f_linkinfo)

/**********************  object codes  **********************/

#define		O_COLOR_DEF	0
#define		O_ELLIPSE	1
#define		O_POLYLINE	2
#define		O_SPLINE	3
#define		O_TEXT		4
#define		O_ARC		5
#define		O_COMPOUND	6
#define		O_END_COMPOUND	-O_COMPOUND
#define		O_ALL_OBJECT	99

/********************* object masks for update  ************************/

#define M_NONE			0x000
#define M_POLYLINE_POLYGON	0x001
#define M_POLYLINE_LINE		0x002
#define M_POLYLINE_BOX		0x004	/* includes ARCBOX */
#define M_SPLINE_O_NORMAL	0x008
#define M_SPLINE_C_NORMAL	0x010
#define M_SPLINE_O_INTERP	0x020
#define M_SPLINE_C_INTERP	0x040
#define M_TEXT_NORMAL		0x080
#define M_TEXT_HIDDEN		0x100
#define M_ARC			0x200
#define M_ELLIPSE		0x400
#define M_COMPOUND		0x800

#define M_TEXT		(M_TEXT_HIDDEN | M_TEXT_NORMAL)
#define M_SPLINE_O	(M_SPLINE_O_NORMAL | M_SPLINE_O_INTERP)
#define M_SPLINE_C	(M_SPLINE_C_NORMAL | M_SPLINE_C_INTERP)
#define M_SPLINE_NORMAL (M_SPLINE_O_NORMAL | M_SPLINE_C_NORMAL)
#define M_SPLINE_INTERP (M_SPLINE_O_INTERP | M_SPLINE_C_INTERP)
#define M_SPLINE	(M_SPLINE_NORMAL | M_SPLINE_INTERP)
#define M_POLYLINE	(M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_POLYLINE_BOX)
#define M_VARPTS_OBJECT (M_POLYLINE_LINE | M_POLYLINE_POLYGON | M_SPLINE)
#define M_OPEN_OBJECT	(M_POLYLINE_LINE | M_SPLINE_O | M_ARC)
#define M_ROTATE_ANGLE	(M_VARPTS_OBJECT | M_ARC | M_TEXT | M_COMPOUND | M_ELLIPSE)
#define M_ELLTEXTANGLE	(M_ELLIPSE | M_TEXT)
#define M_OBJECT	(M_ELLIPSE | M_POLYLINE | M_SPLINE | M_TEXT | M_ARC)
#define M_NO_TEXT	(M_ELLIPSE | M_POLYLINE | M_SPLINE | M_COMPOUND | M_ARC)
#define M_ALL		(M_OBJECT | M_COMPOUND)

/************************  Objects  **********************/

extern F_compound objects;

/************  global working pointers ************/

extern F_line		*cur_l, *new_l, *old_l;
extern F_arc		*cur_a, *new_a, *old_a;
extern F_ellipse	*cur_e, *new_e, *old_e;
extern F_text		*cur_t, *new_t, *old_t;
extern F_spline		*cur_s, *new_s, *old_s;
extern F_compound	*cur_c, *new_c, *old_c;
extern F_point		*first_point, *cur_point;
extern F_linkinfo	*cur_links;

/*************** object attribute settings ***********/

/*  Lines  */
extern int	cur_linewidth;
extern int	cur_linestyle;
extern int	cur_joinstyle;
extern int	cur_capstyle;
extern float	cur_dashlength;
extern float	cur_dotgap;
extern float	cur_styleval;
extern Color	cur_fillcolor, cur_pencolor;
extern int	cur_fillstyle, cur_penstyle;
extern int	cur_boxradius;
extern int	cur_arrowmode;
extern int	cur_arrowtype;
extern int	cur_arctype;

/* Text */
extern int	cur_fontsize;	/* font size */
extern int	cur_latex_font;
extern int	cur_ps_font;
extern int	cur_textjust;
extern int	cur_textflags;

/* Misc */
extern float	cur_elltextangle;
