3 * - By John Hodge (thePowersGang)
13 #include <acess/sys.h>
14 #include <acess/devices/pty.h>
15 #include <acess/devices/pty_cmds.h>
16 #include "resources/cursor.h"
21 CVideo::CVideo(const CConfigVideo& config):
25 m_bufferFormat(PTYBUFFMT_TEXT)
29 if( _SysIOCtl(m_fd, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL )
30 throw AxWin::InitFailure("stdin isn't a terminal");
32 if( _SysIOCtl(m_fd, PTY_IOCTL_GETDIMS, &dims) == -1 )
33 throw AxWin::InitFailure("Failed to get dimensions from stdin");
36 if( m_width == 0 || m_height == 0 )
37 throw AxWin::InitFailure("Terminal not capable of graphics");
42 SetCursorPos( m_width/2, m_height/2 );
44 SetBufFormat(PTYBUFFMT_FB);
47 void CVideo::GetDims(unsigned int& w, unsigned int& h)
53 void CVideo::BlitLine(const uint32_t* src, unsigned int dst_y, unsigned int dst_x, unsigned int width)
55 //_SysWriteAt(m_fd, (dst_y * m_width + dst_x) * 4, width * 4, src);
56 SetBufFormat(PTYBUFFMT_FB);
57 _SysSeek(m_fd, (dst_y * m_width + dst_x) * 4, SEEK_SET);
58 _SysWrite(m_fd, src, width * 4);
63 // TODO: Write to a local copy of the framebuffer in BlitLine, and then flush out in this function
66 void CVideo::SetBufFormat(unsigned int FormatID)
68 if( m_bufferFormat != FormatID )
71 struct ptymode mode = {.OutputMode = FormatID, .InputMode = 0};
72 int rv = _SysIOCtl( m_fd, PTY_IOCTL_SETMODE, &mode );
74 throw ::AxWin::InitFailure("Can't set PTY to framebuffer mode");
77 m_bufferFormat = FormatID;
81 void CVideo::SetCursorBitmap()
83 // Set cursor position and bitmap
84 struct ptycmd_header hdr = {PTY2D_CMD_SETCURSORBMP,0,0};
85 size_t size = sizeof(hdr) + sizeof(cCursorBitmap) + cCursorBitmap.W*cCursorBitmap.H*4;
86 hdr.len_low = size / 4;
87 hdr.len_hi = size / (256*4);
89 SetBufFormat(PTYBUFFMT_2DCMD);
90 _SysWrite(m_fd, &hdr, sizeof(hdr));
91 _SysDebug("size = %i (%04x:%02x * 4)", size, hdr.len_hi, hdr.len_low);
92 _SysWrite(m_fd, &cCursorBitmap, size-sizeof(hdr));
95 void CVideo::SetCursorPos(int X, int Y)
97 struct ptycmd_setcursorpos cmd;
98 cmd.hdr.cmd = PTY2D_CMD_SETCURSORPOS;
99 cmd.hdr.len_low = sizeof(cmd)/4;
104 SetBufFormat(PTYBUFFMT_2DCMD);
105 _SysWrite(m_fd, &cmd, sizeof(cmd));
108 }; // namespace AxWin