124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
|
/******************************************************************************
|
||
|
Plush Version 1.1
|
||
|
text.c
|
||
|
Text code and data (8xX bitmapped)
|
||
|
Copyright (c) 1996-2000, Justin Frankel
|
||
|
******************************************************************************/
|
||
|
|
||
|
#include "plush.h"
|
||
|
#include <stdarg.h>
|
||
|
|
||
|
static pl_uChar font_height = 16;
|
||
|
|
||
|
static pl_uChar *current_font = plText_DefaultFont;
|
||
|
|
||
|
void plTextSetFont(pl_uChar *font, pl_uChar height) {
|
||
|
current_font = font;
|
||
|
font_height = height;
|
||
|
}
|
||
|
|
||
|
void plTextPutChar(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
|
||
|
pl_uChar color, pl_uChar c) {
|
||
|
pl_uChar *font = current_font + (c*font_height);
|
||
|
pl_sInt offset = x+(y*cam->ScreenWidth);
|
||
|
pl_ZBuffer zz = (pl_ZBuffer) (1.0/z);
|
||
|
pl_sInt xx = x, a;
|
||
|
pl_uChar len = font_height;
|
||
|
pl_uChar ch;
|
||
|
pl_uChar *outmem;
|
||
|
pl_ZBuffer *zbuffer;
|
||
|
if (y+font_height < cam->ClipTop || y >= cam->ClipBottom) return;
|
||
|
if (y < cam->ClipTop) {
|
||
|
font += (cam->ClipTop-y);
|
||
|
offset += (cam->ClipTop-y)*cam->ScreenWidth;
|
||
|
len -= (cam->ClipTop-y);
|
||
|
y = cam->ClipTop;
|
||
|
}
|
||
|
if (y+font_height >= cam->ClipBottom) {
|
||
|
len = cam->ClipBottom-y;
|
||
|
}
|
||
|
if (len > 0) {
|
||
|
if (cam->zBuffer && z != 0.0) do {
|
||
|
outmem = cam->frameBuffer + offset;
|
||
|
zbuffer = cam->zBuffer + offset;
|
||
|
offset += cam->ScreenWidth;
|
||
|
xx = x;
|
||
|
ch = *font++;
|
||
|
a = 128;
|
||
|
while (a) {
|
||
|
if (xx >= cam->ClipRight) break;
|
||
|
if (xx++ >= cam->ClipLeft)
|
||
|
if (ch & a)
|
||
|
if (zz > *zbuffer) {
|
||
|
*zbuffer = zz;
|
||
|
*outmem = color;
|
||
|
}
|
||
|
zbuffer++;
|
||
|
outmem++;
|
||
|
a >>= 1;
|
||
|
}
|
||
|
if (a) break;
|
||
|
} while (--len);
|
||
|
else do {
|
||
|
outmem = cam->frameBuffer + offset;
|
||
|
offset += cam->ScreenWidth;
|
||
|
xx = x;
|
||
|
ch = *font++;
|
||
|
a = 128;
|
||
|
while (a) {
|
||
|
if (xx >= cam->ClipRight) break;
|
||
|
if (xx++ >= cam->ClipLeft) if (ch & a) *outmem = color;
|
||
|
outmem++;
|
||
|
a >>= 1;
|
||
|
}
|
||
|
if (a) break;
|
||
|
} while (--len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void plTextPutStr(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
|
||
|
pl_uChar color, pl_sChar *string) {
|
||
|
pl_sInt xx = x;
|
||
|
while (*string) {
|
||
|
switch (*string) {
|
||
|
case '\n': y += font_height; xx = x; break;
|
||
|
case ' ': xx += 8; break;
|
||
|
case '\r': break;
|
||
|
case '\t': xx += 8*5; break;
|
||
|
default:
|
||
|
plTextPutChar(cam,xx,y,z,color,(pl_uChar) *string);
|
||
|
xx += 8;
|
||
|
break;
|
||
|
}
|
||
|
string++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void plTextPutStrW(pl_Cam* cam, pl_sInt x, pl_sInt y, pl_Float z,
|
||
|
pl_uChar color, const wchar_t* string) {
|
||
|
pl_sInt xx = x;
|
||
|
while (*string) {
|
||
|
switch (*string) {
|
||
|
case L'\n': y += font_height; xx = x; break;
|
||
|
case L' ': xx += 8; break;
|
||
|
case L'\r': break;
|
||
|
case L'\t': xx += 8 * 5; break;
|
||
|
default:
|
||
|
plTextPutChar(cam, xx, y, z, color, (pl_uChar)*string);
|
||
|
xx += 8;
|
||
|
break;
|
||
|
}
|
||
|
string++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void plTextPrintf(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
|
||
|
pl_uChar color, pl_sChar *format, ...) {
|
||
|
va_list arglist;
|
||
|
pl_sChar str[256];
|
||
|
va_start(arglist, format);
|
||
|
vsprintf((char *)str, (char *) format,arglist);
|
||
|
va_end(arglist);
|
||
|
plTextPutStr(cam,x,y,z,color,str);
|
||
|
}
|