DviP.h revision c166fba9
1/*
2 * DviP.h - Private definitions for Dvi widget
3 */
4
5#ifndef _XtDviP_h
6#define _XtDviP_h
7
8#ifdef USE_XFT
9#include <X11/Xft/Xft.h>
10#endif
11
12#include "Dvi.h"
13#include <X11/Xaw/SimpleP.h>
14#include "DviChar.h"
15
16/***********************************************************************
17 *
18 * Dvi Widget Private Data
19 *
20 ***********************************************************************/
21
22/************************************
23 *
24 *  Class structure
25 *
26 ***********************************/
27
28/*
29 * New fields for the Dvi widget class record
30 */
31
32typedef struct _DviClass {
33	int		makes_compiler_happy;  /* not used */
34} DviClassPart;
35
36/*
37 * Full class record declaration
38 */
39
40typedef struct _DviClassRec {
41    CoreClassPart	core_class;
42    SimpleClassPart	simple_class;
43    DviClassPart	command_class;
44} DviClassRec;
45
46extern DviClassRec dviClassRec;
47
48/***************************************
49 *
50 *  Instance (widget) structure
51 *
52 **************************************/
53
54/*
55 * a list of fonts we've used for this widget
56 */
57
58typedef struct _dviFontSizeList {
59	struct _dviFontSizeList	*next;
60	int			size;
61	char			*x_name;
62#ifdef USE_XFT
63	XftFont			*font;
64	Bool			core;
65#else
66	XFontStruct		*font;
67#endif
68	int			doesnt_exist;
69} DviFontSizeList;
70
71typedef struct _dviFontList {
72	struct _dviFontList	*next;
73	char			*dvi_name;
74	char			*x_name;
75	int			dvi_number;
76	Boolean			initialized;
77	Boolean			scalable;
78	DviFontSizeList		*sizes;
79	DviCharNameMap		*char_map;
80} DviFontList;
81
82typedef struct _dviFontMap {
83	struct _dviFontMap	*next;
84	char			*dvi_name;
85	char			*x_name;
86} DviFontMap;
87
88#define DVI_TEXT_CACHE_SIZE	256
89#define DVI_CHAR_CACHE_SIZE	1024
90
91#ifdef USE_XFT
92typedef struct _dviTextItem {
93	char		*chars;
94	int		nchars;
95	int		x;
96	XftFont		*font;
97} DviTextItem;
98#endif
99
100typedef struct _dviCharCache {
101#ifdef USE_XFT
102	DviTextItem	cache[DVI_TEXT_CACHE_SIZE];
103#else
104	XTextItem	cache[DVI_TEXT_CACHE_SIZE];
105#endif
106	char		char_cache[DVI_CHAR_CACHE_SIZE];
107	int		index;
108	int		max;
109	int		char_index;
110	int		font_size;
111	int		font_number;
112#ifdef USE_XFT
113	XftFont		*font;
114#else
115	XFontStruct	*font;
116#endif
117	int		start_x, start_y;
118	int		x, y;
119} DviCharCache;
120
121typedef struct _dviState {
122	struct _dviState	*next;
123	int			font_size;
124	int			font_bound;
125	int			font_number;
126	int			line_style;
127	int			line_width;
128	int			x;
129	int			y;
130} DviState;
131
132typedef struct _dviFileMap {
133	struct _dviFileMap	*next;
134	long			position;
135	int			page_number;
136} DviFileMap;
137
138/*
139 * New fields for the Dvi widget record
140 */
141
142typedef struct {
143	/*
144	 * resource specifiable items
145	 */
146	char		*font_map_string;
147	unsigned long	foreground;
148	int		requested_page;
149	int		last_page;
150	FILE		*file;
151	Boolean		seek;		/* file is "seekable" */
152#ifdef USE_XFT
153	XftFont		*default_font;
154#else
155	XFontStruct	*default_font;
156#endif
157	int		backing_store;
158	Boolean		noPolyText;
159	int		screen_resolution;
160	float		page_width;
161	float		page_height;
162	int		size_scale_set;
163	/*
164 	 * private state
165 	 */
166	FILE		*tmpFile;	/* used when reading stdin */
167	char		readingTmp;	/* reading now from tmp */
168	char		ungot;		/* have ungetc'd a char */
169	GC		normal_GC;
170#ifdef USE_XFT
171	XftDraw		*draw;
172	XftColor	black;
173#endif
174	DviFileMap	*file_map;
175	DviFontList	*fonts;
176	DviFontMap	*font_map;
177	int		current_page;
178	int		font_size;
179	int		font_number;
180	int		device_resolution;
181	int		line_width;
182	int		line_style;
183	int		desired_width;
184	int		desired_height;
185	int		size_scale;	/* font size scale */
186#ifdef USE_XFT
187	XftFont		*font;
188#else
189	XFontStruct	*font;
190#endif
191	int		display_enable;
192	double		scale;		/* device coordinates to pixels */
193	struct ExposedExtents {
194	    int x1, y1, x2, y2;
195	}		extents;
196	DviState	*state;
197	DviCharCache	cache;
198} DviPart;
199
200extern int		DviGetAndPut(DviWidget, int *);
201
202#define DviGetIn(dw,cp)\
203    (dw->dvi.tmpFile ? (\
204	DviGetAndPut (dw, cp) \
205    ) :\
206	(*cp = getc (dw->dvi.file))\
207)
208
209#define DviGetC(dw, cp)\
210    (dw->dvi.readingTmp ? (\
211	((*cp = getc (dw->dvi.tmpFile)) == EOF) ? (\
212	    fseek (dw->dvi.tmpFile, 0l, SEEK_END),\
213	    (dw->dvi.readingTmp = 0),\
214	    DviGetIn (dw,cp)\
215	) : (\
216	    *cp\
217	)\
218    ) : (\
219	DviGetIn(dw,cp)\
220    )\
221)
222
223#define DviUngetC(dw, c)\
224    (dw->dvi.readingTmp ? (\
225	ungetc (c, dw->dvi.tmpFile)\
226    ) : ( \
227	(dw->dvi.ungot = 1),\
228	ungetc (c, dw->dvi.file)))
229
230#define ToX(dw,device)		    ((int) ((device) * (dw)->dvi.scale + 0.5))
231#define ToDevice(dw,x)		    ((int) ((x) / (dw)->dvi.scale + 0.5))
232#define SizeScale(dw)		    ((dw)->dvi.size_scale ? (dw)->dvi.size_scale : 4)
233#define FontSizeInPixels(dw,size)   ((int) ((size) * (dw)->dvi.screen_resolution / (SizeScale(dw) * 72)))
234#define FontSizeInDevice(dw,size)   ((int) ((size) * (dw)->dvi.device_resolution / (SizeScale(dw) * 72)))
235
236/*
237 * Full widget declaration
238 */
239
240typedef struct _DviRec {
241    CorePart	core;
242    SimplePart	simple;
243    DviPart	dvi;
244} DviRec;
245
246/* draw.c */
247extern void		HorizontalMove(DviWidget, int);
248extern void		HorizontalGoto(DviWidget, int);
249extern void		VerticalMove(DviWidget, int);
250extern void		VerticalGoto(DviWidget, int);
251extern void		FlushCharCache(DviWidget);
252extern void		SetGCForDraw(DviWidget);
253extern void		DrawLine(DviWidget, int, int);
254extern void		DrawCircle(DviWidget, int);
255extern void		DrawEllipse(DviWidget, int, int);
256extern void		DrawArc(DviWidget, int, int, int, int);
257extern void		DrawSpline(DviWidget, const char *, int);
258
259/* font.c */
260extern void		ParseFontMap(DviWidget);
261extern void		DestroyFontMap(DviFontMap *);
262extern void		SetFontPosition(DviWidget, int, const char *, const char *);
263#ifdef USE_XFT
264extern XftFont *	QueryFont(DviWidget, int, int);
265#else
266extern XFontStruct *	QueryFont(DviWidget, int, int);
267#endif
268extern DviCharNameMap *	QueryFontMap(DviWidget, int);
269
270/* lex.c */
271extern char *		GetLine(DviWidget, char *, int);
272extern char *		GetWord(DviWidget, char *, int);
273extern int		GetNumber(DviWidget);
274
275/* page.c */
276extern void		DestroyFileMap(DviFileMap *);
277extern void		ForgetPagePositions(DviWidget);
278extern void		RememberPagePosition(DviWidget, int);
279extern long		SearchPagePosition(DviWidget, int);
280extern void		FileSeek(DviWidget, long);
281
282/* parse.c */
283extern int		ParseInput(DviWidget);
284
285/* Dvi.c */
286extern void		SetDeviceResolution(DviWidget, int);
287
288#endif /* _XtDviP_h */
289