8d5f5dd287d73b80c37fddb249225c00d056227d
[tpg/acess2.git] / Usermode / Applications / axwin4_src / Server / video.cpp
1 /*
2  * Acess2 GUI v4
3  * - By John Hodge (thePowersGang)
4  *
5  * video.cpp
6  * - Graphics output
7  */
8 #include <cstddef>
9 #include <video.hpp>
10 #include <common.hpp>
11
12 extern "C" {
13 #include <acess/sys.h>
14 #include <acess/devices/pty.h>
15 #include <acess/devices/pty_cmds.h>
16 #include "resources/cursor.h"
17 }
18
19 namespace AxWin {
20
21 CVideo::CVideo(const CConfigVideo& config):
22         m_fd(1),
23         m_width(0),
24         m_height(0),
25         m_bufferFormat(PTYBUFFMT_TEXT)
26 {
27         // Obtain dimensions
28         {
29                 if( _SysIOCtl(m_fd, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL )
30                         throw AxWin::InitFailure("stdin isn't a terminal");
31                 struct ptydims  dims;
32                 if( _SysIOCtl(m_fd, PTY_IOCTL_GETDIMS, &dims) == -1 )
33                         throw AxWin::InitFailure("Failed to get dimensions from stdin");
34                 m_width = dims.PW;
35                 m_height = dims.PH;
36                 if( m_width == 0 || m_height == 0 )
37                         throw AxWin::InitFailure("Terminal not capable of graphics");
38         }
39         
40         _SysDebug("m_width=%i, m_height=%i", m_width, m_height);
41         SetCursorBitmap();
42         
43         SetCursorPos( m_width/2, m_height/2 );
44         
45         SetBufFormat(PTYBUFFMT_FB);
46         uint32_t        data[m_width];
47         for( unsigned int i = 0; i < m_height; i ++ )
48                 BlitLine(data, i, 0, m_width);
49 }
50
51 void CVideo::GetDims(unsigned int& w, unsigned int& h)
52 {
53         w = m_width;
54         h = m_height;
55 }
56
57 void CVideo::BlitLine(const uint32_t* src, unsigned int dst_y, unsigned int dst_x, unsigned int width)
58 {
59         //_SysDebug("CVideo::BlitLine (%p, %i, %i, %i)", src, dst_y, dst_x, width);
60         size_t  cmdlen = sizeof(struct ptycmd_senddata)/4 + width;
61         //_SysDebug(" - Offset = %i, cmdlen = %i", (dst_y * m_width + dst_x) * 4, cmdlen);
62         struct ptycmd_senddata  cmd = {
63                 {PTY2D_CMD_SEND, uint8_t(cmdlen & 0xFF), uint16_t(cmdlen>>8)},
64                 (dst_y * m_width + dst_x)
65         };
66         SetBufFormat(PTYBUFFMT_2DCMD);
67         _SysWrite(m_fd, &cmd, sizeof(cmd));
68         _SysWrite(m_fd, src, width*4);
69
70         //SetBufFormat(PTYBUFFMT_FB);
71         //_SysWriteAt(m_fd, (dst_y * m_width + dst_x) * 4, width * 4, src);
72         //_SysSeek(m_fd, (dst_y * m_width + dst_x) * 4, SEEK_SET);
73         //_SysWrite(m_fd, src, width * 4);
74 }
75
76 void CVideo::Flush()
77 {
78         // TODO: Write to a local copy of the framebuffer in BlitLine, and then flush out in this function
79 }
80
81 void CVideo::SetBufFormat(unsigned int FormatID)
82 {
83         if( m_bufferFormat != FormatID )
84         {
85                 
86                 struct ptymode mode = {.OutputMode = FormatID, .InputMode = 0};
87                 int rv = _SysIOCtl( m_fd, PTY_IOCTL_SETMODE, &mode );
88                 if( rv ) {
89                         throw ::AxWin::InitFailure("Can't set PTY to framebuffer mode");
90                 }
91                 
92                 m_bufferFormat = FormatID;
93         }
94 }
95
96 void CVideo::SetCursorBitmap()
97 {
98         // Set cursor position and bitmap
99         struct ptycmd_header    hdr = {PTY2D_CMD_SETCURSORBMP,0,0};
100         size_t size = sizeof(hdr) + sizeof(cCursorBitmap) + cCursorBitmap.W*cCursorBitmap.H*4;
101         hdr.len_low = size / 4;
102         hdr.len_hi = size / (256*4);
103         
104         SetBufFormat(PTYBUFFMT_2DCMD);
105         _SysWrite(m_fd, &hdr, sizeof(hdr));
106         _SysDebug("SetCursorBitmap - size = %i (%04x:%02x * 4)", size, hdr.len_hi, hdr.len_low);
107         _SysWrite(m_fd, &cCursorBitmap, size-sizeof(hdr));
108 }
109
110 void CVideo::SetCursorPos(int X, int Y)
111 {
112         struct ptycmd_setcursorpos      cmd;
113         cmd.hdr.cmd = PTY2D_CMD_SETCURSORPOS;
114         cmd.hdr.len_low = sizeof(cmd)/4;
115         cmd.hdr.len_hi = 0;
116         cmd.x = X;
117         cmd.y = Y;
118
119         SetBufFormat(PTYBUFFMT_2DCMD);  
120         _SysWrite(m_fd, &cmd, sizeof(cmd));
121 }
122
123 };      // namespace AxWin
124

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