#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 ] );
  }
}