/*
 * Attrs.h -- Header for the attribute manipulation routines.
 *
 * Authors              : Patrick Lecoanet.
 * Creation date        : Fri Dec 31 10:06:37 1999
 *
 * $Id: Attrs.h,v 1.9 2005/04/27 07:32:03 lecoanet Exp $
 */

/*
 *  Copyright (c) 1993 - 2005 CENA, Patrick Lecoanet --
 *
 * See the file "Copyright" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 */


#ifndef _Attrs_h
#define _Attrs_h

#ifdef __CPLUSPLUS__
extern "C" {
#endif


#include <Types.h>
  

struct _ZnWInfo;

/*
 * Type and constant values for line styles.
 */
typedef unsigned char   ZnLineStyle;

#define ZN_LINE_SIMPLE  0
#define ZN_LINE_DASHED  1
#define ZN_LINE_MIXED   2
#define ZN_LINE_DOTTED  3

int ZnGetLineStyle(struct _ZnWInfo *wi, char *name, ZnLineStyle *line_style);
char *ZnNameOfLineStyle(ZnLineStyle line_style);


/*
 * Type and constant values for line shapes.
 */
typedef unsigned char   ZnLineShape;

#define ZN_LINE_STRAIGHT                0
#define ZN_LINE_LEFT_LIGHTNING          1
#define ZN_LINE_LEFT_CORNER             2
#define ZN_LINE_DOUBLE_LEFT_CORNER      3
#define ZN_LINE_RIGHT_LIGHTNING         4
#define ZN_LINE_RIGHT_CORNER            5
#define ZN_LINE_DOUBLE_RIGHT_CORNER     6

int ZnGetLineShape(struct _ZnWInfo *wi, char *name, ZnLineShape *line_shape);
char *ZnNameOfLineShape(ZnLineShape line_shape);


/*
 * Type and constant values for relief styles.
 */
typedef unsigned char   ZnReliefStyle;
#define ZN_RELIEF_FLAT          0
#define ZN_RELIEF_RAISED        1
#define ZN_RELIEF_SUNKEN        2
#define ZN_RELIEF_GROOVE        (ZN_RELIEF_TWO_FACES|ZN_RELIEF_SUNKEN)
#define ZN_RELIEF_RIDGE         (ZN_RELIEF_TWO_FACES|ZN_RELIEF_RAISED)
#define ZN_RELIEF_ROUND_SUNKEN  (ZN_RELIEF_ROUND|ZN_RELIEF_SUNKEN)
#define ZN_RELIEF_ROUND_RAISED  (ZN_RELIEF_ROUND|ZN_RELIEF_RAISED)
#define ZN_RELIEF_ROUND_GROOVE  (ZN_RELIEF_ROUND|ZN_RELIEF_TWO_FACES|ZN_RELIEF_SUNKEN)
#define ZN_RELIEF_ROUND_RIDGE   (ZN_RELIEF_ROUND|ZN_RELIEF_TWO_FACES|ZN_RELIEF_RAISED)
#define ZN_RELIEF_SUNKEN_RULE   (ZN_RELIEF_ROUND|ZN_RELIEF_TWO_FACES|ZN_RELIEF_SUNKEN|ZN_RELIEF_RULE)
#define ZN_RELIEF_RAISED_RULE   (ZN_RELIEF_ROUND|ZN_RELIEF_TWO_FACES|ZN_RELIEF_RAISED|ZN_RELIEF_RULE)
#define ZN_RELIEF_ROUND         0x80
#define ZN_RELIEF_TWO_FACES     0x40
#define ZN_RELIEF_RULE          0x20
#define ZN_RELIEF_MASK          0x3

/*
 * Number of steps for relief drawing. This translate in
 * RELIEF_STEPS*2+1 color shades in the color gradient.
 */
#define ZN_RELIEF_STEPS         6
  
int ZnGetRelief(struct _ZnWInfo *wi, char *name, ZnReliefStyle *relief);
char *ZnNameOfRelief(ZnReliefStyle relief);


/*
 * Type and constant values for borders.
 */
typedef unsigned char   ZnBorder;
#define ZN_NO_BORDER            0
#define ZN_LEFT_BORDER          1
#define ZN_RIGHT_BORDER         2
#define ZN_TOP_BORDER           4
#define ZN_BOTTOM_BORDER        8
#define ZN_CONTOUR_BORDER       (ZN_LEFT_BORDER|ZN_RIGHT_BORDER|ZN_TOP_BORDER|ZN_BOTTOM_BORDER)
#define ZN_COUNTER_OBLIQUE      16
#define ZN_OBLIQUE              32

void ZnNameOfBorder(ZnBorder border, char *str);
int ZnGetBorder(struct _ZnWInfo *wi, Tcl_Obj *name, ZnBorder *border);


/*
 * Type for leader anchors.
 */
typedef struct {
  int           left_x;         /* left leader anchor field or percent of bbox */
  int           right_x;        /* right leader anchor field or percent of bbox */
  short         left_y;         /* left leader percent of bbox or < 0 if field */
  short         right_y;        /* right leader percent of bbox or < 0 if field */
} ZnLeaderAnchorsStruct, *ZnLeaderAnchors;

int ZnGetLeaderAnchors(struct _ZnWInfo *wi, char *name, ZnLeaderAnchors *leader_anchors);
void ZnNameOfLeaderAnchors(ZnLeaderAnchors leader_anchors, char *name);


/*
 * Type and constant values for automatic alignments.
 */
typedef struct {
  ZnBool        automatic;
  Tk_Justify    align[3];
} ZnAutoAlign;
#define ZN_AA_LEFT              0
#define ZN_AA_CENTER            1
#define ZN_AA_RIGHT             2

int ZnGetAutoAlign(struct _ZnWInfo *wi, char *name, ZnAutoAlign *aa);
void ZnNameOfAutoAlign(ZnAutoAlign *aa, char *name);


/*
 * Label Formats.
 */
  
/*
 * field flags.
 */
#define ZN_LF_ATTACH_PIXEL      0
#define ZN_LF_ATTACH_FWD        1
#define ZN_LF_ATTACH_BWD        2
#define ZN_LF_ATTACH_LEFT       3       /* Align left on left or top on top */
#define ZN_LF_ATTACH_RIGHT      4       /* Align right on right or bottom on bottom */

#define ZN_LF_DIM_PIXEL 0
#define ZN_LF_DIM_FONT  1
#define ZN_LF_DIM_ICON  2
#define ZN_LF_DIM_AUTO  3
#define ZN_LF_DIM_LABEL 4
  
typedef struct {
  int   x_spec;
  int   y_spec;
  short width_spec;
  short height_spec;
  char  x_attach;
  char  y_attach;
  char  x_dim;
  char  y_dim;
} ZnFieldFormatStruct, *ZnFieldFormat;

typedef struct {
  short         clip_width;
  short         clip_height;
  unsigned int  num_fields;
  Tcl_HashEntry *entry;
  unsigned int  ref_count;
  ZnFieldFormatStruct fields[1];
} ZnLabelFormatStruct, *ZnLabelFormat;
  

ZnLabelFormat
ZnLFCreate(Tcl_Interp   * /* interp */,
           char         * /* format_str */,
           unsigned int /* num_fields */);
ZnLabelFormat
ZnLFDuplicate(ZnLabelFormat     /* label_format */);
void
ZnLFDelete(ZnLabelFormat        /* label_format */);
char *
ZnLFGetString(ZnLabelFormat     /* label_format */);
ZnBool
ZnLFGetClipBox(ZnLabelFormat    /* label_format */,
               ZnDim            * /* width */,
               ZnDim            * /* height */);
#define ZnLFNumFields(lf)       ((lf)->num_fields)
void
ZnLFGetField(ZnLabelFormat      /* label_format */,
             unsigned int       /* field */,
             char               * /* x_attach */,
             char               * /* y_attach */,
             char               * /* x_dim */,
             char               * /* y_dim */,
             int                * /* x_spec */,
             int                * /* y_spec */,
             short              * /* width_spec */,
             short              * /* height_spec */);

/*
 * Line Ends.
 */
typedef struct {
  ZnReal        shape_a;
  ZnReal        shape_b;
  ZnReal        shape_c;
  Tcl_HashEntry *entry;
  unsigned int  ref_count;
} ZnLineEndStruct, *ZnLineEnd;

ZnLineEnd
ZnLineEndCreate(Tcl_Interp      *interp,
                char            *line_end_str);
ZnLineEnd
ZnLineEndDuplicate(ZnLineEnd    le);
void
ZnLineEndDelete(ZnLineEnd       le);
char *
ZnLineEndGetString(ZnLineEnd    le);


/*
 * Type and protypes for fill rules.
 */
typedef unsigned int    ZnFillRule;

char *ZnNameOfFillRule(ZnFillRule fill_rule);
int ZnGetFillRule(struct _ZnWInfo *wi, char *name, ZnFillRule *fill_rule);


#ifdef __CPLUSPLUS__
}
#endif

#endif  /* _Attrs_h */