AcessNative - Fix incorrect VT name, clean up a warning
[tpg/acess2.git] / AcessNative / acesskernel_src / video.c
index 5408b56..d78f6da 100644 (file)
@@ -14,8 +14,8 @@
 
 // === 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, 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);
@@ -30,7 +30,9 @@ tVFS_NodeType gVideo_NodeType = {
 };
 tDevFS_Driver  gVideo_DriverStruct = {
        NULL, "NativeVideo",
-       {.Type = &gVideo_NodeType}
+       {
+               .Type = &gVideo_NodeType
+       }
 };
  int   giVideo_DriverID;
  int   giVideo_CurrentFormat;
@@ -55,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;
 }
@@ -63,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, const 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);
@@ -166,10 +168,12 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Bu
                
                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(
@@ -177,6 +181,15 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, const void *Bu
                                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)
@@ -244,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:

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