aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/plush/TEXT.C
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/plush/TEXT.C')
-rw-r--r--Src/Winamp/plush/TEXT.C123
1 files changed, 123 insertions, 0 deletions
diff --git a/Src/Winamp/plush/TEXT.C b/Src/Winamp/plush/TEXT.C
new file mode 100644
index 00000000..ff555bb9
--- /dev/null
+++ b/Src/Winamp/plush/TEXT.C
@@ -0,0 +1,123 @@
+/******************************************************************************
+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);
+}