greed/CODE/D_FONT.C
2014-12-12 00:00:00 +00:00

336 lines
7.1 KiB
C

/***************************************************************************/
/* */
/* */
/* Raven 3D Engine */
/* Copyright (C) 1996 by Softdisk Publishing */
/* */
/* Original Design: */
/* John Carmack of id Software */
/* */
/* Enhancements by: */
/* Robert Morgan of Channel 7............................Main Engine Code */
/* Todd Lewis of Softdisk Publishing......Tools,Utilities,Special Effects */
/* John Bianca of Softdisk Publishing..............Low-level Optimization */
/* Carlos Hasan..........................................Music/Sound Code */
/* */
/* */
/***************************************************************************/
#include <STDARG.H>
#include <STDIO.H>
#include <I86.H>
#include <STRING.H>
#include "d_global.h"
#include "d_video.h"
#include "d_misc.h"
#include "d_font.h"
#include "d_ints.h"
#include "r_public.h"
#include "protos.h"
/**** VARIABLES ****/
#define MSGQUESIZE 3
font_t *font;
int fontbasecolor;
int fontspacing=1;
char str[MAXPRINTF]; // general purpose string buffer
char msgstr[MSGQUESIZE][MAXPRINTF];
int printx, printy; // the printing position (top left corner)
longint msgtime;
/**** FUNCTIONS ****/
void FN_RawPrint4(char *str)
/* Draws a string of characters to the buffer */
{
byte b;
byte *dest, *source;
int width, height, y, oldpx, yh;
char ch;
oldpx=printx;
dest=viewylookup[printy]+printx;
height=font->height;
while ((ch=*str++)!=0)
{
width=font->width[ch];
source=((byte*)font) + font->charofs[ch];
while (width--)
{
for (y=0,yh=0;y<height;y++,yh+=windowWidth)
{
b=*source++;
if (b) dest[yh]=fontbasecolor+b;
else dest[yh]=0;
}
dest++;
printx++;
}
dest+=fontspacing;
printx+=fontspacing;
}
}
void FN_RawPrint2(char *str)
/* Draws a string of characters to the buffer */
{
byte b;
byte *dest, *source;
int width, height, y, oldpx, yh;
char ch;
oldpx=printx;
dest=viewylookup[printy]+printx;
height=font->height;
while ((ch=*str++)!=0)
{
width=font->width[ch];
source=((byte*)font) + font->charofs[ch];
while (width--)
{
for (y=0,yh=0;y<height;y++,yh+=windowWidth)
{
b=*source++;
if (b) dest[yh]=fontbasecolor+b;
}
dest++;
printx++;
}
dest+=fontspacing;
printx+=fontspacing;
}
}
void FN_RawPrint(char *str)
/* Draws a string of characters to the screen */
{
byte b;
byte *dest, *source;
int width, height, y, oldpx, yh;
char ch;
oldpx=printx;
dest=ylookup[printy]+printx;
height=font->height;
while ((ch=*str++) != 0)
{
width=font->width[ch];
source=((byte *)font) + font->charofs[ch];
while (width--)
{
for (y=0,yh=0;y<height;y++,yh+=320)
{
b=*source++;
if (b) dest[yh]=fontbasecolor+b;
else dest[yh]=0;
}
dest++;
printx++;
}
dest+=fontspacing;
printx+=fontspacing;
}
}
void FN_RawPrint3(char *str)
/* Draws a string of characters to the screen */
{
byte b;
byte *dest, *source;
int width, height, y, oldpx, yh;
char ch;
oldpx=printx;
dest=ylookup[printy]+printx;
height=font->height;
while ((ch=*str++) != 0)
{
width=font->width[ch];
source=((byte *)font) + font->charofs[ch];
while (width--)
{
for (y=0,yh=0;y<height;y++,yh+=320)
{
b=*source++;
if (b) dest[yh]=fontbasecolor+b;
}
dest++;
printx++;
}
dest+=fontspacing;
printx+=fontspacing;
}
}
int FN_RawWidth(char *str)
/* Returns the width of a string
Does NOT handle newlines */
{
int width;
width=0;
while (*str)
{
width+=font->width[*str++];
width+=fontspacing;
}
return width;
}
void FN_Print(char *s)
/* Prints a string in the current window, with newlines
going down a line and back to 0 */
{
char c, *se;
unsigned h;
h=font->height;
while (*s)
{
se=s;
c=*se;
while (c && c!='\n') c=*++se;
*se='\0';
FN_RawPrint(s);
s=se;
if (c)
{
*se=c;
s++;
printx=0;
printy+=h;
}
}
}
void FN_PrintCentered(char *s)
/* Prints a multi line string with each line centered */
{
char c, *se;
unsigned w, h;
h=font->height;
while (*s)
{
se=s;
c=*se;
while (c && c!='\n') c=*++se;
*se='\0';
w=FN_RawWidth(s);
printx=(320-w)/2;
FN_RawPrint3(s);
s=se;
if (c)
{
*se=c;
s++;
printx=0;
printy+=h;
}
}
}
void FN_Printf(char *fmt, ...)
/* Prints a printf style formatted string at the current print position
using the current print routines */
{
va_list argptr;
int cnt;
va_start(argptr,fmt);
cnt=vsprintf(str,fmt,argptr);
va_end(argptr);
#ifdef PARMCHECK
if (cnt>=MAXPRINTF) MS_Error("FN_Printf: String too long: %s",fmt);
#endif
FN_Print(str);
}
void FN_CenterPrintf(char *fmt, ...)
/* As FN_Printf, but centers each line of text in the window bounds */
{
va_list argptr;
int cnt;
va_start(argptr,fmt);
cnt=vsprintf(str,fmt,argptr);
va_end(argptr);
#ifdef PARMCHECK
if (cnt>=MAXPRINTF) MS_Error("FN_CPrintf: String too long: %s",fmt);
#endif
FN_PrintCentered(str);
}
void FN_BlockCenterPrintf(char *fmt, ...)
/* As FN_CenterPrintf, but also enters the entire set of lines vertically in
the window bounds */
{
va_list argptr;
int cnt;
char *s;
int height;
va_start(argptr,fmt);
cnt=vsprintf(str,fmt,argptr);
va_end(argptr);
#ifdef PARMCHECK
if (cnt>=MAXPRINTF) MS_Error("FN_CCPrintf: String too long: %s",fmt);
#endif
height=1;
s=str;
while (*s) if (*s++=='\n') height++;
height*=font->height;
printy=0+(200-height)/2;
FN_PrintCentered(str);
}
void rewritemsg(void)
/* write the current msg to the view buffer */
{
int i;
fontbasecolor=73;
font=font1;
for(i=0;i<MSGQUESIZE;i++)
if (msgstr[i][0])
{
printx=2;
printy=1+i*6;
FN_RawPrint2(msgstr[i]);
}
if (timecount>msgtime)
{
for(i=1;i<MSGQUESIZE;i++)
strcpy(msgstr[i-1],msgstr[i]);
msgstr[MSGQUESIZE-1][0]=0;
msgtime=timecount+MSGTIME;
}
}
void writemsg(char *s)
/* update current msg */
{
int i;
if (msgstr[MSGQUESIZE-1][0]!=0)
for(i=1;i<MSGQUESIZE;i++)
strcpy(msgstr[i-1],msgstr[i]);
strcpy(msgstr[MSGQUESIZE-1],s);
msgtime=timecount+MSGTIME; // 10 secs
}