Kernel/IPStack - (minor) TODO retransmit timer
[tpg/acess2.git] / KernelLand / Kernel / drvutil_video.c
index 05fa102..2bffb1a 100644 (file)
@@ -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 ++ )
@@ -455,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");
@@ -510,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 ;
@@ -520,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

UCC git Repository :: git.ucc.asn.au