/*->c.font */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>
#include <stdarg.h>

#include "h.os"
#include "h.font"



#define CacheAddr           0x00040080
#define FindFont            0x00040081
#define LoseFont            0x00040082
#define ReadDefn            0x00040083
#define ReadInfo            0x00040084
#define StringWidth         0x00040085
#define Paint               0x00040086
#define Caret               0x00040087
#define ConverttoOS         0x00040088
#define Converttopoints     0x00040089
#define SetFont             0x0004008A
#define CurrentFont         0x0004008B
#define FutureFont          0x0004008C
#define FindCaret           0x0004008D
#define CharBBox            0x0004008E
#define ReadScaleFactor     0x0004008F
#define SetScaleFactor      0x00040090
#define ListFonts           0x00040091
#define SetFontColours      0x00040092
#define SetPalette          0x00040093
#define ReadThresholds      0x00040094
#define SetThresholds       0x00040095
#define FindCaretJ          0x00040096
#define StringBBox          0x00040097
#define ReadColourTable     0x00040098






os_error * font_readdef(font f, font_def *d)


{

os_regset r;
os_error *e;

r.r[0] = (int)f;
r.r[1] = (int)&d->name;
r.r[3] = 0;

e = os_swix(ReadDefn, &r);

d->xsize = r.r[2];
d->ysize = r.r[3];
d->xres = r.r[4];
d->yres = r.r[5];
d->usage = r.r[6];
d->age = r.r[7];

return(e);

}






os_error *font_strwidth(font_string *fs)

{

os_regset r;
os_error *e;

r.r[1] = (int)fs->s;
r.r[2] = fs->x;
r.r[3] = fs->y;
r.r[4] = fs->split;
r.r[5] = fs->term;

e = os_swix(StringWidth, &r);

fs->x = r.r[2];
fs->y = r.r[3];
fs->split = r.r[4];
fs->term = r.r[5];

return e;

}



os_error *font_paint(char *s, int options, int x, int y)

{

os_regset r;
os_error *e;

r.r[1] = (int)s;
r.r[2] = options;
r.r[3] = x;
r.r[4] = y;

e = os_swix(Paint, &r);

return e;

}



os_error *font_painttrans(char * s,int options,int x,int y,
                                                  font_transform * trans)

{
 os_regset r;
 os_error *e;

 r.r[1] = (int)s;
 r.r[2] = options | font_TRANS;
 r.r[3] = x;
 r.r[4] = y;
 r.r[5] = 0;
 r.r[6] = (int)trans;
 r.r[7] = 0;

 e=os_swix(Paint, &r);

 return(e);
}




os_error *font_stringbbox(char *s, font_info *fi)

{

os_regset r;
os_error *e;

r.r[1] = (int)s;

e = os_swix(StringBBox, &r);

fi->minx = r.r[1];
fi->miny = r.r[2];
fi->maxx = r.r[3];
fi->maxy = r.r[4];

return e;

}


os_error *font_charbbox(font f,char ch,int options,font_info * i)
{
os_regset r;
os_error *e;

r.r[0] = f;
r.r[1] = ch;
r.r[2] = options;

e = os_swix(CharBBox, &r);

i->minx = r.r[1];
i->miny = r.r[2];
i->maxx = r.r[3];
i->maxy = r.r[4];

return e;

}




os_error *font_readscalefactor(int *x, int *y)

{

os_regset r;
os_error *e;

e = os_swix(ReadScaleFactor, &r);

*x = r.r[1];
*y = r.r[2];

return e;

}


os_error *font_setscalefactor(int x, int y)

{

os_regset r;
os_error *e;

r.r[1] = x;
r.r[2] = y;

e = os_swix(SetScaleFactor, &r);

return e;

}



os_error *font_findcaret(font_string *fs)

{

os_regset r;
os_error *e;

r.r[1] = (int)fs->s;
r.r[2] = fs->x;
r.r[3] = fs->y;

e = os_swix(FindCaret, &r);

fs->x = r.r[2];
fs->y = r.r[3];
fs->split = r.r[4];
fs->term = r.r[5];

return e;

}



os_error *font_findcaretj(font_string *fs, int offset_x, int offset_y)

{

os_regset r;
os_error *e;

r.r[1] = (int)fs->s;
r.r[2] = fs->x;
r.r[3] = fs->y;
r.r[4] = offset_x;
r.r[5] = offset_y;

e = os_swix(FindCaretJ, &r);

fs->x = r.r[2];
fs->y = r.r[3];
fs->split = r.r[4];
fs->term = r.r[5];

return e;

}



os_error *font_find(char *name, int xsize, int ysize, int xres, int yres, font *fontadd)

/* xsize, ysize; in 16ths of a point */
/* xres, yres;   dots per inch of res: 0->use default */

{

os_regset r;
os_error *e;

r.r[1] = (int)name;
r.r[2] = xsize;
r.r[3] = ysize;
r.r[4] = xres;
r.r[5] = yres;

e = os_swix(FindFont, &r);

*fontadd = (font) r.r[0];

return e;
}

os_error *font_lose(font f)

{
os_regset r;
os_error *e;

r.r[0] = f;
e = os_swix(LoseFont, &r);
return e;
}





os_error *font_setfont(font f)

{

os_regset r;
os_error *e;

r.r[0] = f;

e = os_swix(SetFont, &r);

return(e);

}



/*

os_error *font_current(font_state *f)
{
   os_regset r;
   os_error *e;

   e = os_swix(CurrentFont, &r);

   f->f = r.r[0];
   f->back_colour = r.r[1];
   f->fore_colour = r.r[2];
   f->offset = r.r[3];

   return(e);
}

*/



os_error *font_future(font_state *f)
{
   os_regset r;
   os_error *e;

   e = os_swix(FutureFont, &r);

   f->f = r.r[0];
   f->back_colour = r.r[1];
   f->fore_colour = r.r[2];
   f->offset = r.r[3];

   return(e);
}







os_error *font_setcolour(font f, int background, int foreground, int offset)

{

os_regset r;
os_error *e;

r.r[0] = f;
r.r[1] = background;
r.r[2] = foreground;
r.r[3] = offset;

e = os_swix(SetFontColours, &r);

return e;

}


