/*
 * $XConsortium: DviP.h,v 1.5 89/07/22 19:44:08 keith Exp $
 */

/* 
 * DviP.h - Private definitions for Dvi widget
 */

#ifndef _XtDviP_h
#define _XtDviP_h

#include "Dvi.h"
#include "DviChar.h"
#include "device.h"

/***********************************************************************
 *
 * Dvi Widget Private Data
 *
 ***********************************************************************/

/************************************
 *
 *  Class structure
 *
 ***********************************/

/* Type for save method. */

typedef void (*DviSaveProc)(Widget, FILE *);

/*
 * New fields for the Dvi widget class record
 */


typedef struct _DviClass {
      DviSaveProc	save;
} DviClassPart;

/*
 * Full class record declaration
 */

typedef struct _DviClassRec {
	CoreClassPart	core_class;
	DviClassPart	command_class;
} DviClassRec;

extern DviClassRec dviClassRec;

/***************************************
 *
 *  Instance (widget) structure 
 *
 **************************************/

/*
 * a list of fonts we've used for this widget
 */

typedef struct _dviFontSizeList {
	struct _dviFontSizeList	*next;
	int			size;
	char			*x_name;
	XFontStruct		*font;
	int			doesnt_exist;
} DviFontSizeList;

typedef struct _dviFontList {
	struct _dviFontList	*next;
	char			*dvi_name;
	char			*x_name;
	int			dvi_number;
	Boolean			initialized;
	Boolean			scalable;
	DviFontSizeList		*sizes;
	DviCharNameMap		*char_map;
	DeviceFont		*device_font;
} DviFontList;

typedef struct _dviFontMap {
	struct _dviFontMap	*next;
	char			*dvi_name;
	char			*x_name;
} DviFontMap;

#define DVI_TEXT_CACHE_SIZE	256
#define DVI_CHAR_CACHE_SIZE	1024

typedef struct _dviCharCache {
	XTextItem	cache[DVI_TEXT_CACHE_SIZE];
	char		adjustable[DVI_TEXT_CACHE_SIZE];
	char		char_cache[DVI_CHAR_CACHE_SIZE];
	int		index;
	int		max;
	int		char_index;
	int		font_size;
	int		font_number;
	XFontStruct	*font;
	int		start_x, start_y;
	int		x, y;
} DviCharCache;

typedef struct _dviState {
	struct _dviState	*next;
	int			font_size;
	int			font_number;
	int			x;
	int			y;
} DviState;

typedef struct _dviFileMap {
	struct _dviFileMap	*next;
	long			position;
	int			page_number;
} DviFileMap;

/*
 * New fields for the Dvi widget record
 */

typedef struct {
	/*
	 * resource specifiable items
	 */
	char		*font_map_string;
	unsigned long	foreground;
	unsigned long	background;
	int		requested_page;
	int		last_page;
	XFontStruct	*default_font;
	FILE		*file;
	Boolean		noPolyText;
	Boolean		seek;		/* file is `seekable' */
	int		default_resolution;
	/*
 	 * private state
 	 */
	FILE		*tmpFile;	/* used when reading stdin */
	char		readingTmp;	/* reading now from tmp */
	char		ungot;		/* have ungetc'd a char */
	GC		normal_GC;
	GC		fill_GC;
	DviFileMap	*file_map;
	DviFontList	*fonts;
	DviFontMap	*font_map;
	int		current_page;
	int		font_size;
	int		font_number;
	DeviceFont	*device_font;
	int		device_font_number;
	Device		*device;
	int		native;
	int		device_resolution;
	int		display_resolution;
	int		paperlength;
	int		paperwidth;
	double		scale_factor;	/* display res / device res */
	int		sizescale;
	int		line_thickness;
	int		line_width;

#define DVI_FILL_MAX 1000

	int		fill;
#define DVI_FILL_WHITE 0
#define DVI_FILL_GRAY 1
#define DVI_FILL_BLACK 2
	int		fill_type;
	Pixmap		gray[8];
	int		backing_store;
	XFontStruct	*font;
	int		display_enable;
	struct ExposedExtents {
	    int x1, y1, x2, y2;
	}		extents;
	DviState	*state;
	DviCharCache	cache;
	int		text_x_width;
	int		text_device_width;
	int		word_flag;
} DviPart;

int DviGetAndPut(DviWidget, int *);
#define DviGetIn(dw,cp)\
    (dw->dvi.tmpFile ? (\
	DviGetAndPut (dw, cp) \
    ) :\
	(*cp = getc (dw->dvi.file))\
)

#define DviGetC(dw, cp)\
    (dw->dvi.readingTmp ? (\
	((*cp = getc (dw->dvi.tmpFile)) == EOF) ? (\
	    fseek (dw->dvi.tmpFile, 0l, 2),\
	    (dw->dvi.readingTmp = 0),\
	    DviGetIn (dw,cp)\
	) : (\
	    *cp\
	)\
    ) : (\
	DviGetIn(dw,cp)\
    )\
)

#define DviUngetC(dw, c)\
    (dw->dvi.readingTmp ? (\
	ungetc (c, dw->dvi.tmpFile)\
    ) : ( \
	(dw->dvi.ungot = 1),\
	ungetc (c, dw->dvi.file)))

/*
 * Full widget declaration
 */

typedef struct _DviRec {
	CorePart	core;
	DviPart		dvi;
} DviRec;

#define InheritSaveToFile ((DviSaveProc)_XtInherit)

XFontStruct	*QueryFont (DviWidget, int, int);

DviCharNameMap	*QueryFontMap (DviWidget, int);

DeviceFont	*QueryDeviceFont (DviWidget, int);

char *GetWord(DviWidget, char *, int);
char *GetLine(DviWidget, char *, int);
#endif /* _XtDviP_h */
