#include "texx2.h" #include "dvi-simple.h" #include "texx2-font.h" #include 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 ] ); } }