X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrvutil_video.c;h=c8b044e04ac5bc3a6e98ab2ffd3fa228ac9adc46;hb=c8f8642db99f495f7baa098ba0169848bc411124;hp=05fa102684700f32a5072670b2d02e676a496faa;hpb=77099870d7148903cbf7b47409b7be0666a03753;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drvutil_video.c b/KernelLand/Kernel/drvutil_video.c index 05fa1026..c8b044e0 100644 --- a/KernelLand/Kernel/drvutil_video.c +++ b/KernelLand/Kernel/drvutil_video.c @@ -265,12 +265,16 @@ int DrvUtil_Video_WriteLFB(tDrvUtil_Video_BufInfo *FBInfo, size_t Offset, size_t px = (void*)dest; } } + if( x > 0 ) { + dest += FBInfo->Pitch; + } } else { ofs = Offset; dest += ofs; memcpy(dest, Buffer, Length); + dest += Length; } break; default: @@ -293,9 +297,11 @@ int DrvUtil_Video_WriteLFB(tDrvUtil_Video_BufInfo *FBInfo, size_t Offset, size_t return -1; } if( FBInfo->BackBuffer && dest ) { - memcpy((char*)FBInfo->Framebuffer + ofs, (char*)FBInfo->BackBuffer + ofs, - ((tVAddr)dest - (tVAddr)FBInfo->BackBuffer) - ofs - ); + void *_dst = (char*)FBInfo->Framebuffer + ofs; + void *_src = (char*)FBInfo->BackBuffer + ofs; + size_t len = ((tVAddr)dest - (tVAddr)FBInfo->BackBuffer) - ofs; + // Log_Debug("DrvUtil", "Copy from BB %p to FB %p 0x%x bytes", _src, _dst, len); + memcpy(_dst, _src, len); } DrvUtil_Video_DrawCursor(FBInfo, csr_x, csr_y); @@ -344,6 +350,12 @@ int DrvUtil_Video_SetCursor(tDrvUtil_Video_BufInfo *Buf, tVideo_IOCtl_Bitmap *Bi LEAVE('i', -1); return -1; } + ASSERTCR(Bitmap->W, >, 0, -1); + ASSERTCR(Bitmap->H, >, 0, -1); + ASSERTCR(Bitmap->XOfs, <, Bitmap->W, -1); + ASSERTCR(Bitmap->XOfs, >, -Bitmap->W, -1); + ASSERTCR(Bitmap->YOfs, <, Bitmap->H, -1); + ASSERTCR(Bitmap->YOfs, >, -Bitmap->H, -1); // Don't take a copy of the DrvUtil provided cursor if( Bitmap == &gDrvUtil_TextModeCursor ) @@ -401,8 +413,18 @@ void DrvUtil_Video_DrawCursor(tDrvUtil_Video_BufInfo *Buf, int X, int Y) Y -= Buf->CursorBitmap->YOfs; // Get the width of the cursor on screen (clipping to right/bottom edges) - render_w = X > Buf->Width - Buf->CursorBitmap->W ? Buf->Width - X : Buf->CursorBitmap->W; - render_h = Y > Buf->Height - Buf->CursorBitmap->H ? Buf->Height - Y : Buf->CursorBitmap->H; + ASSERTC(Buf->Width, >, 0); + ASSERTC(Buf->Height, >, 0); + ASSERTC(Buf->CursorBitmap->W, >, 0); + ASSERTC(Buf->CursorBitmap->H, >, 0); + + render_w = MIN(Buf->Width - X, Buf->CursorBitmap->W); + render_h = MIN(Buf->Height - Y, Buf->CursorBitmap->H); + //render_w = X > Buf->Width - Buf->CursorBitmap->W ? Buf->Width - X : Buf->CursorBitmap->W; + //render_h = Y > Buf->Height - Buf->CursorBitmap->H ? Buf->Height - Y : Buf->CursorBitmap->H; + + ASSERTC(render_w, >=, 0); + ASSERTC(render_h, >=, 0); // Clipp to left/top edges if(X < 0) { render_ox = -X; X = 0; } @@ -441,6 +463,9 @@ void DrvUtil_Video_RenderCursor(tDrvUtil_Video_BufInfo *Buf) if( !Buf->CursorSaveBuf ) Buf->CursorSaveBuf = malloc( Buf->CursorBitmap->W*Buf->CursorBitmap->H*bytes_per_px ); + ASSERTC(render_w, >=, 0); + ASSERTC(render_h, >=, 0); + LOG("Saving back"); // Save behind the cursor for( y = 0; y < render_h; y ++ )