#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; } }