/*
   (C) 2001 by Argonne National Laboratory.
       See COPYRIGHT in top-level directory.
*/
#ifndef _MPE_GRAPHICS_
#define _MPE_GRAPHICS_

#ifdef MPE_NOMPI
typedef int MPI_Comm;
#else
#include "mpi.h"
#endif

#if defined(NEEDS_STDLIB_PROTOTYPES)
#include "protofix.h"
#endif

#define MPE_SUCCESS        0           /* successful operation */
#define MPE_ERR_NOXCONNECT 1           /* could not connect to X server */
#define MPE_ERR_BAD_ARGS   2           /* graphics handle invalid */
#define MPE_ERR_LOW_MEM    3           /* out of memory (malloc() failed) */

/* See colornames in baseclr.h */
typedef enum { MPE_WHITE = 0, MPE_BLACK = 1, MPE_RED = 2, MPE_YELLOW = 3, 
	       MPE_GREEN = 4, MPE_CYAN = 5, MPE_BLUE = 6, MPE_MAGENTA = 7,
               MPE_AQUAMARINE = 8, MPE_FORESTGREEN = 9, MPE_ORANGE = 10, 
	       MPE_MAROON = 11, MPE_BROWN = 12, MPE_PINK = 13, MPE_CORAL = 14, 
               MPE_GRAY = 15} MPE_Color;

extern int MPE_buttonArray[];
extern int MPE_logicArray[];

  /* given existing pixel 'dst' and new, overlapping pixel 'src' */
#define MPE_LOGIC_CLEAR        (MPE_logicArray[0])
#define MPE_LOGIC_AND          (MPE_logicArray[1])
#define MPE_LOGIC_ANDREVERSE   (MPE_logicArray[2])
#define MPE_LOGIC_COPY         (MPE_logicArray[3])
#define MPE_LOGIC_ANDINVERTED  (MPE_logicArray[4])
#define MPE_LOGIC_NOOP         (MPE_logicArray[5])
#define MPE_LOGIC_XOR          (MPE_logicArray[6])
#define MPE_LOGIC_OR           (MPE_logicArray[7])
#define MPE_LOGIC_NOR          (MPE_logicArray[8])
#define MPE_LOGIC_EQUIV        (MPE_logicArray[9])
#define MPE_LOGIC_INVERT       (MPE_logicArray[10])
#define MPE_LOGIC_ORREVERSE    (MPE_logicArray[11])
#define MPE_LOGIC_COPYINVERTED (MPE_logicArray[12])
#define MPE_LOGIC_ORINVERTED   (MPE_logicArray[13])
#define MPE_LOGIC_NAND         (MPE_logicArray[14])
#define MPE_LOGIC_SET          (MPE_logicArray[15])

#define MPE_BUTTON1 (MPE_buttonArray[0])
#define MPE_BUTTON2 (MPE_buttonArray[1])
#define MPE_BUTTON3 (MPE_buttonArray[2])
#define MPE_BUTTON4 (MPE_buttonArray[3])
#define MPE_BUTTON5 (MPE_buttonArray[4])


/* types of visuals for Get_drag_region */
#define MPE_DRAG_NONE 0		     /* no visual */
#define MPE_DRAG_RECT 1		     /* rubber band box */
#define MPE_DRAG_LINE 2		     /* rubber band line */
#define MPE_DRAG_CIRCLE_RADIUS 3     /* rubber band circle, */
    /* one point is the center of the circle, other point is on the circle */
#define MPE_DRAG_CIRCLE_DIAMETER 4
    /* each point is on opposite sides of the circle */
#define MPE_DRAG_CIRCLE_BBOX 5
    /* the two points define a bounding box inside which is drawn a circle */
#define MPE_DRAG_OVAL_BBOX 6
    /* the two points define a bounding box inside which is drawn an oval */
#define MPE_DRAG_SQUARE 7


#ifdef MPE_INTERNAL
#include "mpetools.h"
#include "basex11.h"

typedef struct MPE_XGraph_s *MPE_XGraph;
struct MPE_XGraph_s {
  int      Cookie;
  XBWindow *xwin;
  int      backingStore;	/* NotUseful, WhenMapped, or Always */
  MPI_Comm comm;
  int      is_collective;
  char     *display_name;       /* Used to allow us to run other tools ... */
  char     *capture_file;       /* Used to capture output at update */
  int      capture_num, 
           capture_cnt, 
           capture_freq;
  /* 
     The following are for event-driven input.
     This simple interface allows an advanced user to always watch for
     certain events (like keypress) without requiring all code 
     We also need to define a wait-for-user-event routine 

     The alternative is to have a chain of event handlers; adding one
     creates a new entry in the chain.  For this, there needs to be
     an event_routine structure, that has (user routine) and (next).
   */
  long     input_mask;          /* Input mask of enabled events */
    /* Routine to call for events */
  int      (*event_routine) ( MPE_XGraph, XEvent * );  

    /* The following are used to provide a Fortran interface on systems
       where pointers are longer than Fortran integers */
  int      fort_index;
  MPE_XGraph next;
};
#define MPE_G_COOKIE 0xfeeddada

#define MPE_XEVT_IDLE_MASK 0
/* normal XEvent mask; what it should be set to during normal processing */
/* Eventually, this should be ExposureMask or more */

#else

typedef void *MPE_XGraph;

#endif

typedef struct MPE_Point_ {
  int x, y;
  MPE_Color c;
} MPE_Point;

#define MPE_GRAPH_INDEPDENT  0
#define MPE_GRAPH_INDEPENDENT MPE_GRAPH_INDEPDENT
#define MPE_GRAPH_COLLECTIVE 1

extern int MPE_Open_graphics ( MPE_XGraph *, MPI_Comm, 
	   char *, int, int, int, int, int );

extern int MPE_Draw_point ( MPE_XGraph, int, int, MPE_Color );

extern int MPE_Draw_line ( MPE_XGraph, int, int, int, int, MPE_Color );

extern int MPE_Draw_circle ( MPE_XGraph, int, int, int, MPE_Color );

extern int MPE_Draw_string ( MPE_XGraph, int, int, MPE_Color, char * );

extern int MPE_Fill_rectangle ( MPE_XGraph, int, int, int, int, MPE_Color );

extern int MPE_Update ( MPE_XGraph );

extern int MPE_Num_colors ( MPE_XGraph, int * );

extern int MPE_Make_color_array ( MPE_XGraph, int, MPE_Color [] );

extern int MPE_Close_graphics ( MPE_XGraph * );

extern int MPE_CaptureFile ( MPE_XGraph, char *, int );

extern int MPE_Draw_points ( MPE_XGraph, MPE_Point *, int );

extern int MPE_Fill_circle ( MPE_XGraph, int, int, int, MPE_Color );

extern int MPE_Draw_logic  ( MPE_XGraph, int );

extern int MPE_Line_thickness ( MPE_XGraph, int );

extern int MPE_Draw_dashes ( MPE_XGraph, int );

extern int MPE_Dash_offset ( MPE_XGraph, int );

extern int MPE_Add_RGB_color ( MPE_XGraph, int, int, int, MPE_Color * );

extern int MPE_Xerror ( int, char * );

/* xmouse */
extern int MPE_Get_mouse_press ( MPE_XGraph, int *, int *, int * );
extern int MPE_Iget_mouse_press ( MPE_XGraph, int *, int *, int *, int * );
extern int MPE_Get_drag_region ( MPE_XGraph, int, int, 
				 int *, int *, int *, int * );
extern int MPE_Get_drag_region_fixratio ( MPE_XGraph, int, double, 
 	  			          int *, int *, int *, int * );

#endif
