AcessNative - Fix incorrect VT name, clean up a warning
[tpg/acess2.git] / AcessNative / acesskernel_src / video.c
index 4645b95..d78f6da 100644 (file)
@@ -4,17 +4,18 @@
  * 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);
@@ -22,12 +23,15 @@ void        Video_2D_Blit(void *Ent, Uint16 DstX, Uint16 DstY, Uint16 SrcX, Uint16 SrcY
 
 // === 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;
@@ -53,7 +57,7 @@ int Video_Install(char **Arguments)
 /**
  * \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;
 }
@@ -61,7 +65,7 @@ Uint64 Video_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
 /**
  * \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);
@@ -75,7 +79,7 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *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;
@@ -90,6 +94,8 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                
                // 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;
                }
@@ -106,21 +112,36 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                        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 ++;
@@ -146,12 +167,13 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                }
                
                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(
@@ -159,6 +181,15 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
                                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)
@@ -211,7 +242,7 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
        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
  */
@@ -226,6 +257,8 @@ int Video_IOCtl(tVFS_Node *Node, int ID, void *Data)
        // 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:
@@ -247,16 +280,14 @@ int Video_IOCtl(tVFS_Node *Node, int ID, void *Data)
        #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) {
@@ -279,9 +310,6 @@ int Video_IOCtl(tVFS_Node *Node, int ID, void *Data)
                //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;
 }

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