From cb0be723b41f33efa5d679426f4212e9f1719e1f Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 11 Nov 2011 21:58:30 +0800 Subject: [PATCH] Usermode/AxWin3 - Cleaning up --- Usermode/Applications/axwin3_src/WM/video.c | 44 ++++++++++++++----- .../axwin3_src/WM/wm_render_text.c | 4 +- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Usermode/Applications/axwin3_src/WM/video.c b/Usermode/Applications/axwin3_src/WM/video.c index 393d5bf4..1306ebae 100644 --- a/Usermode/Applications/axwin3_src/WM/video.c +++ b/Usermode/Applications/axwin3_src/WM/video.c @@ -13,6 +13,7 @@ #include #include #include +#include // === PROTOTYPES === void Video_Setup(void); @@ -25,6 +26,8 @@ void Video_DrawRect(short X, short Y, short W, short H, uint32_t Color); int giVideo_CursorX; int giVideo_CursorY; uint32_t *gpScreenBuffer; + int giVideo_FirstDirtyLine; + int giVideo_LastDirtyLine; // === CODE === void Video_Setup(void) @@ -47,6 +50,8 @@ void Video_Setup(void) // Get dimensions giScreenWidth = ioctl( giTerminalFD, TERM_IOCTL_WIDTH, NULL ); giScreenHeight = ioctl( giTerminalFD, TERM_IOCTL_HEIGHT, NULL ); + + giVideo_LastDirtyLine = giScreenHeight; // Force VT to be shown ioctl( giTerminalFD, TERM_IOCTL_FORCESHOW, NULL ); @@ -61,10 +66,18 @@ void Video_Setup(void) void Video_Update(void) { - _SysDebug("Video_Update - gpScreenBuffer[0] = 0x%x", gpScreenBuffer[0]); - seek(giTerminalFD, 0, 1); - write(giTerminalFD, gpScreenBuffer, giScreenWidth*giScreenHeight*4); + int ofs = giVideo_FirstDirtyLine*giScreenWidth; + int size = (giVideo_LastDirtyLine-giVideo_FirstDirtyLine)*giScreenWidth; + + if( giVideo_LastDirtyLine == 0 ) return; + + _SysDebug("Video_Update - Updating lines %i to %i (0x%x+0x%x px)", + giVideo_FirstDirtyLine, giVideo_LastDirtyLine, ofs, size); + seek(giTerminalFD, ofs*4, 1); + write(giTerminalFD, gpScreenBuffer+ofs, size*4); _SysDebug("Video_Update - Done"); + giVideo_FirstDirtyLine = 0; + giVideo_LastDirtyLine = 0; } void Video_SetCursorPos(short X, short Y) @@ -84,11 +97,8 @@ void Video_SetCursorPos(short X, short Y) */ void Video_Blit(uint32_t *Source, short DstX, short DstY, short W, short H) { - int i; uint32_t *buf; -// _SysDebug("Video_Blit: (%p (%i, %i) %ix%i)", Source, DstX, DstY, W, H); - if( DstX >= giScreenWidth) return ; if( DstY >= giScreenHeight) return ; // TODO: Handle -ve X/Y by clipping @@ -99,15 +109,25 @@ void Video_Blit(uint32_t *Source, short DstX, short DstY, short W, short H) H = giScreenWidth - DstY; if( W <= 0 || H <= 0 ) return; + + if( DstX < giVideo_FirstDirtyLine ) + giVideo_FirstDirtyLine = DstY; + if( DstY + H > giVideo_LastDirtyLine ) + giVideo_LastDirtyLine = DstY + H; -// _SysDebug(" Clipped to (%i, %i) %ix%i", DstX, DstY, W, H); -// _SysDebug(" Source[0] = 0x%x", Source[0]); buf = gpScreenBuffer + DstY*giScreenWidth + DstX; - while( H -- ) + if(W != giScreenWidth) + { + while( H -- ) + { + memcpy(buf, Source, W*4); + Source += W; + buf += giScreenWidth; + } + } + else { - for( i = W; i --; ) - *buf++ = *Source++; - buf += giScreenWidth - W; + memcpy(buf, Source, giScreenWidth*H*4); } } diff --git a/Usermode/Applications/axwin3_src/WM/wm_render_text.c b/Usermode/Applications/axwin3_src/WM/wm_render_text.c index 9135ed3d..362669bf 100644 --- a/Usermode/Applications/axwin3_src/WM/wm_render_text.c +++ b/Usermode/Applications/axwin3_src/WM/wm_render_text.c @@ -73,8 +73,8 @@ int WM_Render_DrawText(tWindow *Window, int X, int Y, int W, int H, tFont *Font, tGlyph *glyph; uint32_t ch = 0; - _SysDebug("WM_Render_DrawText: (X=%i,Y=%i,W=%i,H=%i,Font=%p,", X, Y, W, H, Font); - _SysDebug(" Colour=%08x,Text='%s')", Colour, Text); +// _SysDebug("WM_Render_DrawText: (X=%i,Y=%i,W=%i,H=%i,Font=%p,", X, Y, W, H, Font); +// _SysDebug(" Colour=%08x,Text='%s')", Colour, Text); if(!Text) return 0; -- 2.20.1