From bab30691529a0330d4fc7c64516c3d5f7f4f4ce3 Mon Sep 17 00:00:00 2001 From: 0x35c Date: Thu, 19 Dec 2024 19:04:43 +0100 Subject: [PATCH] feature: line spacing + characters are aligned --- headers/font.h | 1 + headers/fonts/consolas_regular_13.h | 128 ++++++++++++++++++++++++++++ headers/terminal.h | 9 +- src/terminal/put.c | 19 +++-- tools/font_converter.py | 24 ++++-- 5 files changed, 159 insertions(+), 22 deletions(-) diff --git a/headers/font.h b/headers/font.h index b214f0f..4c102f5 100644 --- a/headers/font.h +++ b/headers/font.h @@ -5,5 +5,6 @@ struct font { uint32_t height; uint32_t width; + uint32_t yoffset; char *bitmap; }; diff --git a/headers/fonts/consolas_regular_13.h b/headers/fonts/consolas_regular_13.h index 7ec359b..ebae428 100644 --- a/headers/fonts/consolas_regular_13.h +++ b/headers/fonts/consolas_regular_13.h @@ -8,641 +8,769 @@ struct font consolas_regular_13_font[] = {\ { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, { .width = 1, .height = 1, + .yoffset = 12, .bitmap = " ", }, { .width = 3, .height = 13, + .yoffset = 0, .bitmap = "## ## ## ## ## ## ## ## ## ## #########", }, { .width = 6, .height = 5, + .yoffset = 0, .bitmap = "##############################", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = " ## ## ## ## ## ## #################### ## ## ## ## #################### ## ## ## ## ## ## ", }, { .width = 8, .height = 15, + .yoffset = 0, .bitmap = " ### ## ##### ###### ## ## ## ## ##### ###### ##### ### ## ### ######### ###### ## ## ", }, { .width = 11, .height = 13, + .yoffset = 0, .bitmap = " ### ## ##### ### ## ## ## ## ## ## ######## ### ## ## ###### ####### ## ## ## ### ## ## ## ##### ## ### ", }, { .width = 11, .height = 13, + .yoffset = 0, .bitmap = " #### ###### ## ## ## ## ###### #### #### ## ###### ## ## ##### ## #### ## #### ######## #### ### ", }, { .width = 3, .height = 5, + .yoffset = 0, .bitmap = "###############", }, { .width = 5, .height = 16, + .yoffset = 0, .bitmap = " # ### ## ## ## ## ## ## ## ## ## ## ## ## ### # ", }, { .width = 5, .height = 16, + .yoffset = 0, .bitmap = " # ### ## ## ## ## ## ## ## ## ## ## ## ## ### # ", }, { .width = 8, .height = 8, + .yoffset = 0, .bitmap = " ## # ## # ######## ###### ###### ######## # ## # ## ", }, { .width = 8, .height = 8, + .yoffset = 4, .bitmap = " ## ## ## ################ ## ## ## ", }, { .width = 5, .height = 6, + .yoffset = 10, .bitmap = " ### #### ### ####### ### ", }, { .width = 6, .height = 2, + .yoffset = 7, .bitmap = "############", }, { .width = 4, .height = 3, + .yoffset = 10, .bitmap = " ## ########", }, { .width = 9, .height = 15, + .yoffset = 0, .bitmap = " ## ## ### ## ### ## ### ## ## ### ## ### ## ### ## ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### ## ## ## ##### ###### ########## ###### ##### ## ## ## ###### #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " ## #### ##### ## ## ## ## ## ## ## ## ################", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### # ## ## ## ### ## ### ### ### ################", }, { .width = 7, .height = 12, + .yoffset = 1, .bitmap = "##### ####### ## ## ## ##### ##### ## ## ######## ##### ", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = " ### ### #### ##### ## ## ### ## ### ## ## ## #################### ## ## ", }, { .width = 7, .height = 12, + .yoffset = 1, .bitmap = "###### ###### ## ## ##### ###### ## ## ## ######### ##### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ##### ## ## ###### ####### ## #### #### ##### ### ###### #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "################ ### ## ### ## ### ## ### ### ### ### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ######### #### ##### ### ###### ###### ### ##### #### ######### #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### ### ##### #### #### ## ####### ###### ## ## ##### #### ", }, { .width = 3, .height = 9, + .yoffset = 4, .bitmap = "######### #########", }, { .width = 5, .height = 12, + .yoffset = 4, .bitmap = " ### ### ### ### #### ### ####### ### ", }, { .width = 7, .height = 10, + .yoffset = 3, .bitmap = " # ### ### #### #### #### #### ### ### # ", }, { .width = 8, .height = 5, + .yoffset = 6, .bitmap = "################ ################", }, { .width = 7, .height = 10, + .yoffset = 3, .bitmap = " # ### ### #### #### #### #### ### ### # ", }, { .width = 6, .height = 13, + .yoffset = 0, .bitmap = "### ##### ### ## ## ##### #### ## ## ## ### ### ### ", }, { .width = 10, .height = 16, + .yoffset = 0, .bitmap = " #### ####### ## ## ## ## ## ##################### ######## ######## ######## ############## ## ###### ## ## ## ####### ##### ", }, { .width = 12, .height = 12, + .yoffset = 1, .bitmap = " ### #### #### ###### ## ## ## ## ### ### ######## ######## ### ### ## ## ### ###", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "###### ########## #### #### ########## ####### ## #### #### ######### ###### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### ## ### ## ## ## ## ## ## # ####### #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "##### ####### ## ## ## #### #### #### #### #### ##### ## ####### ##### ", }, { .width = 7, .height = 12, + .yoffset = 1, .bitmap = "################ ## ## ################ ## ## ##############", }, { .width = 7, .height = 12, + .yoffset = 1, .bitmap = "################ ## ## ################ ## ## ## ## ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### ## #### ## ## ###### ###### #### ## ## ## ####### #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "## #### #### #### #### #################### #### #### #### #### ##", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "################ ## ## ## ## ## ## ## ## ################", }, { .width = 6, .height = 12, + .yoffset = 1, .bitmap = "############ ## ## ## ## ## ## ### ####### ### ", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = "## ### ## ### ## ### ## ### ##### #### #### ##### ## ### ## ### ## ### ## ### ", }, { .width = 7, .height = 12, + .yoffset = 1, .bitmap = "## ## ## ## ## ## ## ## ## ## ##############", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = "### ####### ######## ######## ############################## ###### ## ###### ###### ###### ###### ###", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "### ##### ###### ###### ###### #### ## #### ## #### ###### ###### ###### ##### ###", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = " #### ######## ## ## ### #### #### #### #### #### ### ## ## ######## #### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "###### ####### ## ##### #### #### ########## ###### ## ## ## ## ", }, { .width = 9, .height = 15, + .yoffset = 1, .bitmap = " #### ####### ## ## ## #### #### #### #### #### ## ## ## ####### ##### ## # ##### ### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "##### ####### ## ## ## ## ## ## ###### ##### ## ### ## ### ## ### ## ##### ###", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = " #### ###### ## # ## ### ##### ##### ### #### ######### ##### ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "################ ## ## ## ## ## ## ## ## ## ## ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "## #### #### #### #### #### #### #### #### #### ### ###### #### ", }, { .width = 12, .height = 12, + .yoffset = 1, .bitmap = "### ### ### ## ### ### ## ## ### ### ### ### ## ## ###### ###### #### #### ### ", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = " ## # ## ## ## ## ## ## ## ## ## ## ## ## ######## ######## ######## ######## ### ### ### ### ", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = "### ### ## ## ### ### ###### #### #### #### #### ###### ### ### ### ### ### ###", }, { .width = 10, .height = 12, + .yoffset = 1, .bitmap = "## ##### ### ## ## ## ## ###### #### #### ## ## ## ## ## ", }, { .width = 8, .height = 12, + .yoffset = 1, .bitmap = "################ ## ### ## ### ### ### ### ## ################", }, { .width = 5, .height = 16, + .yoffset = 0, .bitmap = "############ ## ## ## ## ## ## ## ## ## ## ## ##########", }, { .width = 9, .height = 15, + .yoffset = 0, .bitmap = "## ### ## ### ## ### ## ## ### ## ### ## ### ## ## ", }, { .width = 5, .height = 16, + .yoffset = 0, .bitmap = "########## ## ## ## ## ## ## ## ## ## ## ## ############", }, { .width = 10, .height = 6, + .yoffset = 1, .bitmap = " ## #### ###### ## ## ## ## ### ###", }, { .width = 10, .height = 2, + .yoffset = 14, .bitmap = "####################", }, { .width = 7, .height = 5, + .yoffset = 0, .bitmap = " ### ### ## ", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = " #### ###### # ## ############## #### ########## ######", }, { .width = 8, .height = 13, + .yoffset = 0, .bitmap = "## ## ## ## ###### ####### ### #### #### #### #### ########## ##### ", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = " #### ######### ### ## ## ### # ###### #### ", }, { .width = 8, .height = 13, + .yoffset = 0, .bitmap = " ## ## ## ## ###### ########## #### #### #### #### ### ####### ### ##", }, { .width = 8, .height = 9, + .yoffset = 4, .bitmap = " #### ###### ### #################### ### ####### ######", }, { .width = 9, .height = 13, + .yoffset = 0, .bitmap = " #### ##### ## ## ## ####### ####### ## ## ## ## ## ## ", }, { .width = 8, .height = 12, + .yoffset = 4, .bitmap = " ################ ## ## ## ####### ###### ## ####### ########## ########## ##### ", }, { .width = 7, .height = 13, + .yoffset = 0, .bitmap = "## ## ## ## ###### ########## #### #### #### #### #### #### ##", }, { .width = 8, .height = 13, + .yoffset = 0, .bitmap = " ### ### ### ##### ##### ## ## ## ## ## ################", }, { .width = 7, .height = 16, + .yoffset = 0, .bitmap = " ### ### ### ############## ## ## ## ## ## ## ### ######## #### ", }, { .width = 9, .height = 13, + .yoffset = 0, .bitmap = "## ## ## ## ## ### ## ### ##### #### #### ##### ## ### ## ### ## ### ", }, { .width = 8, .height = 13, + .yoffset = 0, .bitmap = "##### ##### ## ## ## ## ## ## ## ## ## ################", }, { .width = 8, .height = 9, + .yoffset = 4, .bitmap = "#### ## ################## ## #### ## #### ## #### ## #### ## #### ## ##", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = "###### ########## #### #### #### #### #### #### ##", }, { .width = 8, .height = 9, + .yoffset = 4, .bitmap = " #### ###### ### ##### #### #### ##### ### ###### #### ", }, { .width = 8, .height = 12, + .yoffset = 4, .bitmap = "###### ####### ### #### #### #### #### ########## ###### ## ## ## ", }, { .width = 8, .height = 12, + .yoffset = 4, .bitmap = " ###### ########## #### #### #### #### ### ####### ###### ## ## ##", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = "###### ########## #### #### ## ## ## ## ", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = " ##### ###### ## #### ##### #### ############### ", }, { .width = 9, .height = 12, + .yoffset = 1, .bitmap = " # ## ## ################## ## ## ## ## ## ###### #####", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = "## #### #### #### #### #### #### ########## ######", }, { .width = 10, .height = 9, + .yoffset = 4, .bitmap = "### ### ## ## ### ### ## ## ## ## ###### #### #### ## ", }, { .width = 10, .height = 9, + .yoffset = 4, .bitmap = "### ### ## ## ## ## ## ## ## ## ######## ######## ######## ### #### ### ### ", }, { .width = 11, .height = 9, + .yoffset = 4, .bitmap = " ### ### ### ### ### ### ##### #### #### ###### ###### ### ### ", }, { .width = 10, .height = 12, + .yoffset = 4, .bitmap = "### ### ### ## ### ### ## ## ###### ##### #### ### ## ### ##### #### ", }, { .width = 7, .height = 9, + .yoffset = 4, .bitmap = "############## ## ## ### ## ### ##############", }, { .width = 7, .height = 16, + .yoffset = 0, .bitmap = " ### #### ## ## ## ## ## ### #### ## ## ## ## ## ##### ####", }, { .width = 2, .height = 18, + .yoffset = -2, .bitmap = "####################################", }, { .width = 7, .height = 16, + .yoffset = 0, .bitmap = "### #### ## ## ## ## ## ### #### ## ## ## ## ## ##### #### ", }, { .width = 9, .height = 4, + .yoffset = 6, .bitmap = " ### ######## #### ######## #### ", }, { .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }, }; \ No newline at end of file diff --git a/headers/terminal.h b/headers/terminal.h index d637330..932e835 100644 --- a/headers/terminal.h +++ b/headers/terminal.h @@ -9,9 +9,10 @@ #define SCREEN_WIDTH 1024 #define SCREEN_HEIGHT 768 -#define FONT_SIZE 13 -#define VGA_WIDTH (SCREEN_WIDTH / FONT_SIZE) -#define VGA_HEIGHT (SCREEN_HEIGHT / FONT_SIZE) +#define FONT_WIDTH 13 +#define FONT_HEIGHT 17 +#define VGA_WIDTH (SCREEN_WIDTH / FONT_WIDTH) +#define VGA_HEIGHT (SCREEN_HEIGHT / FONT_HEIGHT) #define TERM_COUNT 10 struct screen { @@ -19,7 +20,7 @@ struct screen { size_t column; uint32_t fg_color; uint32_t bg_color; - uint16_t buffer[VGA_WIDTH * VGA_HEIGHT]; + uint8_t buffer[VGA_WIDTH * VGA_HEIGHT]; uint32_t default_color; struct icon *background; struct font *font; diff --git a/src/terminal/put.c b/src/terminal/put.c index 661ba7d..18a175d 100644 --- a/src/terminal/put.c +++ b/src/terminal/put.c @@ -42,8 +42,8 @@ void terminal_remove_last_char(void) screen->column = VGA_WIDTH - 1; screen->row--; } - uint32_t pos_x = (screen->column) * FONT_SIZE; - uint32_t pos_y = screen->row * FONT_SIZE; + uint32_t pos_x = (screen->column) * FONT_WIDTH; + uint32_t pos_y = screen->row * FONT_HEIGHT; struct font node = get_font_node( screen->buffer[screen->row * VGA_WIDTH + screen->column]); @@ -112,7 +112,8 @@ void terminal_putentryat(struct font node, uint32_t fg_color, uint32_t bg_color, for (size_t cy = 0; cy < node.height; cy++) { for (size_t cx = 0; cx < node.width; cx++) { if (glyph[cy * node.width + cx] == '#') - put_pixel(fg_color, x + cx, y + cy); + put_pixel(fg_color, x + cx, + y + cy + node.yoffset); } } } @@ -127,8 +128,8 @@ static void terminal_scroll(void) screen->row--; memset(display.buff, 0, display.height * display.pitch); for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) { - const uint32_t x = (i % VGA_WIDTH) * FONT_SIZE; - const uint32_t y = (i / VGA_WIDTH) * FONT_SIZE; + const uint32_t x = (i % VGA_WIDTH) * FONT_WIDTH; + const uint32_t y = (i / VGA_WIDTH) * FONT_HEIGHT; screen->buffer[i] = screen->buffer[i + VGA_WIDTH]; terminal_putentryat(get_font_node(screen->buffer[i]), screen->fg_color, screen->bg_color, x, y); @@ -138,7 +139,7 @@ static void terminal_scroll(void) static void terminal_new_line(void) { screen->column = 0; - if (++screen->row == VGA_HEIGHT - 1) + if (++screen->row >= VGA_HEIGHT - 1) terminal_scroll(); } @@ -203,9 +204,9 @@ int terminal_putchar(char c) return 1; screen->buffer[screen->column + screen->row * VGA_WIDTH] = c; terminal_putentryat(get_font_node(c), screen->fg_color, - screen->bg_color, screen->column * FONT_SIZE, - screen->row * FONT_SIZE); - if (++screen->column == VGA_WIDTH) + screen->bg_color, screen->column * FONT_WIDTH, + screen->row * FONT_HEIGHT); + if (++screen->column >= VGA_WIDTH) terminal_new_line(); return 1; } diff --git a/tools/font_converter.py b/tools/font_converter.py index c73f196..c0c7833 100644 --- a/tools/font_converter.py +++ b/tools/font_converter.py @@ -13,25 +13,29 @@ with open(sys.argv[1]) as f: font_name: str = os.path.basename(sys.argv[1]).split(".")[0] img_file_relative_path: str = re.findall(r"file=\"(\w+[^\"]+)\"", fnt_data)[0] -img_file_absolute_path: str = sys.argv[1][0:sys.argv[1].rfind("/") + 1] + img_file_relative_path +img_file_absolute_path: str = sys.argv[1][0:sys.argv[1].rfind("/") + + 1] + img_file_relative_path image = Image.open(img_file_absolute_path) width, height = image.size pixels = list(image.getdata()) -pixels = [pixels[i * width:(i + 1) * width] for i in range(height)] +pixels = [pixels[i * width:(i + 1) * width] for i in range(height)] characteres: list[list[int]] = [None for i in range(128)] -for id, x, y, width, height, xoffset, yoffset, xadvance in re.findall(r"id=(\d+) x=(\d+) y=(\d+) width=(\d+) height=(\d+) xoffset=(-?\d+) yoffset=(-?\d+) xadvance=(\d+)", fnt_data): - id, x, y, width, height, xoffset, yoffset, xadvance = int(id), int(x), int(y), int(width), int(height), int(xoffset), int(yoffset), int(xadvance) +for id, x, y, width, height, xoffset, yoffset, xadvance in re.findall( + r"id=(\d+) x=(\d+) y=(\d+) width=(\d+) height=(\d+) xoffset=(-?\d+) yoffset=(-?\d+) xadvance=(\d+)", + fnt_data): + id, x, y, width, height, xoffset, yoffset, xadvance = int(id), int(x), int( + y), int(width), int(height), int(xoffset), int(yoffset), int(xadvance) bitmap: list[str] = [] for line in pixels[y:y + height]: tmp: str = "" - for r,g,b,a in line[x:x + width]: + for r, g, b, a in line[x:x + width]: tmp += "#" if a else " " - bitmap.append(tmp) - characteres[id] = [height, width, bitmap] + bitmap.append(tmp) + characteres[id] = [height, width, yoffset, bitmap] string: str = f"""\ #pragma once @@ -45,11 +49,12 @@ struct font {font_name}_font[] = {{\\\ for charactere in characteres: if (charactere is not None): - height, width, bitmap = charactere + height, width, yoffset, bitmap = charactere string += f""" {{ .width = {width}, .height = {height}, + .yoffset = {yoffset}, .bitmap = "{"".join(bitmap)}", }},\ """ @@ -58,6 +63,7 @@ for charactere in characteres: {{ .width = 0, .height = 0, + .yoffset = 0, .bitmap = NULL, }},\ """ @@ -67,4 +73,4 @@ if not os.path.exists("./headers/fonts"): os.makedirs("./headers/fonts") with open(f"./headers/fonts/{font_name}.h", "w") as f: - f.write(string) \ No newline at end of file + f.write(string)