X-Git-Url: https://git.ucc.asn.au/?p=tpg%2Facess2.git;a=blobdiff_plain;f=Usermode%2FLibraries%2Flibaxwin4.so_src%2Fwindow_drawing.cpp;h=8f355a6e563d58489ec16603b04907afa3644e07;hp=df320ef7f9dc17b948ea97bf1f7265e650eb394e;hb=9a9053e91df6e08761e2ce72be350c5c2233153b;hpb=9b09b24a5cc3dfb0cee51e0d1876c9253894666a diff --git a/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp b/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp index df320ef7..8f355a6e 100644 --- a/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp +++ b/Usermode/Libraries/libaxwin4.so_src/window_drawing.cpp @@ -8,42 +8,71 @@ #include #include "include/common.hpp" #include +#include // min namespace AxWin { +void _push_data(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, const void *Data) +{ + CSerialiser message; + //_SysDebug("_push_data - (%i,%i), %ix%i %p", X, Y, W, H, Data); + message.WriteU8(IPCMSG_PUSHDATA); + message.WriteU16(Window->m_id); + message.WriteU16(X); + message.WriteU16(Y); + message.WriteU16(W); + message.WriteU16(H); + message.WriteBuffer(H*W*4, Data); + ::AxWin::SendMessage(message); +} + extern "C" void AxWin4_DrawBitmap(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, void *Data) { // TODO: Split message up into blocks such that it can be dispatched if( W > 128 ) { const uint32_t* data32 = static_cast(Data); - for( unsigned int row = 0; row < H; row ++ ) + const unsigned int rows_per_message = 1; // 2048 / W; + for( unsigned int row = 0; row < H; row += rows_per_message ) { - CSerialiser message; - message.WriteU8(IPCMSG_PUSHDATA); - message.WriteU16(Window->m_id); - message.WriteU16(X); - message.WriteU16(Y+row); - message.WriteU16(W); - message.WriteU16(1); - message.WriteBuffer(W*4, data32); - ::AxWin::SendMessage(message); - data32 += W; + _push_data(Window, X, Y+row, W, ::std::min(rows_per_message,H-row), data32); + data32 += W*rows_per_message; } } else { - CSerialiser message; - message.WriteU8(IPCMSG_PUSHDATA); - message.WriteU16(Window->m_id); - message.WriteU16(X); - message.WriteU16(Y); - message.WriteU16(W); - message.WriteU16(H); - message.WriteBuffer(W*H*4, Data); - ::AxWin::SendMessage(message); + _push_data(Window, X, Y, W, H, Data); } } +extern "C" void AxWin4_DrawControl(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, uint16_t ID, unsigned int Frame) +{ + CSerialiser message; + //_SysDebug("AxWin4_DrawControl: (Window->ID=%i, (%i,%i) %ix%i %i 0x%06x", Window->m_id, X, Y, W, H, ID, Frame); + message.WriteU8(IPCMSG_DRAWCTL); + message.WriteU16(Window->m_id); + message.WriteU16(X); + message.WriteU16(Y); + message.WriteU16(W); + message.WriteU16(H); + message.WriteU16(ID); + message.WriteU16(Frame); + ::AxWin::SendMessage(message); +} + +extern "C" void AxWin4_DrawText(tAxWin4_Window *Window, int X, int Y, unsigned int W, unsigned int H, uint16_t FontID, const char *String) +{ + CSerialiser message; + message.WriteU8(IPCMSG_DRAWTEXT); + message.WriteU16(Window->m_id); + message.WriteU16(X); + message.WriteU16(Y); + message.WriteU16(W); + message.WriteU16(H); + message.WriteU16(FontID); + message.WriteString(String); + ::AxWin::SendMessage(message); +} + }; // namespace AxWin