#define SCREEN 0
#define POSTSCRIPT 1

enum color_types
{ WHITE, BLACK, DARKGREY, LIGHTGREY, BLUE, GREEN, YELLOW,
  CYAN, RED, DARKGREEN, MAGENTA, BISQUE, LIGHTBLUE, THISTLE, PLUM, KHAKI, 
  CORAL, TURQUOISE, MEDIUMPURPLE, DARKSLATEBLUE, DARKKHAKI, NUM_COLOR
};

enum line_types
{ SOLID, DASHED };

#define MAXPTS 100		/* Maximum number of points drawable by fillpoly */
typedef struct
{
    float x;
    float y;
}
t_point;			/* Used in calls to fillpoly */


/* Routine for X Windows Input.  act_on_button responds to buttons  *
 * being pressed in the graphics area.  drawscreen is the user's    *
 * routine that can redraw all the graphics.                        */

void event_loop(void (*act_on_button) (float x,
				       float y),
		void (*drawscreen) (void));

void init_graphics(char *window_name);	/* Initializes X display */
void close_graphics(void);	/* Closes X display      */

/* Changes message in text area. */
void update_message(char *msg);

/* Normal users shouldn't have to use draw_message.  Should only be *
 * useful if using non-interactive graphics and you want to redraw  *
 * yourself because of an expose.                                   */

void draw_message(void);

/* Sets world coordinates */
void init_world(float xl,
		float yt,
		float xr,
		float yb);

void flushinput(void);		/* Empties event queue */

/* Following routines draw to SCREEN if disp_type = SCREEN *
 * and to a PostScript file if disp_type = POSTSCRIPT      */

void setcolor(int cindex);	/* Use a constant from clist */
int  getcolor();
void setlinestyle(int linestyle);
void setlinewidth(int linewidth);
void setfontsize(int pointsize);
void drawline(float x1,
	      float y1,
	      float x2,
	      float y2);
void drawrect(float x1,
	      float y1,
	      float x2,
	      float y2);
void fillrect(float x1,
	      float y1,
	      float x2,
	      float y2);
void fillpoly(t_point * points,
	      int npoints);

/* Draw or fill a circular arc, respectively.  Angles in degrees.  startang  *
 * measured from positive x-axis of Window.  Positive angextent means        *
 * counterclockwise arc.                                                     */

void drawarc(float xcen,
	     float ycen,
	     float rad,
	     float startang,
	     float angextent);
void fillarc(float xcen,
	     float ycen,
	     float rad,
	     float startang,
	     float angextent);

/* boundx specifies horizontal bounding box.  If text won't fit in    *
 * the space specified by boundx (world coordinates) text isn't drawn */

void drawtext(float xc,
	      float yc,
	      const char *text,
	      float boundx);
void clearscreen(void);		/* Erases the screen */


/* Functions for creating and destroying extra menu buttons. */

void create_button(char *prev_button_text,
		   char *button_text,
		   void (*button_func) (void (*drawscreen) (void)));
void destroy_button(char *button_text);


/* Opens file for postscript commands and initializes it.  All subsequent  *
 * drawing commands go to this file until close_postscript is called.      */

int init_postscript(char *fname);	/* Returns 1 if successful */

/* Closes file and directs output to screen again.       */

void close_postscript(void);
