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 {
3300994698Smrg    int makes_compiler_happy;   /* not used */
34f80a6dcdSmrg} DviClassPart;
35f80a6dcdSmrg
36f80a6dcdSmrg/*
37f80a6dcdSmrg * Full class record declaration
38f80a6dcdSmrg */
39f80a6dcdSmrg
40f80a6dcdSmrgtypedef struct _DviClassRec {
4100994698Smrg    CoreClassPart core_class;
4200994698Smrg    SimpleClassPart simple_class;
4300994698Smrg    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 {
5900994698Smrg    struct _dviFontSizeList *next;
6000994698Smrg    int size;
6100994698Smrg    char *x_name;
62f80a6dcdSmrg#ifdef USE_XFT
6300994698Smrg    XftFont *font;
6400994698Smrg    Bool core;
65f80a6dcdSmrg#else
6600994698Smrg    XFontStruct *font;
67f80a6dcdSmrg#endif
6800994698Smrg    int doesnt_exist;
69f80a6dcdSmrg} DviFontSizeList;
70f80a6dcdSmrg
71f80a6dcdSmrgtypedef struct _dviFontList {
7200994698Smrg    struct _dviFontList *next;
7300994698Smrg    char *dvi_name;
7400994698Smrg    char *x_name;
7500994698Smrg    int dvi_number;
7600994698Smrg    Boolean initialized;
7700994698Smrg    Boolean scalable;
7800994698Smrg    DviFontSizeList *sizes;
7900994698Smrg    DviCharNameMap *char_map;
80f80a6dcdSmrg} DviFontList;
81f80a6dcdSmrg
82f80a6dcdSmrgtypedef struct _dviFontMap {
8300994698Smrg    struct _dviFontMap *next;
8400994698Smrg    char *dvi_name;
8500994698Smrg    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 {
9300994698Smrg    char *chars;
9400994698Smrg    int nchars;
9500994698Smrg    int x;
9600994698Smrg    XftFont *font;
97f80a6dcdSmrg} DviTextItem;
98f80a6dcdSmrg#endif
99f80a6dcdSmrg
100f80a6dcdSmrgtypedef struct _dviCharCache {
101f80a6dcdSmrg#ifdef USE_XFT
10200994698Smrg    DviTextItem cache[DVI_TEXT_CACHE_SIZE];
103f80a6dcdSmrg#else
10400994698Smrg    XTextItem cache[DVI_TEXT_CACHE_SIZE];
105f80a6dcdSmrg#endif
10600994698Smrg    char char_cache[DVI_CHAR_CACHE_SIZE];
10700994698Smrg    int index;
10800994698Smrg    int max;
10900994698Smrg    int char_index;
11000994698Smrg    int font_size;
11100994698Smrg    int font_number;
112f80a6dcdSmrg#ifdef USE_XFT
11300994698Smrg    XftFont *font;
114f80a6dcdSmrg#else
11500994698Smrg    XFontStruct *font;
116f80a6dcdSmrg#endif
11700994698Smrg    int start_x, start_y;
11800994698Smrg    int x, y;
119f80a6dcdSmrg} DviCharCache;
120f80a6dcdSmrg
121f80a6dcdSmrgtypedef struct _dviState {
12200994698Smrg    struct _dviState *next;
12300994698Smrg    int font_size;
12400994698Smrg    int font_bound;
12500994698Smrg    int font_number;
12600994698Smrg    int line_style;
12700994698Smrg    int line_width;
12800994698Smrg    int x;
12900994698Smrg    int y;
130f80a6dcdSmrg} DviState;
131f80a6dcdSmrg
132f80a6dcdSmrgtypedef struct _dviFileMap {
13300994698Smrg    struct _dviFileMap *next;
13400994698Smrg    long position;
13500994698Smrg    int page_number;
136f80a6dcdSmrg} DviFileMap;
137f80a6dcdSmrg
138f80a6dcdSmrg/*
139f80a6dcdSmrg * New fields for the Dvi widget record
140f80a6dcdSmrg */
141f80a6dcdSmrg
142f80a6dcdSmrgtypedef struct {
14300994698Smrg    /*
14400994698Smrg     * resource specifiable items
14500994698Smrg     */
14600994698Smrg    char *font_map_string;
14700994698Smrg    unsigned long foreground;
14800994698Smrg    int requested_page;
14900994698Smrg    int last_page;
15000994698Smrg    FILE *file;
15100994698Smrg    Boolean seek;               /* file is "seekable" */
152f80a6dcdSmrg#ifdef USE_XFT
15300994698Smrg    XftFont *default_font;
154f80a6dcdSmrg#else
15500994698Smrg    XFontStruct *default_font;
156f80a6dcdSmrg#endif
15700994698Smrg    int backing_store;
15800994698Smrg    Boolean noPolyText;
15900994698Smrg    int screen_resolution;
16000994698Smrg    float page_width;
16100994698Smrg    float page_height;
16200994698Smrg    int size_scale_set;
16300994698Smrg    /*
16400994698Smrg     * private state
16500994698Smrg     */
16600994698Smrg    FILE *tmpFile;              /* used when reading stdin */
16700994698Smrg    char readingTmp;            /* reading now from tmp */
16800994698Smrg    char ungot;                 /* have ungetc'd a char */
16900994698Smrg    GC normal_GC;
170f80a6dcdSmrg#ifdef USE_XFT
17100994698Smrg    XftDraw *draw;
17200994698Smrg    XftColor black;
173f80a6dcdSmrg#endif
17400994698Smrg    DviFileMap *file_map;
17500994698Smrg    DviFontList *fonts;
17600994698Smrg    DviFontMap *font_map;
17700994698Smrg    int current_page;
17800994698Smrg    int font_size;
17900994698Smrg    int font_number;
18000994698Smrg    int device_resolution;
18100994698Smrg    int line_width;
18200994698Smrg    int line_style;
18300994698Smrg    int desired_width;
18400994698Smrg    int desired_height;
18500994698Smrg    int size_scale;             /* font size scale */
186f80a6dcdSmrg#ifdef USE_XFT
18700994698Smrg    XftFont *font;
188f80a6dcdSmrg#else
18900994698Smrg    XFontStruct *font;
190f80a6dcdSmrg#endif
19100994698Smrg    int display_enable;
19200994698Smrg    double scale;               /* device coordinates to pixels */
19300994698Smrg    struct ExposedExtents {
19400994698Smrg        int x1, y1, x2, y2;
19500994698Smrg    } extents;
19600994698Smrg    DviState *state;
19700994698Smrg    DviCharCache cache;
198f80a6dcdSmrg} DviPart;
199f80a6dcdSmrg
20000994698Smrgextern 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 {
24100994698Smrg    CorePart core;
24200994698Smrg    SimplePart simple;
24300994698Smrg    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 */
27200994698Smrgextern void FlushCharCache(DviWidget);
27300994698Smrgextern void SetGCForDraw(DviWidget);
27400994698Smrgextern void DrawLine(DviWidget, int, int);
27500994698Smrgextern void DrawCircle(DviWidget, int);
27600994698Smrgextern void DrawEllipse(DviWidget, int, int);
27700994698Smrgextern void DrawArc(DviWidget, int, int, int, int);
27800994698Smrgextern void DrawSpline(DviWidget, const char *, int);
279f80a6dcdSmrg
280f80a6dcdSmrg/* font.c */
28100994698Smrgextern void ParseFontMap(DviWidget);
28200994698Smrgextern void DestroyFontMap(DviFontMap *);
28300994698Smrgextern void SetFontPosition(DviWidget, int, const char *, const char *);
28400994698Smrg
285f80a6dcdSmrg#ifdef USE_XFT
28600994698Smrgextern XftFont *QueryFont(DviWidget, int, int);
287f80a6dcdSmrg#else
28800994698Smrgextern XFontStruct *QueryFont(DviWidget, int, int);
289f80a6dcdSmrg#endif
29000994698Smrgextern DviCharNameMap *QueryFontMap(DviWidget, int);
291f80a6dcdSmrg
292f80a6dcdSmrg/* lex.c */
29300994698Smrgextern char *GetLine(DviWidget, char *, int);
29400994698Smrgextern char *GetWord(DviWidget, char *, int);
29500994698Smrgextern int GetNumber(DviWidget);
296f80a6dcdSmrg
297f80a6dcdSmrg/* page.c */
29800994698Smrgextern void DestroyFileMap(DviFileMap *);
29900994698Smrgextern void ForgetPagePositions(DviWidget);
30000994698Smrgextern void RememberPagePosition(DviWidget, int);
30100994698Smrgextern long SearchPagePosition(DviWidget, int);
30200994698Smrgextern void FileSeek(DviWidget, long);
303f80a6dcdSmrg
304f80a6dcdSmrg/* parse.c */
30500994698Smrgextern int ParseInput(DviWidget);
306f80a6dcdSmrg
307f80a6dcdSmrg/* Dvi.c */
30800994698Smrgextern void SetDeviceResolution(DviWidget, int);
309f80a6dcdSmrg
31000994698Smrg#endif                          /* _XtDviP_h */
311