#include <vfs.h>
#include <fs_devfs.h>
#include <modules.h>
-#include <tpl_drv_video.h>
+#include <api_drv_video.h>
#include "ui.h"
// === 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, 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);
// === GLOBALS ===
//MODULE_DEFINE(0, VERSION, NativeVideo, Video_Install, NULL, NULL);
-tDevFS_Driver gVideo_DriverStruct = {
- NULL, "NativeVideo",
- {
+tVFS_NodeType gVideo_NodeType = {
.Read = Video_Read,
.Write = Video_Write,
.IOCtl = Video_IOCtl
- }
+};
+tDevFS_Driver gVideo_DriverStruct = {
+ NULL, "NativeVideo",
+ {.Type = &gVideo_NodeType}
};
int giVideo_DriverID;
int giVideo_CurrentFormat;
/**
* \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, 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);
{
case VIDEO_BUFFMT_TEXT:
{
- tVT_Char *chars = Buffer;
+ const tVT_Char *chars = Buffer;
// int pitch = giUI_Pitch;
int widthInChars = giUI_Width/giVT_CharWidth;
int heightInChars = giUI_Height/giVT_CharHeight;
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)
#if 0
case VIDEO_IOCTL_SETCURSOR: // Set cursor position
#if !BLINKING_CURSOR
- if(giVesaCursorX > 0)
- Vesa_FlipCursor(Node);
+ if(giVideo_CursorX > 0)
+ Video_FlipCursor(Node);
#endif
- giVesaCursorX = ((tVideo_IOCtl_Pos*)Data)->x;
- giVesaCursorY = ((tVideo_IOCtl_Pos*)Data)->y;
- //Log_Debug("VESA", "Cursor position (%i,%i)", giVesaCursorX, giVesaCursorY);
- if(
- giVesaCursorX < 0 || giVesaCursorY < 0
- || giVesaCursorX >= gpVesaCurMode->width/giVT_CharWidth
- || giVesaCursorY >= gpVesaCurMode->height/giVT_CharHeight)
+ giVideo_CursorX = ((tVideo_IOCtl_Pos*)Data)->x;
+ giVideo_CursorY = ((tVideo_IOCtl_Pos*)Data)->y;
+ if( giVideo_CursorX < 0 || giVesaCursorY < 0
+ || giVideo_CursorX >= gpVesaCurMode->width/giVT_CharWidth
+ || giVideo_CursorY >= gpVesaCurMode->height/giVT_CharHeight)
{
#if BLINKING_CURSOR
if(giVesaCursorTimer != -1) {
//Log_Debug("VESA", "Cursor position (%i,%i) Timer %i", giVesaCursorX, giVesaCursorY, giVesaCursorTimer);
return 0;
#endif
-
- case VIDEO_IOCTL_REQLFB: // Request Linear Framebuffer
- return 0;
}
return 0;
}