#include "alfonts.h"
#include "darray.h"
#include "al.h"
#include "assert.h"

XmFontList AlFonts[ALFONTS_MAX_FONTS];

#ifdef __STDC__
char* make_name(char*,char*,char*,char*,char*);
XFontStruct *get_font(XFontStruct*,char*,char**,int,char**,int,char**,int);
#else
char* make_name();
XFontStruct *get_font();
#endif

/*--------------------------------------------------
NORET AlFonts_list_fonts()
{
  char** fonts;
  int i, ret;
  
  fonts=XListFonts(display_,"*",1000,&ret);

  printf("ret=%d\n",ret);
  for (i=0;i<ret;i++) 
    printf("%s\n",fonts[i]);
}
*/
#define FONT_STYLE "new century schoolbook"

#define mh_wi 3
char* mh_weight[mh_wi] = {
"bold", "medium", "italic"};

#define mh_si 3
char* mh_spacing[mh_si] = {
"p","m","c" };

#define mh_zi 4
char* mh_size[mh_zi] = {
"240","180","140","120" };

/* small feature font */
#define mih_wi 3
char* mih_weight[mih_wi] = {
"medium", "bold", "italic"};

#define mih_si 3
char* mih_spacing[mih_si] = {
"p","m","c" };

#define mih_zi 5
char* mih_size[mih_zi] = {
"180", "140","120","100", "240" };


/* text font */
#define t_wi 3
char* t_weight[t_wi] = {
"bold", "medium", "italic"};

#define t_si 3
char* t_spacing[t_si] = {
"p","m","c" };

#define t_zi 5
char* t_size[t_zi] = {
"140","120","100","180", "240" };

static Display *display_;

/*--------------------------------------------------*/
NORET AlFonts_init(display)
Display *display;
{
  XFontStruct * fs;
  XFontStruct *defaultf;

  assert(display);
  display_=display;

  defaultf=XLoadQueryFont(display_,"fixed");

  fs=get_font(defaultf,
	      FONT_STYLE,
	      mh_weight,  mh_wi,
	      mh_spacing, mh_si,
	      mh_size,    mh_zi);
  AlFonts[0]=XmFontListCreate(fs,(XmStringCharSet)XmSTRING_DEFAULT_CHARSET);

  fs=get_font(defaultf,
	      FONT_STYLE,
	      mih_weight,  mih_wi,
	      mih_spacing, mih_si,
	      mih_size,    mih_zi);
  AlFonts[1]=XmFontListCreate(fs,(XmStringCharSet)XmSTRING_DEFAULT_CHARSET);

  fs=get_font(defaultf,
	      FONT_STYLE,
	      t_weight,  t_wi,
	      t_spacing, t_si,
	      t_size,    t_zi);
  AlFonts[2]=XmFontListCreate(fs,(XmStringCharSet)XmSTRING_DEFAULT_CHARSET);

  fs=get_font(defaultf,
	      FONT_STYLE,
	      t_weight,  t_wi,
	      t_spacing, t_si,
	      t_size,    t_zi);
  AlFonts[3]=XmFontListCreate(fs,(XmStringCharSet)XmSTRING_DEFAULT_CHARSET);

}

/*--------------------------------------------------*/
NORET AlFonts_cleanup()
{
  XFreeFont(display_,(AlFonts[0])[0].font);
  XmFontListFree(AlFonts[0]);
  XFreeFont(display_,(AlFonts[1])[0].font);
  XmFontListFree(AlFonts[1]);
  XFreeFont(display_,(AlFonts[2])[0].font);
  XmFontListFree(AlFonts[2]);
  XFreeFont(display_,(AlFonts[3])[0].font);
  XmFontListFree(AlFonts[3]);
};

/*--------------------------------------------------*/
XFontStruct* get_font(defaultf,
		      font_style,weight_a,wi,spacing_a,si,size_a,zi)
XFontStruct *defaultf;
char* font_style;
char **weight_a;
int wi;
char **spacing_a;
int si;
char **size_a;
int zi;
{
  int i, w, sp, z;
  char *weight, *spacing, *size;
  XFontStruct *font;
  for (w=0;w<wi;w++) {
    weight=weight_a[w];
    for (sp=0;sp<si;sp++) {
      spacing=spacing_a[sp];
      for (z=0;z<zi;z++) {
	size=size_a[z];
	font=XLoadQueryFont(display_,make_name(font_style,
					       weight,
					       "r",   
					       spacing, 
					       size));
	if (font!=NULL) return(font);
      }
    }
  }
  return(defaultf);
}


/*--------------------------------------------------*/
char* make_name(style,weight,slant,spacing,size)
char *style, *weight, *slant, *spacing, *size;
{
  static char font[200];

  sprintf(font,"*-%s-%s-%s-*-*-*-%s-*-*-%s-*",
          style,weight,slant,size,spacing);
  return(font);
}

/*--------------------------------------------------*/
XmFontList AlFonts_get(n)
int n;
{
  if (n>ALFONTS_MAX_FONTS || n<0)
    Al_fatal_error("bad font number\n");
  return(AlFonts[n]);
}
