/*
 * Copyright (C) 2009-2017 National Technology & Engineering Solutions
 * of Sandia, LLC (NTESS).  Under the terms of Contract DE-NA0003525 with
 * NTESS, the U.S. Government retains certain rights in this software.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *
 *     * Neither the name of NTESS nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
#ifndef DATA_DEF_H
#define DATA_DEF_H
/* ------------------------------------------------------------*/
/* >> DATA STRUCTURE DEFINITIONS                               */
/*-------------------------------------------------------------*/

#include "cgi.h"

/* define a structure to store SVDI attributes */
/* --keeps track of SVDI attribs which have been set for each surface */
/* --these values are stored in CGI terms, not SVDI/NDC terms */
typedef struct
{
  int   fg_color;   /* foreground color for vector */
  int   bg_color;   /* background color for vector */
  float intensity;  /* current intensity */
  int   line_type;  /* current line style */
  float line_width; /* current line width */
  float char_x;     /* current char box size in x */
  float char_y;     /* current char box size in y */
  float fg_rgb[3];  /* foreground color for raster */
  float bg_rgb[3];  /* background color for raster */
} vdi_attrib_struct;

/* state list structure for this device */
/* -- stores state of each surface for this device */
typedef struct
{

  /* cstate.i - definitions for cgi part of state lists for devices
   * 8 Sep 1989 - last date modified
   * Pat McGee, jpm@lanl.gov
   */

  int          cgi_inited;                /* 0 for uninitialized, 1 for inited */
  int          err_flag[MAX_ERROR_CLASS]; /* on or off for each of 7 classes */
  error_report err_queue[ERROR_LIST_SIZE];
  int          err_head_ptr; /* head of error queue */
  int          err_count;    /* count of errors in queue */

  /* ----------control, negotiation and errors---------- */
  /* control state list */
  /* -- control state: */
  int pic_dirty;        /* 0 = clean, 1 = dirty */
  int color_index_prec; /* -1 for bad */

  /* -- VDC to Device mapping: */
  point vdc1;    /* corner 1 of vdc extent */
  point vdc2;    /* corner 2 of vdc extent */
  point vp1;     /* corner 1 of viewport (mode:fraction view surf)*/
  point vp2;     /* corner 1 of viewport (mode:fraction view surf)*/
  point eff_vp1; /* corner 1 of effective viewport */
  point eff_vp2; /* corner 2 of effective viewport */

  /* -- clipping: */
  cenum clip_indicator;    /* on, off  */
  point clip_rect1;        /* corner 1 of requested clip rectangle */
  point clip_rect2;        /* corner 2 of requested clip rectangle */
  cenum ds_clip_indicator; /* off, draw surf clip rect, viewport */

  /* ----------output and attributes---------- */
  /* attribute state lists */
  /* line attributes state list */
  int   line_type;
  float line_width;
  int   line_color[3]; /* use elem 0 for indexed, all 3 for direct*/
  cenum line_csm;      /* csm in which line color was last specified */

  /* marker attributes state list */
  int   mark_type;
  float mark_size;
  int   mark_color[3]; /* use elem 0 for indexed, all 3 for direct*/
  cenum mark_csm;      /* csm in which mark color was last specified */

  /* text attributes state list */
  int   text_color[3]; /* use elem 0 for indexed, all 3 for direct*/
  cenum text_csm;      /* csm in which text color was last specified */
  float char_height;

  /* fill attributes state list */
  int   fill_color[3];  /* use elem 0 for indexed, all 3 for direct*/
  cenum fill_csm;       /* csm in which fill color was last specified */
  int   interior_style; /* 0 = hollow, 1 = solid */

  /* output and attribute control state list */
  cenum csm; /* current color mode:
                  0=direct, 1=indexed, -1=bad*/
  rgb color_table[COLOR_TABLE_SIZE];

  /* end cstate.i */

  int next_free_state; /* for free state list */
  int this_index;      /* index of statelist in array */

  /* SVDI dependent stuff */
  float             xscale;     /* x scale to map VDC to NDC viewport */
  float             yscale;     /* y scale to map VDC to NDC viewport */
  float             xoffset;    /* x offset to map VDC to NDC v.p. */
  float             yoffset;    /* y offset to map VDC to NDC v.p. */
  int               color_set;  /* TRUE = color table set by user */
  vdi_attrib_struct vdi_attrib; /* current vdi attributes */

  /* other info */
  point eff_clip_rect1; /* corner 1 of effective clip rectangle */
  point eff_clip_rect2; /* corner 2 of effective clip rectangle */
  point clipmin;        /* min corner of actual clip region - NDC */
  point clipmax;        /* max corner of actual clip region - NDC */
  int   clip_on;        /* logical - TRUE = clipping is on */
  int   fg_index;       /* for mapping foreground and background */
  int   bg_index;       /*  indices */

  /* device dependent stuff - batch device */
  /* -- BUFFER_SIZE is 0 if interactive device */
  char filename[100];       /* name of file */
  int  file_d;              /* file descriptor - -1 if file not open */
  char buffer[BUFFER_SIZE]; /* for buffering data for output to file */
  int  buff_ptr;            /* keep track of buffer space */

  /* device dependent stuff - interactive device  */
  /* a state list exists for each logical input device as identified
   * by its input class and its input device index.  we support only
   * locator, and 1 input device index.
   */
  int   input_dev_class; /* we only support locator */
  int   input_dev_index; /* we only support 1 */
  cenum input_dev_state; /* ready or released */

} surf_statelist;

