//----------------------------------------------------------------------------- // font.c >> generic user font module // matt verran 06/1999 //----------------------------------------------------------------------------- #include "font.h" #include "main.h" void LoadFont( Font *fntInfo ) { RECT rect; // Frame buffer rectangular area GsSPRITE spriteInfo; //temp fonttile sprite GsIMAGE imageInfo; //temp fonttile texture long TIMdata; TIMdata = fntInfo->tim_data; GsGetTimInfo((u_long *)(TIMdata+4), &imageInfo); // frame buffer sprite loading rect.x = imageInfo.px; rect.y = imageInfo.py; rect.w = imageInfo.pw; rect.h = imageInfo.ph; LoadImage(&rect, imageInfo.pixel); DrawSync(0); //wait for loading if ((imageInfo.pmode>>3) & 0x01) { rect.x = imageInfo.cx; rect.y = imageInfo.cy; rect.w = imageInfo.cw; rect.h = imageInfo.ch; LoadImage(&rect, imageInfo.clut); DrawSync(0); } // and now to set up the sprite part spriteInfo.x = 160; spriteInfo.y = 16; spriteInfo.w = fntInfo->char_width; spriteInfo.attribute = 1<<24; //8bit image spriteInfo.h = fntInfo->char_height; fntInfo->start_u = (imageInfo.px % 64); fntInfo->start_v = (imageInfo.py % 256); spriteInfo.cx = imageInfo.cx; spriteInfo.cy = imageInfo.cy; spriteInfo.r = 128; spriteInfo.g = 128; spriteInfo.b = 128; spriteInfo.mx = 32; spriteInfo.my = 16; spriteInfo.rotate = 0; spriteInfo.scalex = 4096; spriteInfo.scaley = 4096; spriteInfo.tpage = GetTPage(imageInfo.pmode & 7, 0, imageInfo.px, imageInfo.py); fntInfo->imageHandler = imageInfo ; fntInfo->spriteHandler = spriteInfo; } void ColFont(u_char r, u_char g, u_char b, u_char trsp, Font *fntInfo) { GsSPRITE spriteInfo; //temp fonttile sprite spriteInfo = fntInfo->spriteHandler; spriteInfo.r = r; spriteInfo.g = g; spriteInfo.b = b; if (spriteInfo.attribute & (1<<30)) { spriteInfo.attribute = spriteInfo.attribute - (1<<30); } if (trsp==1) { spriteInfo.attribute = spriteInfo.attribute | (1<<30); } fntInfo->spriteHandler = spriteInfo; } void DispFont(char *text, int x, int y, Font *fntInfo, GsOT *ot, int sort) { GsSPRITE spriteInfo; //temp fonttile sprite char c; char start_char, end_char; int across, down, columns; spriteInfo = fntInfo->spriteHandler; spriteInfo.x = x; spriteInfo.y = y; start_char = fntInfo->start_char; end_char = fntInfo->end_char; columns = fntInfo->columns; while( *text!=0 ) { c = *text; if ( c < start_char || c > end_char ) // if out of range { // do nowt } else // if in range { c = c - start_char; across = c % columns; down = (c-across) / columns; spriteInfo.u = (fntInfo->start_u) + (across*(fntInfo->char_width)); spriteInfo.v = (fntInfo->start_v) + (down*(fntInfo->char_height)); GsSortSprite(&spriteInfo, ot, sort); //render to OT } spriteInfo.x = spriteInfo.x + (fntInfo->char_width); // move cursor along text++; } } void DispFontDX(char *text, int x, int y, short scalex, short scaley, long rotate, Font *fntInfo, GsOT *ot, int sort) { GsSPRITE spriteInfo; //temp fonttile sprite char c; char start_char, end_char; int across, down, columns; spriteInfo = fntInfo->spriteHandler; spriteInfo.x = x; spriteInfo.y = y; spriteInfo.scalex = scalex; spriteInfo.scaley = scaley; spriteInfo.rotate = rotate; start_char = fntInfo->start_char; end_char = fntInfo->end_char; columns = fntInfo->columns; while( *text!=0 ) { c = *text; if ( c < start_char || c > end_char ) // if out of range { // do nowt } else // if in range { c = c - start_char; across = c % columns; down = (c-across) / columns; spriteInfo.mx = 4; spriteInfo.my = 4; spriteInfo.u = (fntInfo->start_u) + (across*(fntInfo->char_width)); spriteInfo.v = (fntInfo->start_v) + (down*(fntInfo->char_height)); GsSortSprite(&spriteInfo, ot, sort); //render to OT } spriteInfo.x = spriteInfo.x + (fntInfo->char_width); // move cursor along text++; } }