jancity/src/font/src/font.c

117 lines
2.2 KiB
C

#include <font.h>
#include <gfx.h>
#include <stdarg.h>
#include <stdio.h>
struct sprite font_sprite;
static int renderstr(const enum font f, const short x, short y,
const char *str, const bool render, short *const max_x,
short *const max_y)
{
if (!str)
{
if (max_x)
*max_x = 0;
if (max_y)
*max_y = 0;
return 0;
}
static const struct cfg
{
const struct sprite *s;
short fw, fh, fs;
} cfgs[] =
{
[FONT] =
{
.s = &font_sprite,
.fw = 12,
.fh = 14,
.fs = 8
}
};
const struct cfg *const cfg = &cfgs[f];
char c;
short rx = x;
if (max_x)
*max_x = rx;
if (max_y)
*max_y = y + cfg->fh;
while ((c = *str++))
{
if (c == ' ')
{
rx += cfg->fs;
if (max_x && rx >= *max_x)
*max_x = rx;
continue;
}
else if (c == '\n' || c == '\r')
{
rx = x;
y += cfg->fh;
if (max_y)
*max_y = y;
continue;
}
if (render)
{
sprite_get_or_ret(s, -1);
if (sprite_clone(cfg->s, s))
return -1;
s->w = cfg->fw;
s->h = cfg->fh;
/* Substract non-printable characters (NUL to SP). */
const char ch = c - '!';
const short u = (cfg->fw * ch) % cfg->s->w;
const short v = cfg->fh * ((cfg->fw * ch) / cfg->s->w);
s->u += u;
s->v += v;
s->x = rx;
s->y = y;
if (sprite_sort(s))
{
fprintf(stderr, "%s: sprite_sort failed\n", __func__);
return -1;
}
}
rx += cfg->fs;
if (max_x && rx >= *max_x)
*max_x = rx;
}
return 0;
}
int font_dim(const enum font f, const char *const str, short *const x,
short *const y)
{
return renderstr(f, 0, 0, str, false, x, y);
}
int font_puts(const enum font f, const short x, const short y,
const char *const str)
{
return renderstr(f, x, y, str, true, NULL, NULL) ? EOF : 0;
}