* Video Driver
*/
#define VERSION ((0<<8)|10)
+#define DEBUG 0
#include <acess.h>
#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, Uint Flags);
+size_t Video_Write(tVFS_Node *Node, Uint64 Offset, size_t Length, const void *Buffer, Uint Flags);
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;
/**
* \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, Uint Flags)
{
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, Uint Flags)
{
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;
// Sanity Check
if( Offset > (Uint64)(heightInChars*widthInChars) ) {
+ Log_Notice("Video", "Offset (%i) > %i*%i (%i)", Offset,
+ heightInChars, widthInChars, heightInChars*widthInChars);
LEAVE('i', 0);
return 0;
}
Log_Notice("Video", "Clipping write size to %i characters", (int)Length);
}
+// Log_Debug("Video", "(%i,%i) %i chars", x, y, (int)Length);
+
// Print characters
for( i = 0; i < (int)Length; i++ )
{
- VT_Font_Render(
- chars->Ch,
- //dest + x*giVT_CharWidth, pitch,
- tmpBuf, giVT_CharWidth,
- VT_Colour12to24(chars->BGCol),
- VT_Colour12to24(chars->FGCol)
- );
- UI_BlitBitmap(
- x*giVT_CharWidth, y*giVT_CharHeight,
- giVT_CharWidth, giVT_CharHeight,
- tmpBuf
- );
+ if( chars->Ch )
+ {
+// Log_Debug("Video", "Render Char 0x%x in 0x%03x:%03x",
+// chars->Ch, chars->FGCol, chars->BGCol);
+ memset(tmpBuf, 0xFF, giVT_CharWidth*giVT_CharHeight*4);
+ VT_Font_Render(
+ chars->Ch,
+ tmpBuf, 32, giVT_CharWidth*4,
+ VT_Colour12to24(chars->BGCol),
+ VT_Colour12to24(chars->FGCol)
+ );
+ UI_BlitBitmap(
+ x*giVT_CharWidth, y*giVT_CharHeight,
+ giVT_CharWidth, giVT_CharHeight,
+ tmpBuf
+ );
+ }
+ else
+ {
+ UI_FillBitmap(
+ x*giVT_CharWidth, y*giVT_CharHeight,
+ giVT_CharWidth, giVT_CharHeight,
+ VT_Colour12to24(chars->BGCol)
+ );
+ }
chars ++;
x ++;
}
LOG("buffer = %p", Buffer);
- LOG("Updating Framebuffer (%p to %p)", destBuf, destBuf + (Uint)Length);
+ 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)
return Length;
}
-const char * const csaVIDEO_IOCTLS[] = {DRV_IOCTLNAMES, DRV_VIDEO_IOCTLNAMES, NULL};
+const char * csaVIDEO_IOCTLS[] = {DRV_IOCTLNAMES, DRV_VIDEO_IOCTLNAMES, NULL};
/**
* \brief Handle messages to the device
*/
// Video mode control
// - We cheat, and only have one mode
case VIDEO_IOCTL_GETSETMODE:
+ // - Abuse GETSETMODE to update size
+ Node->Size = giUI_Pitch * giUI_Height;
return 0;
case VIDEO_IOCTL_FINDMODE:
case VIDEO_IOCTL_MODEINFO:
#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;
}