Files
Tart/source/tart.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;
}