#include "stdarg.h" #include "stdio.h" #include "string.h" #include "strings33.h" #include "types.h" extern Font33 defFont; extern Font33 bigFont; static Font33 *fonts[2] = { &defFont, &bigFont }; static u32 textColours[9] = { 0xff000000, 0xffffffff, 0xffff0000, 0xff00ff00, 0xff0000ff, 0xffffff00, 0xff00ffff, 0xffff00ff, 0xffffaa00, }; void e33_uprintf( Surface *surf, Size f, u32 col, Size x, Size y, const char *fmt, ... ) { static char tmp[512]; va_list args; va_start(args, fmt); vsprintf(tmp, fmt, args); e33_uprint( surf, f, col, x, y, tmp ); va_end(args); } void e33_uprint( Surface *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; Size fbw = surf->w; Size fbh = surf->h; u32 *out; uSize slen = strlen(str); Size strWid = 0; for( i = 0; i < slen; ++i ) { if( str[i] < 0x20 ) continue; strWid += glyphs[ str[i] - 0x20 ].width; } if( (x + strWid) >= sWidth ) { x -= (strWid - (sWidth - x)); } if( (y + font->height) >= sHeight ) { y -= (font->height - (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 < slen; ++i ) { if( str[i] < 0x20 ) { col = textColours[str[i]]; continue; } FontGlyph33 *glyph = &glyphs[ str[i] - 0x20 ]; Size numPlots = glyph->num_plots; Size gWidth = glyph->width; u16 *plots = glyph->plots; for( j = 0; j < numPlots; ++j ) { Size plot = plots[j]; Size offset = (((plot & font->yAnd) * fbw) + (plot >> font->xShift)) + ofs; memcpy( out + offset, &col, sizeof(u32) ); } ofs += gWidth; } }