#include <stdio.h>
#include <video.h>
#include <wm.h>
+#include <string.h>
// === PROTOTYPES ===
void Video_Setup(void);
int giVideo_CursorX;
int giVideo_CursorY;
uint32_t *gpScreenBuffer;
+ int giVideo_FirstDirtyLine;
+ int giVideo_LastDirtyLine;
// === CODE ===
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 );
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)
*/
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
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);
}
}
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;