X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fvideo.c;h=dfdd2e50e33462b579e81569b8f90e7ce43777d0;hb=4c78a1bdd506cda6cda27ee342165c7dfa7ecdc2;hp=3adb17d4a06065304dc5172bc57147e25f1fab06;hpb=4c76c235551f3f936a20b17cfe727578644493f1;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/video.c b/Usermode/Applications/axwin3_src/WM/video.c index 3adb17d4..dfdd2e50 100644 --- a/Usermode/Applications/axwin3_src/WM/video.c +++ b/Usermode/Applications/axwin3_src/WM/video.c @@ -38,7 +38,7 @@ void Video_Setup(void) // Open terminal #if 0 - giTerminalFD = open(gsTerminalDevice, OPENFLAG_READ|OPENFLAG_WRITE); + giTerminalFD = _SysOpen(gsTerminalDevice, OPENFLAG_READ|OPENFLAG_WRITE); if( giTerminalFD == -1 ) { fprintf(stderr, "ERROR: Unable to open '%s' (%i)\n", gsTerminalDevice, _errno); @@ -48,10 +48,11 @@ void Video_Setup(void) giTerminalFD = 1; giTerminalFD_Input = 0; // Check that the console is a VT - // - ioctl(..., 0, NULL) returns the type, which should be 2 - if( ioctl(1, 0, NULL) != 2 ) + // - _SysIOCtl(..., 0, NULL) returns the type, which should be 2 + tmpInt = _SysIOCtl(1, 0, NULL); + if( tmpInt != 2 ) { - fprintf(stderr, "stdout is not an Acess VT, can't start"); + fprintf(stderr, "stdout is not an Acess VT, can't start (2 exp, %i got)\n", tmpInt); _SysDebug("stdout is not an Acess VT, can't start"); exit(-1); } @@ -59,22 +60,22 @@ void Video_Setup(void) // Set mode to video tmpInt = TERM_MODE_FB; - ioctl( giTerminalFD, TERM_IOCTL_MODETYPE, &tmpInt ); + _SysIOCtl( giTerminalFD, TERM_IOCTL_MODETYPE, &tmpInt ); // Get dimensions - giScreenWidth = ioctl( giTerminalFD, TERM_IOCTL_WIDTH, NULL ); - giScreenHeight = ioctl( giTerminalFD, TERM_IOCTL_HEIGHT, NULL ); + giScreenWidth = _SysIOCtl( giTerminalFD, TERM_IOCTL_WIDTH, NULL ); + giScreenHeight = _SysIOCtl( giTerminalFD, TERM_IOCTL_HEIGHT, NULL ); giVideo_LastDirtyLine = giScreenHeight; // Force VT to be shown - ioctl( giTerminalFD, TERM_IOCTL_FORCESHOW, NULL ); + _SysIOCtl( giTerminalFD, TERM_IOCTL_FORCESHOW, NULL ); // Create local framebuffer (back buffer) gpScreenBuffer = malloc( giScreenWidth*giScreenHeight*4 ); // Set cursor position and bitmap - ioctl(giTerminalFD, TERM_IOCTL_SETCURSORBITMAP, &cCursorBitmap); + _SysIOCtl(giTerminalFD, TERM_IOCTL_SETCURSORBITMAP, &cCursorBitmap); Video_SetCursorPos( giScreenWidth/2, giScreenHeight/2 ); } @@ -87,11 +88,11 @@ void Video_Update(void) _SysDebug("Video_Update - Updating lines %i to %i (0x%x+0x%x px)", giVideo_FirstDirtyLine, giVideo_LastDirtyLine, ofs, size); - seek(giTerminalFD, ofs*4, 1); - _SysDebug("Video_Update - Sending"); - write(giTerminalFD, gpScreenBuffer+ofs, size*4); + _SysSeek(giTerminalFD, ofs*4, SEEK_SET); + _SysDebug("Video_Update - Sending FD %i %p 0x%x", giTerminalFD, gpScreenBuffer+ofs, size*4); + _SysWrite(giTerminalFD, gpScreenBuffer+ofs, size*4); _SysDebug("Video_Update - Done"); - giVideo_FirstDirtyLine = 0; + giVideo_FirstDirtyLine = giScreenHeight; giVideo_LastDirtyLine = 0; } @@ -103,7 +104,7 @@ void Video_SetCursorPos(short X, short Y) } pos; pos.x = giVideo_CursorX = X; pos.y = giVideo_CursorY = Y; - ioctl(giTerminalFD, TERM_IOCTL_GETSETCURSOR, &pos); + _SysIOCtl(giTerminalFD, TERM_IOCTL_GETSETCURSOR, &pos); } void Video_FillRect(int X, int Y, int W, int H, uint32_t Colour) @@ -132,35 +133,48 @@ void Video_FillRect(int X, int Y, int W, int H, uint32_t Colour) void Video_Blit(uint32_t *Source, short DstX, short DstY, short W, short H) { uint32_t *buf; + short drawW = W; if( DstX >= giScreenWidth) return ; if( DstY >= giScreenHeight) return ; - // TODO: Handle -ve X/Y by clipping - if( DstX < 0 || DstY < 0 ) return ; - // TODO: Handle out of bounds by clipping too - if( DstX + W > giScreenWidth ) return; + // Drawing oob to left/top, clip + if( DstX < 0 ) { + Source += -DstX; + drawW -= -DstX; + DstX = 0; + } + if( DstY < 0 ) { + Source += (-DstY)*W; + H -= -DstY; + DstY = 0; + } + if( drawW < 0 ) return ; + // Drawing oob to the right, clip + if( DstX + drawW > giScreenWidth ) { + //int oldw = drawW; + drawW = giScreenWidth - DstX; + } if( DstY + H > giScreenHeight ) - H = giScreenWidth - DstY; + H = giScreenHeight - DstY; if( W <= 0 || H <= 0 ) return; - if( DstX < giVideo_FirstDirtyLine ) - giVideo_FirstDirtyLine = DstY; - if( DstY + H > giVideo_LastDirtyLine ) - giVideo_LastDirtyLine = DstY + H; + giVideo_FirstDirtyLine = MIN(DstY, giVideo_FirstDirtyLine); + giVideo_LastDirtyLine = MAX(DstY+H, giVideo_LastDirtyLine); buf = gpScreenBuffer + DstY*giScreenWidth + DstX; - if(W != giScreenWidth) + if(drawW != giScreenWidth || W != giScreenWidth) { while( H -- ) { - memcpy(buf, Source, W*4); + memcpy(buf, Source, drawW*4); Source += W; buf += giScreenWidth; } } else { + // Only valid if copying full scanlines on both ends memcpy(buf, Source, giScreenWidth*H*4); } }