/* description table */
/* -- stores description table for this device  - one per device */
typedef struct
{

  /* cdescr.i - definitions for cgi description table */
  /* 9 Sep 1989 - last date modified
   */

  /* ----------control, negotiation and errors---------- */
  /* device identity description table  */
  cenum dev_class; /* device class: IN,OUT,INOUT */
  char  dev_id[4]; /* device identification */

  /* output device description table  */
  cenum  copy_class;       /* hard, soft */
  cenum  display_type;     /* vector,raster,other */
  cenum  bcolor_cap;       /* background color capability */
  cenum  dynamic_mod_bg;   /* dynamic mod accept for bg color */
  cenum  dynamic_mod_map;  /* dynamic mod accept for mapping */
  dpoint dc1;              /* device bottom left corner */
  dpoint dc2;              /* device upper right corner */
  float  draw_surf_width;  /* measured in millimeters */
  float  draw_surf_height; /* measured in millimeters */
  cenum  pix_loc;          /* pixel location */

  /* ----------output and attributes---------- */
  /* attribute description tables */
  /* primitive support description table */
  int   max_pts_polyline;      /* -1,128..n  */
  int   max_pts_disj_polyline; /* -1,0..n    */
  int   max_pts_polygon;       /* -1,0..n    */
  int   max_pts_polygon_set;   /* -1,0..n    */
  int   max_pts_polymarker;    /* -1,128..n  */
  int   max_pts_cellarray;     /* -1,0..n    */
  int   max_pts_closed_fig;    /* -1,0..n    */
  int   max_chars_text;        /* 80..n      */
  cenum cellarray_fill_cap;    /* none,global,local */
  cenum cellarray_align_cap;   /* axis,skewed */
  cenum compound_text_cap;     /* none,global,local */
  cenum compound_fig_cap;      /* none,global,local */

  /* line description table  */
  int linewidth_nominal; /* nominal scaled line width ( >0 ) */
  int linewidth_min;     /* minimum scaled line width ( >0 ) */
  int linewidth_max;     /* maximum scaled line width ( >0 ) */
  int line_types[5];     /* list of available line types */
  int line_widths[5];    /* list of available scale line widths */

  /* marker description table */
  int mark_nominal;  /* nominal scaled marker size ( >0 ) */
  int mark_min;      /* minimum scaled marker size ( >0 ) */
  int mark_max;      /* maximum scaled marker size ( >0 ) */
  int mark_types[1]; /* list of available marker types */
  int mark_sizes[1]; /* list of available scale marker sizes */

  /* text description table */
  /* fill description table */
  cenum interior_styles[2]; /* list of available interior styles */

  /* attribute and control description table */
  int   num_simul_colors;  /* 2..n */
  int   num_avail_colors;  /* 2..n */
  int   num_avail_int;     /* if direct, use all 3 */
  cenum csm_avail;         /* indexed only, indexed and direct */
  cenum dynamic_mod_ct;    /* irg, cbs, imm */
  cenum color_overwrite;   /* irg, cbs, imm */
  cenum monochrome_device; /* no,yes */

  /* end cdescr.i */

  /* SVDI part of description table */
  /* --used to store default SVDI setup and to reinitialize */
  int   set_flag;            /* TRUE = SVDI defaults set, FALSE = not */
  int   svdi_type;           /* 0 = SVDI, 1 = SVDI+raster */
  float xndc_max;            /* max x ndc value */
  float yndc_max;            /* max y ndc value */
  float att_array[14];       /* output status of attributes */
                             /* --stuff stored in CGI terms */
  int   num_cols;            /* number of colors */
  int   col_mode;            /* color mode */
  int   index_array[256];    /* color index array */
  float color_array[256][3]; /* color values */

} dev_descrip_table;

#endif
