X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin2_src%2FWM%2Fvideo_text.c;h=3d680d5d188ee0420fae2d803c2cec1cbc317a55;hb=0b1cdd6b52e410ad8784eaf37c24141e947d1091;hp=ed297e285f7de514f5e19d00d85a23e988bd6120;hpb=314eeb0078d801ddc34718603cad4fa690392496;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin2_src/WM/video_text.c b/Usermode/Applications/axwin2_src/WM/video_text.c index ed297e28..3d680d5d 100644 --- a/Usermode/Applications/axwin2_src/WM/video_text.c +++ b/Usermode/Applications/axwin2_src/WM/video_text.c @@ -2,6 +2,7 @@ * Acess GUI (AxWin) Version 2 * By John Hodge (thePowersGang) */ +#include #include "common.h" typedef struct sGlyph { @@ -23,7 +24,7 @@ typedef struct sGlyph { short TrueHeight; // Bitmap Data - uint8_t Bitmap[]; + uint8_t Bitmap[]; // 8-bit alpha } tGlyph; @@ -43,14 +44,15 @@ struct sFont { // === PROTOTYPES === int Video_DrawText(short X, short Y, short W, short H, tFont *Font, uint32_t Color, char *Text); +void Video_GetTextDims(tFont *Font, const char *Text, int *W, int *H); tGlyph *_GetGlyph(tFont *Font, uint32_t Codepoint); void _RenderGlyph(short X, short Y, tGlyph *Glyph, uint32_t Color); tGlyph *_SystemFont_CacheGlyph(tFont *Font, uint32_t Codepoint); - int ReadUTF8(char *Input, uint32_t *Output); + int ReadUTF8(const char *Input, uint32_t *Output); // === GLOBALS === tFont gSystemFont = { - CacheGlyph: _SystemFont_CacheGlyph + .CacheGlyph = _SystemFont_CacheGlyph }; // === CODE === @@ -96,6 +98,27 @@ int Video_DrawText(short X, short Y, short W, short H, tFont *Font, uint32_t Col return xOfs; } +void Video_GetTextDims(tFont *Font, const char *Text, int *W, int *H) +{ + int w=0, h=0; + uint32_t ch; + tGlyph *glyph; + if( !Font ) Font = &gSystemFont; + + while( *Text ) + { + Text += ReadUTF8(Text, &ch); + glyph = _GetGlyph(Font, ch); + if( !glyph ) continue; + + w += glyph->Width; + if( h < glyph->Height ) h = glyph->Height; + } + + if(W) *W = w; + if(H) *H = h; +} + tGlyph *_GetGlyph(tFont *Font, uint32_t Codepoint) { tGlyph *next = NULL, *prev = NULL; @@ -105,7 +128,7 @@ tGlyph *_GetGlyph(tFont *Font, uint32_t Codepoint) if( Codepoint < 128 ) { if( Font->AsciiGlyphs[Codepoint] == NULL ) { - Font->CacheGlyph(Font, Codepoint); + Font->AsciiGlyphs[Codepoint] = Font->CacheGlyph(Font, Codepoint); } return Font->AsciiGlyphs[Codepoint]; @@ -188,7 +211,37 @@ tGlyph *_GetGlyph(tFont *Font, uint32_t Codepoint) */ void _RenderGlyph(short X, short Y, tGlyph *Glyph, uint32_t Color) { - + int xStart = 0, yStart = 0; + int x, y; + uint32_t *outBuf; + uint8_t *inBuf; + // TODO: Implement + + X += Glyph->OffsetX; + if( X < 0 ) { // If -ve, skip the first -X collums + xStart = -X; + X = 0; + } + + Y += Glyph->OffsetY; + if( Y < 0 ) { // If -ve, skip the first -Y lines + yStart = -Y; + Y = 0; + } + + outBuf = gpScreenBuffer + Y*giScreenWidth + X; + inBuf = Glyph->Bitmap + yStart*Glyph->TrueWidth; + + for( y = yStart; y < Glyph->TrueHeight; y ++ ) + { + for( x = xStart; x < Glyph->TrueWidth; x ++ ) + { + outBuf[x] = Video_AlphaBlend( outBuf[x], Color, inBuf[x] ); + } + outBuf += giScreenWidth; + inBuf += Glyph->TrueWidth; + + } } // Load system font (8x16 monospace) @@ -201,6 +254,9 @@ tGlyph *_SystemFont_CacheGlyph(tFont *Font, uint32_t Codepoint) int i; uint8_t index = 0; tGlyph *ret; + uint8_t *data; + + _SysDebug("_SystemFont_CacheGlyph: (Font=%p, Codepoint=0x%06x)", Font, Codepoint); if( Codepoint < 128 ) { index = Codepoint; @@ -209,7 +265,15 @@ tGlyph *_SystemFont_CacheGlyph(tFont *Font, uint32_t Codepoint) index = '?'; // Unknowns come out as a question mark } + _SysDebug(" index = %i", index); + ret = malloc( sizeof(tGlyph) + FONT_WIDTH*FONT_HEIGHT ); + if( !ret ) { + _SysDebug("ERROR: malloc(%i) failed", sizeof(tGlyph) + FONT_WIDTH*FONT_HEIGHT); + return NULL; + } + + ret->Codepoint = Codepoint; ret->Width = FONT_WIDTH; ret->Height = FONT_HEIGHT; @@ -220,16 +284,18 @@ tGlyph *_SystemFont_CacheGlyph(tFont *Font, uint32_t Codepoint) ret->OffsetX = 0; ret->OffsetY = 0; + data = &VTermFont[index * FONT_HEIGHT]; + for( i = 0; i < FONT_HEIGHT; i ++ ) { - ret->Bitmap[ i * 8 + 0 ] = VTermFont[index] & (1 << 0) ? 255 : 0; - ret->Bitmap[ i * 8 + 1 ] = VTermFont[index] & (1 << 1) ? 255 : 0; - ret->Bitmap[ i * 8 + 2 ] = VTermFont[index] & (1 << 2) ? 255 : 0; - ret->Bitmap[ i * 8 + 3 ] = VTermFont[index] & (1 << 3) ? 255 : 0; - ret->Bitmap[ i * 8 + 4 ] = VTermFont[index] & (1 << 4) ? 255 : 0; - ret->Bitmap[ i * 8 + 5 ] = VTermFont[index] & (1 << 5) ? 255 : 0; - ret->Bitmap[ i * 8 + 6 ] = VTermFont[index] & (1 << 6) ? 255 : 0; - ret->Bitmap[ i * 8 + 7 ] = VTermFont[index] & (1 << 7) ? 255 : 0; + ret->Bitmap[ i * 8 + 0 ] = data[i] & (1 << 7) ? 255 : 0; + ret->Bitmap[ i * 8 + 1 ] = data[i] & (1 << 6) ? 255 : 0; + ret->Bitmap[ i * 8 + 2 ] = data[i] & (1 << 5) ? 255 : 0; + ret->Bitmap[ i * 8 + 3 ] = data[i] & (1 << 4) ? 255 : 0; + ret->Bitmap[ i * 8 + 4 ] = data[i] & (1 << 3) ? 255 : 0; + ret->Bitmap[ i * 8 + 5 ] = data[i] & (1 << 2) ? 255 : 0; + ret->Bitmap[ i * 8 + 6 ] = data[i] & (1 << 1) ? 255 : 0; + ret->Bitmap[ i * 8 + 7 ] = data[i] & (1 << 0) ? 255 : 0; } return ret; @@ -240,9 +306,9 @@ tGlyph *_SystemFont_CacheGlyph(tFont *Font, uint32_t Codepoint) * \fn int ReadUTF8(char *Input, uint32_t *Val) * \brief Read a UTF-8 character from a string */ -int ReadUTF8(char *Input, uint32_t *Val) +int ReadUTF8(const char *Input, uint32_t *Val) { - uint8_t *str = (uint8_t *)Input; + const uint8_t *str = (const uint8_t *)Input; *Val = 0xFFFD; // Assume invalid character // ASCII