X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=AcessNative%2Facesskernel_src%2Fvideo.c;h=b1b65b01e6fdc90ce99cdd98c78f0be5459ef2fa;hb=82be808714198ab884748f14f06abf458a3c5d59;hp=304a9cf41408c0a34482eb5e4830ee5ba7321a17;hpb=542d8ba58741acef4f373b8e4395e03136c5404c;p=tpg%2Facess2.git diff --git a/AcessNative/acesskernel_src/video.c b/AcessNative/acesskernel_src/video.c index 304a9cf4..b1b65b01 100644 --- a/AcessNative/acesskernel_src/video.c +++ b/AcessNative/acesskernel_src/video.c @@ -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, 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); @@ -23,13 +23,14 @@ 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; int giVideo_CurrentFormat; @@ -54,7 +55,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; } @@ -62,7 +63,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); @@ -76,7 +77,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; @@ -165,10 +166,12 @@ Uint64 Video_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *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( @@ -176,6 +179,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)