X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin2_src%2FWM%2Fvideo_text.c;h=5dc462f27608a9ee07755bb0463180042e693b4b;hb=7758e1bf2e2a1ad35def1eb8cf9aab55d13e05a0;hp=897c4116dc96db1ba5684255bf01f25e67533c7d;hpb=92517b68b7582251f69db7e062d5e5a4c773791f;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 897c4116..5dc462f2 100644 --- a/Usermode/Applications/axwin2_src/WM/video_text.c +++ b/Usermode/Applications/axwin2_src/WM/video_text.c @@ -23,7 +23,7 @@ typedef struct sGlyph { short TrueHeight; // Bitmap Data - uint8_t Bitmap[]; + uint8_t Bitmap[]; // 8-bit alpha } tGlyph; @@ -62,6 +62,9 @@ int Video_DrawText(short X, short Y, short W, short H, tFont *Font, uint32_t Col int xOfs = 0; tGlyph *glyph; uint32_t ch = 0; + + _SysDebug("Video_DrawText: (X=%i,Y=%i,W=%i,H=%i,Font=%p,", X, Y, W, H, Font); + _SysDebug(" Color=%08x,Text='%s')", Color, Text); // Check the bounds if(W < 0 || X < 0 || X >= giScreenWidth) return 0; @@ -80,8 +83,7 @@ int Video_DrawText(short X, short Y, short W, short H, tFont *Font, uint32_t Col // Find (or load) the glyph glyph = _GetGlyph(Font, ch); - if( glyph ) - continue ; // If not found, just don't render it + if( !glyph ) continue ; // If not found, just don't render it // End render if it will overflow the perscribed range if( xOfs + glyph->TrueWidth > W ) @@ -103,7 +105,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]; @@ -186,7 +188,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) @@ -199,6 +231,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; @@ -207,8 +242,12 @@ 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 ); + ret->Codepoint = Codepoint; + ret->Width = FONT_WIDTH; ret->Height = FONT_HEIGHT; @@ -218,16 +257,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;