#include "../includes/tart.h" #include #include #include #include #include #include #include #include #define BUFFER_AT_POS(W) (W->windowSize.x * W->buffer.curser.y) + W->buffer.curser.x #define BUFFER_LINE_SIZE (w->windowSize.x) * TART_CELL_SIZE + sizeof(tart_cell) #define BUFFER_SIZE (w->windowSize.x * w->windowSize.y) #define BUFFER_BUFFER_SIZE BUFFER_LINE_SIZE * w->windowSize.y tart_vec2 GetTerminalSize(tart_window* w) { struct winsize win; ioctl(STDOUT_FILENO, TIOCGWINSZ, &win); return (tart_vec2){win.ws_col,win.ws_row}; }; int tart_create_buffer(tart_window* w) { w->buffer.buffer = (tart_cell**)malloc(w->windowSize.y * sizeof(tart_cell*)); if(w->buffer.buffer == NULL) { return TART_NG; } for(int i = 0; i < w->windowSize.y; i++) { int x = BUFFER_LINE_SIZE; w->buffer.buffer[i] = (tart_cell*)malloc(x); bzero(w->buffer.buffer[i], (BUFFER_LINE_SIZE)); } tart_cell ce; bzero(ce, TART_CELL_SIZE); snprintf(ce,TART_CELL_SIZE, #ifdef TART_UTF8 "\e[38;2;%03hhu;%03hhu;%03hhum%lc\e[0m", #else "\e[38;2;%03hhu;%03hhu;%03hhum%c\e[0m", #endif w->pallet[0].forground.r, w->pallet[0].forground.g, w->pallet[0].forground.b, #ifdef TART_UTF8 L' ' #else ' ' #endif ); for(int i = 0; i < w->windowSize.y; i++ ) { for(int j = 0; j < w->windowSize.x + 1; j++) { memcpy(w->buffer.buffer[i][j], ce, sizeof(tart_cell)); } //t_snprintf(w->buffer.buffer[i][w->windowSize.x], // TART_CELL_SIZE, // TC("\e[1B\e[%dC"), // w->windowSize.x); } w->buffer.curser = (tart_vec2){0,0}; //bzero(w->buffer.buffer[w->windowSize.y], (BUFFER_LINE_SIZE)); //t_snprintf(w->buffer.buffer[w->windowSize.y][w->windowSize.x], // TART_CELL_SIZE, // TC("\e[n") // ); return TART_OK; } void tart_free_buffer(tart_window* w) { free(w->buffer.buffer); } int tart_create_window(tart_window* w, tart_vec2 ws, const char* title) { w->windowSize.x = GetTerminalSize(w).x - 1; w->windowSize.y = GetTerminalSize(w).y; w->terminalSize = GetTerminalSize(w); w->homePosition = (tart_vec2){ (w->terminalSize.x / 2) - (w->windowSize.x / 2), (w->terminalSize.x / 2) - (w->windowSize.x / 2) }; tart_create_buffer(w); return TART_OK; } int flush_buffer(tart_window* w) { tart_cell ce; bzero(ce, TART_CELL_SIZE); snprintf(ce,TART_CELL_SIZE, #ifdef TART_UTF8 "\e[48;2;%03hhu;%03hhu;%03hhum\e[38;2;%03hhu;%03hhu;%03hhum%lc\e[0m", #else "\e[38;2;%03hhu;%03hhu;%03hhum%c\e[0m", #endif w->pallet[0].background.r, w->pallet[0].background.g, w->pallet[0].background.b, w->pallet[0].forground.r, w->pallet[0].forground.g, w->pallet[0].forground.b, #ifdef TART_UTF8 L' ' #else ' ' #endif ); for(int i = 0; i < w->windowSize.y; i++) { for(int j = 0; j < w->windowSize.x ; j++) { bzero(w->buffer.buffer[i][j], sizeof(tart_cell)); memcpy(w->buffer.buffer[i][j], ce, sizeof(tart_cell)); } } return 0; } void flush_palets(tart_window* w) { for(int i = 0; i < TART_PALET_SIZE; i++) { w->pallet[i].background.r = 0; w->pallet[i].background.g = 0; w->pallet[i].background.b = 0; w->pallet[i].forground.r = 254; w->pallet[i].forground.g = 254; w->pallet[i].forground.b = 254; } } int tart_init(tart_window* w) { int y = 0; int x = 0; w->buffer.jump = (tart_vec2){0,0}; flush_buffer(w); flush_palets(w); //t_snprintf(ce,TART_CELL_SIZE, TC("\e[%d;%dh"), // (w->terminalSize.x/2)-(w->windowSize.x/2), // (w->terminalSize.y/2)-(w->windowSize.y/2)); //write(STDOUT_FILENO, ce, TART_CELL_SIZE); write(STDOUT_FILENO, "\e[?1049h", 8); write(STDOUT_FILENO, "\e[H", 3); write(STDOUT_FILENO, "\e[s", 3); return TART_OK; } void tart_disable_cusor() { write(STDOUT_FILENO, "\e[?25l", 8); } void tart_enable_cusor() { write(STDOUT_FILENO, "\e[?25h", 8); } int tart_close(tart_window* w) { write(STDOUT_FILENO, "\e[?1049l", 8); //for(int i = 0; i < w->windowSize.y; i++) { // free(w->buffer.buffer[i]); //} //free(w->buffer.buffer); return TART_OK; } int tart_draw(tart_window* w) { for(int i = 0; i < w->windowSize.y; i++) { for(int j = 0; j < w->windowSize.x + 1; j++) { write(STDOUT_FILENO, w->buffer.buffer[i][j], TART_CELL_SIZE ); } } flush_buffer(w); write(STDOUT_FILENO, "\e[u", strlen("\e[u")); return TART_OK; } int tart_jump(tart_window* w, tart_vec2 pos) { w->buffer.jump = pos; w->buffer.curser = pos; return TART_OK; } int tart_move_cursor(tart_window* w, tart_vec2 pos) { if(pos.x >= w->windowSize.x) { for(int i = pos.x; i >= w->windowSize.x; i /= w->windowSize.x) { w->buffer.curser.x = i; w->buffer.curser.y++; } } else { w->buffer.curser.x = pos.x; } if(pos.y >= w->windowSize.y - 1) { for(int i = pos.y; i >= w->windowSize.y - 1; i /= w->windowSize.y) { w->buffer.curser.y = i; } }else { w->buffer.curser.y = pos.y; } return TART_OK; } int tart_insert_cell(tart_window* w, tart_byte p, t_char c) { if(c == TC('\n')) { tart_move_cursor(w, (tart_vec2){w->buffer.jump.x, w->buffer.curser.y + 1}); return TART_OK; } bzero(w->buffer.buffer[w->buffer.curser.y][w->buffer.curser.x], TART_CELL_SIZE); tart_cell ce; bzero(ce, TART_CELL_SIZE); snprintf(ce,TART_CELL_SIZE, #ifdef TART_UTF8 "\e[48;2;%03hhu;%03hhu;%03hhum\e[38;2;%03hhu;%03hhu;%03hhum%lc\e[0m", #else "\e[48;2;%03hhu;%03hhu;%03hhum\e[38;2;%03hhu;%03hhu;%03hhum%c\e[0m", #endif w->pallet[p].background.r, w->pallet[p].background.g, w->pallet[p].background.b, w->pallet[p].forground.r, w->pallet[p].forground.g, w->pallet[p].forground.b, c ); memcpy(w->buffer.buffer[w->buffer.curser.y][w->buffer.curser.x], ce, TART_CELL_SIZE); tart_move_cursor(w, (tart_vec2){w->buffer.curser.x + 1, w->buffer.curser.y}); return TART_OK; } int tart_printf(tart_window* w,tart_byte p, const t_char* c, ...) { va_list args; va_start(args, c); t_char tmp[1024]; t_vsnprintf(tmp,1024, c, args); for(int i = 0; i < t_strlen(tmp); i++) { tart_insert_cell(w, p, tmp[i]); } va_end(args); return TART_OK; } int tart_box(tart_window* w, tart_byte bp, tart_byte fp, const t_char* c, tart_vec2 fpos, tart_vec2 spos) { return TART_OK; } int tart_line(tart_window* w, tart_byte p, const t_char* c, tart_vec2 fpos, tart_vec2 spos) { return TART_OK; }