256 lines
7.1 KiB
C
256 lines
7.1 KiB
C
#include "../includes/tart.h"
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <strings.h>
|
|
#include <sys/ioctl.h>
|
|
#include <unistd.h>
|
|
#include <wchar.h>
|
|
|
|
|
|
#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;
|
|
}
|