X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrvutil_video.c;h=2bffb1ae92f0b932eccaf4bda790c02964c55db3;hb=9c4eedf4893f851bd1ba60ce541c8d098a9ef7f7;hp=2bee791fafeaf176fa280a870fb9de87a120ec89;hpb=fb3abbad5dfd71ea2b190d0b33d9c57e879fb15a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drvutil_video.c b/KernelLand/Kernel/drvutil_video.c index 2bee791f..2bffb1ae 100644 --- a/KernelLand/Kernel/drvutil_video.c +++ b/KernelLand/Kernel/drvutil_video.c @@ -350,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 ) @@ -407,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; } @@ -447,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 ++ ) @@ -461,7 +480,8 @@ void DrvUtil_Video_RenderCursor(tDrvUtil_Video_BufInfo *Buf) { case 15: case 16: - Log_Warning("DrvUtil", "TODO: Support 15/16 bpp modes in cursor draw"); + //Log_Warning("DrvUtil", "TODO: Support 15/16 bpp modes in cursor draw"); + //Proc_PrintBacktrace(); break; case 24: LOG("24-bit render"); @@ -516,8 +536,6 @@ void DrvUtil_Video_RenderCursor(tDrvUtil_Video_BufInfo *Buf) void DrvUtil_Video_RemoveCursor(tDrvUtil_Video_BufInfo *Buf) { int bytes_per_px = (Buf->Depth + 7) / 8; - int y, save_pitch; - Uint8 *dest, *src; // Just a little sanity if( !Buf->CursorBitmap || Buf->CursorX == -1 ) return ; @@ -526,16 +544,21 @@ void DrvUtil_Video_RemoveCursor(tDrvUtil_Video_BufInfo *Buf) // Debug("DrvUtil_Video_RemoveCursor: (Buf=%p) dest_x=%i, dest_y=%i", Buf, Buf->CursorDestX, Buf->CursorDestY); // Set up - save_pitch = Buf->CursorBitmap->W * bytes_per_px; - dest = (Uint8*)Buf->Framebuffer + Buf->CursorDestY * Buf->Pitch + Buf->CursorDestX*bytes_per_px; - src = Buf->CursorSaveBuf; - + size_t save_pitch = Buf->CursorBitmap->W * bytes_per_px; + Uint8 *dst = (Uint8*)Buf->Framebuffer + Buf->CursorDestY * Buf->Pitch + Buf->CursorDestX*bytes_per_px; + const Uint8 *src = Buf->CursorSaveBuf; + + ASSERT(Buf->Framebuffer); + ASSERT(src); + ASSERT(CheckMem(dst, Buf->CursorRenderH*Buf->Pitch)); + ASSERT(CheckMem(src, Buf->CursorRenderH*save_pitch)); + // Copy each line back - for( y = 0; y < Buf->CursorRenderH; y ++ ) + for( int y = 0; y < Buf->CursorRenderH; y ++ ) { - memcpy( dest, src, Buf->CursorRenderW * bytes_per_px ); + memcpy( dst, src, Buf->CursorRenderW * bytes_per_px ); src += save_pitch; - dest += Buf->Pitch; + dst += Buf->Pitch; } // Set the cursor as removed