Home | History | Annotate | Line # | Download | only in dist
      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 /* previously in draw.c */
    247 static inline void
    248 HorizontalMove(DviWidget dw, int delta)
    249 {
    250     dw->dvi.state->x += delta;
    251 }
    252 
    253 static inline void
    254 HorizontalGoto(DviWidget dw, int NewPosition)
    255 {
    256     dw->dvi.state->x = NewPosition;
    257 }
    258 
    259 static inline void
    260 VerticalMove(DviWidget dw, int delta)
    261 {
    262     dw->dvi.state->y += delta;
    263 }
    264 
    265 static inline void
    266 VerticalGoto(DviWidget dw, int NewPosition)
    267 {
    268     dw->dvi.state->y = NewPosition;
    269 }
    270 
    271 /* draw.c */
    272 extern void FlushCharCache(DviWidget);
    273 extern void SetGCForDraw(DviWidget);
    274 extern void DrawLine(DviWidget, int, int);
    275 extern void DrawCircle(DviWidget, int);
    276 extern void DrawEllipse(DviWidget, int, int);
    277 extern void DrawArc(DviWidget, int, int, int, int);
    278 extern void DrawSpline(DviWidget, const char *, int);
    279 
    280 /* font.c */
    281 extern void ParseFontMap(DviWidget);
    282 extern void DestroyFontMap(DviFontMap *);
    283 extern void SetFontPosition(DviWidget, int, const char *, const char *);
    284 
    285 #ifdef USE_XFT
    286 extern XftFont *QueryFont(DviWidget, int, int);
    287 #else
    288 extern XFontStruct *QueryFont(DviWidget, int, int);
    289 #endif
    290 extern DviCharNameMap *QueryFontMap(DviWidget, int);
    291 
    292 /* lex.c */
    293 extern char *GetLine(DviWidget, char *, int);
    294 extern char *GetWord(DviWidget, char *, int);
    295 extern int GetNumber(DviWidget);
    296 
    297 /* page.c */
    298 extern void DestroyFileMap(DviFileMap *);
    299 extern void ForgetPagePositions(DviWidget);
    300 extern void RememberPagePosition(DviWidget, int);
    301 extern long SearchPagePosition(DviWidget, int);
    302 extern void FileSeek(DviWidget, long);
    303 
    304 /* parse.c */
    305 extern int ParseInput(DviWidget);
    306 
    307 /* Dvi.c */
    308 extern void SetDeviceResolution(DviWidget, int);
    309 
    310 #endif                          /* _XtDviP_h */
    311