/*	S. Mike Dierken		*/
/* ANSI COMPUTER GRAPHIC METAFILE OPCODES */
/* BINARY ENCODING */

/*	CMS Generation: 1                       29-AUG-89
*/

typedef struct opcode_type
	{ char *name;
	  int value,len;
	} OPCODES;

/* DEFAULT STRING */

char unknown[20]="unknown";

/* ELEMENT CLASS CODES */
#define	DELIMITER	0
#define	META_DESC	1
#define	PICTURE_DESC	2
#define	CONTROL		3
#define	PRIMITIVE	4
#define	ATTRIBUTE	5
#define	ESCAPE		6
#define	EXTERNAL	7
#define	RESERVED	8

#define MAX_CLASSES 9
OPCODES classes[MAX_CLASSES]={
{"DELIMITER",	0},
{"META_DESC",	1},
{"PICTURE_DESC",	2},
{"CONTROL	",	3},
{"PRIMITIVE", 	4},
{"ATTRIBUTE",	5},
{"ESCAPE	",	6},
{"EXTERNAL",	7},
{"RESERVED",	8}
};

/* CLASS 0	*/
#define	NOP		0
#define	BEGIN_META	1
#define	END_META	2
#define	BEGIN_PIC	3
#define	BEGIN_PIC_BODY	4
#define	END_PIC		5

#define INTEGER_TYPE 1
#define STRING_TYPE 2

#define N_LENGTH (-1)

#define MAX_CLASS_0 6

OPCODES class_0[MAX_CLASS_0]={
{"NOP",	0,N_LENGTH},
{"BEGIN_META",	1,N_LENGTH},
{"END_META",	2,0},
{"BEGIN_PIC",	3,N_LENGTH},
{"BEGIN_PIC_BODY",	4,0},
{"END_PIC	",	5,0}
};

/* CLASS 1	*/
#define	META_VERSION	1
#define	META_DESCRIPT	2
#define	VDC_TYPE	3
#define INTEGER_PREC	4
#define REAL_PREC	5
#define INDEX_PREC	6
#define COLOR_PREC	7
#define COLOR_INDEX_PREC	8
#define MAX_COLOR	9
#define COLOR_VAL_EXTANT 10
#define META_ELEMENT_LIST	11
#define META_DEFAULT_REPLACEMENT 12
#define	FONT_LIST	13
#define	CHARACTER_SET	14
#define	CHARACTER_ANNOUNCER	15

#define MAX_CLASS_1 16

OPCODES class_1[MAX_CLASS_1]={
{unknown,	0,0},
{"META_VERSION",	1,1},
{"META_DESCRIPT",	2,N_LENGTH},
{"VDC_TYPE",	3,1},
{"INTEGER_PREC",	4,1},
{"REAL_PREC",	5,3},
{"INDEX_PREC",	6,1},
{"COLOR PRECISION",	7,1},
{"COLOR_INDEX PREC",	8,1},
{"MAX COLOR",	9,1},
{"COLOR VAL EXTANT",	10,2},
{"META ELEMENT LIST",	11,2},
{"META DEFAULT REPLACEMENTS",	12,1},
{"FONT_LIST",	13,N_LENGTH},
{"CHARACTER_SET",  	14,N_LENGTH},
{"CHARACTER_ANNOUNCER",	15,1}
};

/* CLASS 2	*/
#define	SCALING_MOD	1
#define COLOR_SELECTION 2
#define	LINE_WIDTH_SPEC	3
#define MARKER_SIZE_SPEC	4
#define EDGE_WIDTH_SPEC 	5
#define	VDC_EXTENT	6         
#define BACKGROUND_COLOR	7
                           
#define MAX_CLASS_2 8
                     
OPCODES class_2[MAX_CLASS_2]={
{unknown,	0,0},
{"SCALING_MOD",	1,2},
{"COLOR SELECTION",	2,1},
{"LINE_WIDTH_SPEC",	3,1},
{"MARKER SIZE SPEC",	4,1},
{"EDGE WIDTH SPEC ",	5,1},
{"VDC_EXTENT",	6,4},
{"BACKGROUND COLOR",	7,3}
};                 

/* CLASS 3 */
#define	VDC_INT_PREC	1
#define	VDC_REAL_PREC	2
#define	AUX_COLOR	3   
#define	TRANSPARENCY	4
#define	CLIP_RECTANGLE	5
#define	CLIP_INDICATOR	6

#define MAX_CLASS_3 7

OPCODES class_3[MAX_CLASS_3]={
{unknown,	0,0},
{"VDC_INT_PREC",	1,1},
{"VDC_REAL_PREC",	2,3},
{"AUX_COLOR",	3,1},  
{"TRANSPARENCY",	4,1},
{"CLIP_RECTANGLE",	5,2},
{"CLIP_INDICATOR",	6,1}
};

/* CLASS 4	*/
#define	POLYLINE	1
#define	DISJOINT_POLY	2
#define POLYMARKER      3  
#define TEXT            4   
#define RESTRICTED_TEXT 5   
#define APPEND_TEXT     6   
#define POLYGON         7   
#define POLYGON_SET     8   
#define CELL_ARRAY      9   
#define GEN_PRIMITIVE   10  
#define RECTANGLE       11  
#define CIRCLE          12
#define ARC_CIRC_3_OPEN 13
#define ARC_CIRC_3_CLOS	14
#define ARC_CIRC_C_OPEN 15
#define ARC_CIRC_C_CLOS	16
#define ELLIPSE		17
#define ARC_ELLIPSE_OPEN 18
#define ARC_ELLIPSE_CLOS 19
                           
