3 * - By John Hodge (thePowersGang)
6 * - Abstract display manipulation methods
8 #include "include/display.h"
9 #include <acess/sys.h> // _SysDebug
10 #include <stdlib.h> // exit
14 #include <axwin3/axwin.h>
15 #include <axwin3/richtext.h>
17 #define UNIMPLIMENTED() do{_SysDebug("UNIMPLIMENTED %s", __func__); exit(-1);}while(0)
20 extern tHWND gMainWindow;
25 int giDisplayTotalLines;
28 int giCurrentLinePos; // byte offset, not column
30 int giFirstDispLine; // First displayed line
31 int giFirstLine; // Ring buffer start
32 char **gasDisplayLines;
33 int *gaiDisplayLineSizes;
34 char *gabDisplayLinesDirty;
37 void Display_Init(int Cols, int Lines, int ExtraScrollbackLines)
40 giDisplayLines = Lines;
41 giDisplayTotalLines = Lines + ExtraScrollbackLines;
42 gasDisplayLines = calloc( sizeof(char*), (Lines + ExtraScrollbackLines) );
43 gaiDisplayLineSizes = calloc( sizeof(int), (Lines + ExtraScrollbackLines) );
44 gabDisplayLinesDirty = calloc( sizeof(char), (Lines + ExtraScrollbackLines) );
47 void Display_int_PushString(int Length, const char *Text)
49 _SysDebug("Line %i += %i '%*C'", giCurrentLine, Length, Length, Text);
50 if( !gasDisplayLines[giCurrentLine] || giCurrentLinePos + Length >= gaiDisplayLineSizes[giCurrentLine] )
52 int reqsize = giCurrentLinePos + Length;
53 gaiDisplayLineSizes[giCurrentLine] = (reqsize + 32-1) & ~(32-1);
54 void *tmp = realloc(gasDisplayLines[giCurrentLine], gaiDisplayLineSizes[giCurrentLine]);
55 if( !tmp ) perror("Display_AddText - realloc");
56 gasDisplayLines[giCurrentLine] = tmp;
59 memcpy(gasDisplayLines[giCurrentLine]+giCurrentLinePos, Text, Length);
60 gabDisplayLinesDirty[giCurrentLine] = 1;
61 gasDisplayLines[giCurrentLine][giCurrentLinePos+Length] = 0;
65 void Display_AddText(int Length, const char *UTF8Text)
67 _SysDebug("%i '%.*s'", Length, Length, UTF8Text);
68 // Copy as many characters (not bytes, have to trim off the last char) as we can to the current line
69 // - then roll over to the next line
72 int space = giDisplayCols - giCurrentCol;
74 while( space && bytes < Length )
77 bytes += ReadUTF8(UTF8Text+bytes, &cp);
78 if( Unicode_IsPrinting(cp) )
82 Display_int_PushString(bytes, UTF8Text);
85 _SysDebug("Length(%i) -= bytes(%i)", Length, bytes);
97 void Display_Newline(int bCarriageReturn)
103 if( giCurrentLine == giDisplayLines )
105 if( giCurrentLine == giFirstLine )
108 if(giFirstLine == giDisplayLines)
112 if( bCarriageReturn ) {
113 giCurrentLinePos = 0;
117 giCurrentLinePos = 0;
118 int i = giCurrentCol;
119 if( !gasDisplayLines[giCurrentLine] )
123 Display_AddText(1, " ");
130 giCurrentLinePos += ReadUTF8(gasDisplayLines[giCurrentLine]+giCurrentLinePos, &cp);
131 if( !Unicode_IsPrinting(cp) )
138 void Display_SetCursor(int Row, int Col)
143 void Display_MoveCursor(int RelRow, int RelCol)
148 void Display_ClearLine(int Dir) // 0: All, 1: Forward, -1: Reverse
152 // Completely clear line
153 if( gasDisplayLines[giCurrentLine] )
154 free(gasDisplayLines[giCurrentLine]);
155 gasDisplayLines[giCurrentLine] = NULL;
156 gabDisplayLinesDirty[giCurrentLine] = 1;
160 // Forward clear (truncate)
164 // Reverse clear (replace with spaces)
172 void Display_ClearLines(int Dir) // 0: All, 1: Forward, -1: Reverse
176 // Push giDisplayLines worth of empty lines
177 // Move cursor back up by giDisplayLines
181 // Push (giDisplayLines - (giCurrentLine-giFirstDispLine)) and reverse
185 // Reverse clear (replace with spaces)
193 void Display_SetForeground(uint32_t RGB)
198 void Display_SetBackground(uint32_t RGB)
203 void Display_Flush(void)
206 for( i = 0; i < giDisplayCols; i ++ )
208 int line = (giFirstLine + i) % giDisplayTotalLines;
209 if( !gabDisplayLinesDirty[line] )
211 _SysDebug("Line %i+%i '%s'", giFirstLine, i, gasDisplayLines[line]);
212 AxWin3_RichText_SendLine(gMainWindow, giFirstLine + i, gasDisplayLines[line] );
213 gabDisplayLinesDirty[line] = 0;
217 AxWin3_FocusWindow(gMainWindow);
220 void Display_ShowAltBuffer(int AltBufEnabled)