// === PROTOTYPES ===
int Video_Install(char **Arguments);
-Uint64 Video_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
-Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer);
+size_t Video_Read(tVFS_Node *Node, Uint64 Offset, size_t Length, void *Buffer);
+size_t Video_Write(tVFS_Node *Node, Uint64 Offset, size_t Length, const void *Buffer);
int Video_IOCtl(tVFS_Node *Node, int ID, void *Data);
// --- 2D Acceleration Functions --
void Video_2D_Fill(void *Ent, Uint16 X, Uint16 Y, Uint16 W, Uint16 H, Uint32 Colour);
/**
* \brief Read from framebuffer (unimplemented)
*/
-Uint64 Video_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
+size_t Video_Read(tVFS_Node *Node, Uint64 Offset, size_t Length, void *Buffer)
{
return 0;
}
/**
* \brief Write to the framebuffer
*/
-Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Buffer)
+size_t Video_Write(tVFS_Node *Node, Uint64 Offset, size_t Length, const void *Buffer)
{
int i;
ENTER("pNode XOffset XLength pBuffer", Node, Offset, Length, Buffer);
LOG("buffer = %p", Buffer);
+ Offset /= 4;
startX = Offset % giUI_Width;
startY = Offset / giUI_Width;
-
- if( Length + startX < giUI_Width )
+ Length /= 4;
+
+ if( startX + Length < giUI_Width )
{
// Single line
UI_BlitBitmap(
Length, 1,
Buffer);
}
+ else if( startX == 0 )
+ {
+ int lines = Length / giUI_Width;
+ int rem = Length % giUI_Width;
+ UI_BlitBitmap(0, startY, giUI_Width, lines, Buffer);
+ if( rem ) {
+ UI_BlitBitmap(0, startY + lines, rem, 1, (Uint32*)Buffer + lines*giUI_Width);
+ }
+ }
else
{
// First scanline (partial or full)