1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include "texx2.h"
#include "dvi-simple.h"
#include "texx2-font.h"
#include <assert.h>
extern Widget TopLevelWidget;
/* font handlers */
int MagAtShrink[] = {-1, 1000, 500, 333, 250, 200, 166, 142, 125, 111, -1};
XFontStruct **FontsAtMag[ MAX_SHRINK + 2 ];
int FontRefCnt[ MAX_SHRINK + 2 ];
XFontStruct **
TeXFontRef(usermag)
int usermag;
{
int magSlot;
for ( magSlot = MIN_SHRINK; magSlot <= MAX_SHRINK; magSlot++ ) {
if ( usermag >= MagAtShrink[ magSlot ] )
break;
}
assert( magSlot >= MIN_SHRINK && magSlot <= MAX_SHRINK );
if ( FontsAtMag[ magSlot ] == 0 ) {
int nameSize;
char *name;
char *args[128];
int argCnt;
char tmpStr[128];
int lth;
int missing;
int font;
XFontStruct **thisMag = (XFontStruct **)
XtMalloc( sizeof( XFontStruct *) * (RegisteredFonts + 1) );
for ( font = 0; font <= RegisteredFonts; font++ ) {
thisMag[ font ] = 0;
}
/* try to load the fonts */
missing = 0;
for (font = 0; font < RegisteredFonts; font++ ) {
/* get the canonical font name */
char tmpStr[128];
double dvimag = TheFontInfo[font].paf.paf_DVIMag;
double dvidsz = TheFontInfo[font].paf.paf_DVIDesignSize;
double suffMag = dvimag / dvidsz;
int mag = usermag;
int scaled = (suffMag * ThePostAmbleInfo.pai_DVIMag + 0.5);
int suff = (DviDpi * scaled * mag ) / (1000 * 1000);
sprintf(tmpStr,"%s.%d",
TheFontInfo[font].paf.paf_name, (int) suff);
thisMag[ font ]
= XLoadQueryFont( XtDisplay ( TopLevelWidget ), tmpStr );
if ( thisMag[ font ] == 0 ) {
missing++;
error(0,0,"Missing %s ( -mag %d -scaled %d %s )",
tmpStr, mag, scaled, TheFontInfo[font].paf.paf_name);
}
}
FontsAtMag[ magSlot ] = thisMag;
}
FontRefCnt[ magSlot ] ++;
return( FontsAtMag[ magSlot ] );
}
XFontStruct **
TeXFontUnref(usermag)
int usermag;
{
int magSlot;
for ( magSlot = MIN_SHRINK; magSlot <= MAX_SHRINK; magSlot++ ) {
if ( usermag >= MagAtShrink[ magSlot ] )
break;
}
assert( magSlot >= MIN_SHRINK && magSlot <= MAX_SHRINK );
if ( FontsAtMag [ magSlot] ) {
FontRefCnt[ magSlot ] --;
if (FontRefCnt[ magSlot ] <= 0 ) {
int font;
XFontStruct **fonts = FontsAtMag[magSlot];
/* fonts list is null terminated */
for (font = 0; fonts[ font ] ; font++ ) {
XFreeFont(XtDisplay( TopLevelWidget ), fonts[font] );
fonts[ font ] = 0;
}
XtFree( FontsAtMag[ magSlot ] );
FontsAtMag[ magSlot ] = 0;
FontRefCnt[ magSlot ] = 0;
}
}
}
void
TeXFontNewFile()
{
int mag;
for ( mag = 1; mag <= MAX_SHRINK ; mag++ ) {
TeXFontUnref( MagAtShrink[ mag ] );
}
}
|