vxKernel/src/modules/display/dtext.c

58 lines
1.2 KiB
C

#include "vhex/display.h"
#include "vhex/defs/types.h"
#include <stdarg.h>
#include <stdio.h>
//TODO: dynamic
extern struct {
uint32_t width;
uint32_t height;
uint32_t pixel[];
} font8x9;
/* dtext_opt(): Display a string of text */
void dtext_opt(
int x, int y,
int fg, int bg,
int halign, int valign,
char const *str, int size
) {
int height;
int width;
if (size < 0)
size = 65535;
dnsize(str, size, &width, &height);
if (halign == DTEXT_CENTER) x = x - (width / 2);
if (halign == DTEXT_RIGHT) x = x - (width);
if (valign == DTEXT_CENTER) y = y - (height / 2);
if (valign == DTEXT_BOTTOM) y = y - (height);
//TODO: line-discipline
for (int i = 0; str[i] != '\0' && i < size; ++i) {
dascii(x, y, fg, bg, str[i]);
x += font8x9.width + 1;
}
}
/* dtext() : display text information */
void dtext(int x, int y, int fg, char const * restrict const text)
{
dtext_opt(x, y, fg, C_NONE, DTEXT_LEFT, DTEXT_TOP, text, -1);
}
void dprint(int x, int y, int fg, char const * const text, ...)
{
va_list ap;
char buff[1024];
va_start(ap, text);
vsnprintf(buff, 1024, text, ap);
va_end(ap);
dtext_opt(x, y, fg, C_NONE, DTEXT_LEFT, DTEXT_TOP, buff, -1);
}