/** \file
 * \brief CGM library
 * Extracted from GKS/PUC
 *
 * See Copyright Notice in cd.h
 */

#ifndef __CGM_H
#define __CGM_H

typedef struct _cgmFunc CGMFUNC;

typedef struct {
  FILE       *file;      /* file pointer */

  const CGMFUNC *func;   /* functions */

  int         mode;      /* character, binary, clear text */

  int         vdc_type,  /* integer, real */
              int_prec,  /* 8, 16, 24, 32 */
              real_prec, /* float*32, float*64, fixed*32, fixed*64 */
              ix_prec,   /* 8, 16, 24, 32 */
              cd_prec,   /* 8, 16, 24, 32 */
              cix_prec,  /* 8, 16, 24, 32 */
              max_cix;   /* maximum colour index */

  int         clrsm,     /* indexed, direct */
              lnwsm,     /* absolute, scaled */
              mkssm,     /* absolute, scaled */
              edwsm;     /* absolute, scaled */
  int         vdc_int,   /* X, 16, 24, 32 */
              vdc_real;  /* float*32, float*64, fixed*32, fixed*64 */

  int         vdc_size,  /* 2, 3, 4, 8 */
              int_size,  /* 1, 2, 3, 4 */
              real_size, /* 4, 8 */
              ix_size,   /* 1, 2, 3, 4 */
              cd_size,   /* 1, 2, 3, 4 */
              cix_size,  /* 1, 2, 3, 4 */
              clr_size,  /* 3 * cd_size , cix_size */
              lnw_size,  /* 2, 3, 4, 8 */
              mks_size,  /* 2, 3, 4, 8 */
              edw_size;  /* 2, 3, 4, 8 */

  int         cl;        /* coluna para alinhamento */

  int         op;        /* commands opened */
  int         bc[5];     /* bytes count for command */
  long        po[5];     /* position offset do arquivo */
} CGM;

CGM *cgm_begin_metafile		( char *, int, char * );
int cgm_end_metafile		( CGM * );
int cgm_begin_picture		( CGM *, const char * );
int cgm_begin_picture_body	( CGM * );
int cgm_end_picture		( CGM * );
int cgm_metafile_version	( CGM *, long );
int cgm_metafile_description	( CGM *, const char * );
int cgm_vdc_type		( CGM *, int );
int cgm_integer_precision	( CGM *, int );
int cgm_real_precision		( CGM *, int );
int cgm_index_precision		( CGM *, int );
int cgm_colour_precision	( CGM *, int );
int cgm_colour_index_precision	( CGM *, int );
int cgm_maximum_colour_index	( CGM *, unsigned long );
int cgm_colour_value_extent	( CGM *, const double *, const double * );
int cgm_metafile_element_list	( CGM *, int, const int *, const int * );
int cgm_begin_metafile_defaults	( CGM * );
int cgm_end_metafile_defaults	( CGM * );
int cgm_font_list		( CGM *, const char *l[] );
int cgm_scaling_mode		( CGM *, int, float );
int cgm_colour_selection_mode	( CGM *, int );
int cgm_line_width_specify_mode	( CGM *, int );
int cgm_marker_size_specify_mode( CGM *, int );
int cgm_edge_width_specify_mode	( CGM *, int );
int cgm_vdc_extent		( CGM *, double, double, double, double );
int cgm_backgound_colour	( CGM *, const double * );
int cgm_vdc_integer_precision	( CGM *, int );
int cgm_vdc_real_precision	( CGM *, int );
int cgm_auxiliary_colour	( CGM *, const void * );
int cgm_transparency		( CGM *, int );
int cgm_clip_rectangle		( CGM *, double, double, double, double );
int cgm_clip_indicator		( CGM *, int );
int cgm_polyline		( CGM *, int, const double * );
int cgm_polymarker		( CGM *, int, const double * );
int cgm_text			( CGM *, int, double, double, const char *, int);
int cgm_polygon			( CGM *, int, const double * );
int cgm_cell_array		( CGM *, const double *, long, long, int, const void * );
int cgm_rectangle		( CGM *, const double * );
int cgm_elliptical_arc		( CGM *, const double *, const double *, const double *, double, double, double, double );
int cgm_elliptical_arc_close    ( CGM *, const double *, const double *, const double *, double, double, double, double, int );
int cgm_line_bundle_index	( CGM *, long );
int cgm_line_type		( CGM *, long );
int cgm_line_width		( CGM *, double );
int cgm_line_colour		( CGM *, const void * );
int cgm_marker_bundle_index	( CGM *, long );
int cgm_marker_type		( CGM *, long );
int cgm_marker_size		( CGM *, double );
int cgm_marker_colour		( CGM *, const void * );
int cgm_text_bundle_index	( CGM *, long );
int cgm_text_font_index		( CGM *, long );
int cgm_text_precision		( CGM *, int );
int cgm_char_expansion_factor	( CGM *, double );
int cgm_char_spacing		( CGM *, double );
int cgm_text_colour		( CGM *, const void * );
int cgm_char_height		( CGM *, double );
int cgm_char_orientation	( CGM *, double, double, double, double );
int cgm_text_path		( CGM *, int );
int cgm_text_alignment		( CGM *, int, int, double, double );
int cgm_fill_bundle_index	( CGM *, long );
int cgm_interior_style		( CGM *, int );
int cgm_fill_colour		( CGM *, const void * );
int cgm_hatch_index		( CGM *, long );
int cgm_pattern_index		( CGM *, long );
int cgm_edge_width              ( CGM *, double );
int cgm_edge_colour             ( CGM *, const void * );
int cgm_edge_visibility		( CGM *, int );
int cgm_fill_reference_point	( CGM *, double, double );
int cgm_pattern_table		( CGM *, long, long, long, int, const void * );
int cgm_pattern_size		( CGM *, double, double, double, double );
int cgm_colour_table		( CGM *, long, long, const double * );
int cgm_asfs			( CGM *, int, const int *, const int * );
int cgm_message			( CGM *, int, const char * );

enum {
      LINE_SOLID=1,
      LINE_DASH=2,
      LINE_DOT=3,
      LINE_DASH_DOT=4,
      LINE_DASH_DOT_DOT=5
     };

enum {
      MARKER_DOT=1,
      MARKER_PLUS=2,
      MARKER_ASTERISK=3,
      MARKER_CIRCLE=4,
      MARKER_CROSS=5
     };

enum {
      HOLLOW,
      SOLID,
      PAT,
      HATCH,
      EMPTY
     };

enum {                          /* encoding */
      CD_CHARACTER,
      CD_BIN,
      CD_CLEAR_TEXT
     };

#endif