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