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 
32 typedef struct _DviClass {
33 	int		makes_compiler_happy;  /* not used */
34 } DviClassPart;
35 
36 /*
37  * Full class record declaration
38  */
39 
40 typedef struct _DviClassRec {
41     CoreClassPart	core_class;
42     SimpleClassPart	simple_class;
43     DviClassPart	command_class;
44 } DviClassRec;
45 
46 extern 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 
58 typedef 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 
71 typedef 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 
82 typedef 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
92 typedef struct _dviTextItem {
93 	char		*chars;
94 	int		nchars;
95 	int		x;
96 	XftFont		*font;
97 } DviTextItem;
98 #endif
99 
100 typedef 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 
121 typedef 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 
132 typedef 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 
142 typedef 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 
200 extern 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 
240 typedef struct _DviRec {
241     CorePart	core;
242     SimplePart	simple;
243     DviPart	dvi;
244 } DviRec;
245 
246 /* draw.c */
247 extern void		HorizontalMove(DviWidget, int);
248 extern void		HorizontalGoto(DviWidget, int);
249 extern void		VerticalMove(DviWidget, int);
250 extern void		VerticalGoto(DviWidget, int);
251 extern void		FlushCharCache(DviWidget);
252 extern void		SetGCForDraw(DviWidget);
253 extern void		DrawLine(DviWidget, int, int);
254 extern void		DrawCircle(DviWidget, int);
255 extern void		DrawEllipse(DviWidget, int, int);
256 extern void		DrawArc(DviWidget, int, int, int, int);
257 extern void		DrawSpline(DviWidget, const char *, int);
258 
259 /* font.c */
260 extern void		ParseFontMap(DviWidget);
261 extern void		DestroyFontMap(DviFontMap *);
262 extern void		SetFontPosition(DviWidget, int, const char *, const char *);
263 #ifdef USE_XFT
264 extern XftFont *	QueryFont(DviWidget, int, int);
265 #else
266 extern XFontStruct *	QueryFont(DviWidget, int, int);
267 #endif
268 extern DviCharNameMap *	QueryFontMap(DviWidget, int);
269 
270 /* lex.c */
271 extern char *		GetLine(DviWidget, char *, int);
272 extern char *		GetWord(DviWidget, char *, int);
273 extern int		GetNumber(DviWidget);
274 
275 /* page.c */
276 extern void		DestroyFileMap(DviFileMap *);
277 extern void		ForgetPagePositions(DviWidget);
278 extern void		RememberPagePosition(DviWidget, int);
279 extern long		SearchPagePosition(DviWidget, int);
280 extern void		FileSeek(DviWidget, long);
281 
282 /* parse.c */
283 extern int		ParseInput(DviWidget);
284 
285 /* Dvi.c */
286 extern void		SetDeviceResolution(DviWidget, int);
287 
288 #endif /* _XtDviP_h */
289