px = (void*)dest;
}
}
+ if( x > 0 ) {
+ dest += FBInfo->Pitch;
+ }
}
else
{
ofs = Offset;
dest += ofs;
memcpy(dest, Buffer, Length);
+ dest += Length;
}
break;
default:
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);
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 )
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; }
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 ++ )
{
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");
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 ;
// 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