ANSI text coloring

This commit is contained in:
Arnau Camprubí 2022-06-17 14:30:41 +02:00
pare b941e48f4b
commit 7f48dc6a17
S'han modificat 3 arxius amb 36 adicions i 5 eliminacions

Veure arxiu

@ -1,7 +1,7 @@
#include "vga.h"
#include "../arch/i686/io.h"
static uint8_t current_color = VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE;
static uint8_t current_color = VGA_COLOR_DEFAULT;
void set_char(int x, int y, char c){
VGA_MEMORY[(x+y*VGA_WIDTH)*2] = c;
@ -77,9 +77,38 @@ void print_string_at(char *str, int x, int y){
}
while(*str){
offset = print_char(*(str++), x, y);
x = get_offset_x(offset);
y = get_offset_y(offset);
if(*str == '\x1b'){
str++;
if(*str != '[') continue;
str++;
int ansi_col = 0;
while(*str >= '0' && *str <= '9'){
ansi_col *= 10;
ansi_col += *str - '0';
str++;
}
if(*str != 'm') continue;
str++;
if(ansi_col == 0) current_color = VGA_COLOR_DEFAULT;
else if(ansi_col >= 30 && ansi_col <= 37){
switch (ansi_col)
{
case 30: current_color = (current_color & 0xf0) | VGA_COLOR_FG_BLACK; break;
case 31: current_color = (current_color & 0xf0) | VGA_COLOR_FG_RED; break;
case 32: current_color = (current_color & 0xf0) | VGA_COLOR_FG_GREEN; break;
case 33: current_color = (current_color & 0xf0) | VGA_COLOR_FG_ORANGE; break;
case 34: current_color = (current_color & 0xf0) | VGA_COLOR_FG_BLUE; break;
case 35: current_color = (current_color & 0xf0) | VGA_COLOR_FG_PINK; break;
case 36: current_color = (current_color & 0xf0) | VGA_COLOR_FG_CYAN; break;
case 37: current_color = (current_color & 0xf0) | VGA_COLOR_FG_WHITE; break;
}
}
}
else{
offset = print_char(*(str++), x, y);
x = get_offset_x(offset);
y = get_offset_y(offset);
}
}
}

Veure arxiu

@ -4,6 +4,8 @@
#define VGA_MEMORY ((char *)0xB8000)
#define VGA_COLOR_DEFAULT (VGA_COLOR_BG_BLACK | VGA_COLOR_FG_WHITE)
#define VGA_COLOR_FG_BLACK 0x00
#define VGA_COLOR_FG_BLUE 0x01
#define VGA_COLOR_FG_GREEN 0x02

Veure arxiu

@ -2,6 +2,6 @@
#include "drivers/vga.h"
void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){
print_string("Hello world!\n:D");
print_string("Hello world!\n\x1b[32m:D\x1b[0m\n");
for(;;); // Halt here
}