1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "strings33.h"
#include "types33.h"
static Font33 *fonts[2] = {
&defFont, &bigFont
};
static u32 textColours[9] = {
BLACK,
RED,
GREEN,
BLUE,
YELLOW,
ORANGE,
MAGENTA,
CYAN,
WHITE
};
void e33_uprintf( Surface33 *surf, Size f, u32 col, Size x, Size y, const char *fmt, ... )
{
static char tmp[ _STRING_MAX ];
va_list args;
va_start(args, fmt);
vsnprintf(tmp, _STRING_MAX, fmt, args);
e33_uprint( surf, f, col, x, y, tmp );
va_end(args);
}
void e33_uprint( Surface33 *surf, Size f, u32 col, Size x, Size y, const char *str )
{
Size i, j, ofs;
Font33 *font = fonts[f];
Size sWidth = surf->w;
Size sHeight = surf->h;
FontGlyph33 *glyphs = font->glyphs;
u32 *out;
uSize stringLen = strlen(str);
Size strWid = 0;
for( i = 0; i < stringLen; ++i ) {
if( str[i] < 0x20 ) continue;
strWid += glyphs[ str[i] - 0x20 ].w;
}
if( (x + strWid) >= sWidth ) {
x -= (strWid - (sWidth - x));
}
if( (y + font->h) >= sHeight ) {
y -= (font->h- (sHeight - y));
}
if(x < 0) { x = 0; }
if(y < 0) { y = 0; }
out = surf->data + (x + (y * surf->w));
for( i = 0, ofs = 0; i < stringLen; ++i )
{
if( str[i] < 0x20 )
{
col = textColours[str[i]];
continue;
}
FontGlyph33 *glyph = &glyphs[ str[i] - 0x20 ];
Size numPlots = glyph->plotCount;
Size gWidth = glyph->w;
u16 *plots = glyph->plots;
for( j = 0; j < numPlots; ++j )
{
Size plot = plots[j];
Size offset = (((plot & font->yAnd) * sWidth) + (plot >> font->xShift)) + ofs;
memcpy( out + offset, &col, sizeof(u32) );
}
ofs += gWidth;
}
}
|