#define MAX_CLASS_4 20
OPCODES class_4[MAX_CLASS_4]={
{unknown,	0,0},
{"POLYLINE",	1,2},
{"DISJOINT_POLY",	2,2},
{"POLYMARKER     ", 3  ,2},
{"TEXT           ", 4   ,3},
{"RESTRICTED_TEXT", 5   ,5},
{"APPEND_TEXT    ", 6   ,2},
{"POLYGON        ", 7   ,2},
{"POLYGON_SET    ", 8   ,2},
{"CELL_ARRAY     ", 9   ,8},
{"GEN_PRIMITIVE  ", 10  ,2},
{"RECTANGLE      ", 11  ,2},
{"CIRCLE         ", 12,2},
{"ARC_CIRC_3_OPEN", 13,3},
{"ARC_CIRC_3_CLOS",	14,4},
{"ARC_CIRC_C_OPEN", 15,6},
{"ARC_CIRC_C_CLOS",	16,7},
{"ELLIPSE	",	17,3},
{"ARC_ELLIPSE_OPEN", 18,7},
{"ARC_ELLIPSE_CLOS", 19,8}
};

/* CLASS 5	*/
#define LINE_BUNDLE_INDEX	1
#define LINE_TYPE	2
#define LINE_WIDTH	3
#define LINE_COLOR	4

#define TEXT_BUNDLE_INDEX	9
#define TEXT_FONT_INDEX	10
#define TEXT_PREC	11
#define CHAR_EXPANSION	12
#define CHAR_SPACING	13
#define TEXT_COLOR	14
#define CHARACTER_HEIGHT	15
#define CHARACTER_ORIENT	16
#define TEXT_PATH	17
#define TEXT_ALIGNMENT	18
#define CHAR_SET_INDEX	19
#define ALTERNATE_CHAR_SET_INDEX	20
#define FILL_BUNDLE_INDEX	21
#define INTERIOR_STYLE	22
#define FILL_COLOR	23
#define HATCH_INDEX	24
#define PATTERN_INDEX	25
#define EDGE_BUNDLE_INDEX	26
#define EDGE_TYPE	27
#define EDGE_WIDTH	28
#define EDGE_COLOR	29
#define EDGE_VISIBLE	30
#define FILL_REF_POINT	31
#define PATTERN_TABLE	32
#define PATTERN_TABLE	33
#define COLOR_TABLE	34
#define ASPECT_SOURCE_FLAGS	35


#define MAX_CLASS_5 36
OPCODES class_5[MAX_CLASS_5]={
{unknown,	0,0},
{"LINE_BUNDLE_INDEX",	1,1},
{"LINE_TYPE",	2,1},      
{"LINE_WIDTH",	3,1},
{"LINE_COLOR",	4,1},
{unknown,	5,0},
{unknown,	6,0},
{unknown,	7,0},
{unknown,	8,0},
{"TEXT_BUNDLE_INDEX",	9,1},
{"TEXT_FONT_INDEX",  	10,1},
{"TEXT_PREC",	11,1},
{"CHAR_EXPANSION",	12,1},
{"CHAR_SPACING",	13,1},
{"TEXT_COLOR",	14,1},
{"CHARACTER HEIGHT",	15,2},
{"CHARACTER ORIENT",    16,2},
{"TEXT PATH",    17,2},
{"TEXT ALIGNMENT",    18,2},
{"CHAR SET INDEX",    19,2},
{"ALTERNATE CHAR SET INDEX",    20,2},
{"FILL BUNDLE INDEX",    21,2},
{"INTERIOR STYLE",    22,2},
{"FILL COLOR",    23,2},
{"HATCH INDEX",    24,2},
{"PATTERN INDEX",    25,2},
{"EDGE BUNDLE INDEX",    26,2},
{"EDGE TYPE",    27,2},
{"EDGE WIDTH",    28,2},
{"EDGE COLOR",    29,2},
{"EDGE VISIBLE",    30,2},
{"FILL REF POINT",    31,2},
{"PATTERN TABLE",    32,2},
{"PATTERN TABLE",    33,2},
{"COLOR TABLE",    34,2},
{"ASPECT SOURCE FLAGS",	35,2}
};

/* class 6 */
#define ESCAPE 1

#define MAX_CLASS_6 2
OPCODES class_6[MAX_CLASS_6]={
{unknown,	0,0},
{"ESCAPE",	1,-1}
};

/* class 7 */
#define MESSAGE 1
#define APPLICATION_DATA 2

#define MAX_CLASS_7 3
OPCODES class_7[MAX_CLASS_7]={
{unknown,	0,0},
{"MESSAGE",	1,-1},
{"APPLICATION DATA",	2,-1}
};

#define MAX_ELEMENTS MAX_CLASSES

struct element_struct {
	OPCODES *class;
	int max;
	} elements[MAX_CLASSES]={
{class_0,  MAX_CLASS_0  },
{class_1,  MAX_CLASS_1  },
{class_2,  MAX_CLASS_2  },
{class_3,  MAX_CLASS_3  },
{class_4,  MAX_CLASS_4  },
{class_5,  MAX_CLASS_5  },
{class_6,  MAX_CLASS_6  },
{class_7,  MAX_CLASS_7  }
};

