feature: terminal scroll works again (with a bg image, without the bg image it's a wip)

This commit is contained in:
0x35c 2024-12-17 15:33:21 +01:00
parent 3b0b090430
commit dda9c8a1ef
6 changed files with 840 additions and 661 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
int isprint(int c) int isprint(int c)
{ {
return (32 <= c && c < 127); return (c >= 32 && c < 127);
} }

View File

@ -1,5 +1,4 @@
#include "vbe.h" #include "vbe.h"
#include "drivers.h"
#include "icon.h" #include "icon.h"
struct vbe_interface display; struct vbe_interface display;

View File

@ -3,7 +3,6 @@
#include "drivers.h" #include "drivers.h"
#include "gdt.h" #include "gdt.h"
#include "icon.h" #include "icon.h"
#include "icons/image.h"
#include "idt.h" #include "idt.h"
#include "kprintf.h" #include "kprintf.h"
#include "memory.h" #include "memory.h"

View File

@ -3,6 +3,7 @@
#include "font.h" #include "font.h"
#include "fonts/eating_pasta_regular_13.h" #include "fonts/eating_pasta_regular_13.h"
#include "fonts/minecraft_medium_13.h" #include "fonts/minecraft_medium_13.h"
#include "icons/image.h"
#include "kprintf.h" #include "kprintf.h"
#include "shell.h" #include "shell.h"
#include "string.h" #include "string.h"
@ -75,16 +76,21 @@ uint8_t terminal_get_char(int x, int y)
void terminal_putentryat(struct font node, uint32_t fg_color, uint32_t bg_color, void terminal_putentryat(struct font node, uint32_t fg_color, uint32_t bg_color,
size_t x, size_t y) size_t x, size_t y)
{ {
if (node.width == 1 && node.height == 1) {
return;
}
char *glyph = node.bitmap; char *glyph = node.bitmap;
for (size_t cy = 0; cy < node.height; cy++) { for (size_t cy = 0; cy < node.height; cy++) {
for (size_t cx = 0; cx < node.width; cx++) { for (size_t cx = 0; cx < node.width; cx++) {
put_pixel((glyph[cy * node.width + cx] == '#') if (glyph[cy * node.width + cx] == '#')
? fg_color put_pixel(fg_color, x + cx, y + cy);
: bg_color, /* put_pixel((glyph[cy * node.width +
x + cx, y + cy); * cx] == '#') ? fg_color */
/* put_pixel((fg_color, x + cx, y + cy); */ /* : bg_color, */
/* x + cx, y + cy); */
/* else if (bg_color) */ /* else if (bg_color) */
/* put_pixel(bg_color, x + cx, y + cy); */ /* put_pixel(bg_color, x + cx, y + cy);
*/
} }
} }
} }
@ -97,21 +103,23 @@ static struct font get_font_node(int c)
static void terminal_scroll(void) static void terminal_scroll(void)
{ {
screen->row--; screen->row--;
draw_icon(0, 0, &image_icon);
for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) { for (size_t i = 0; i < VGA_WIDTH * (VGA_HEIGHT - 1); i++) {
const uint32_t x = (i % VGA_WIDTH) * FONT_SIZE; const uint32_t x = (i % VGA_WIDTH) * FONT_SIZE;
const uint32_t y = (i / VGA_WIDTH) * FONT_SIZE; const uint32_t y = (i / VGA_WIDTH) * FONT_SIZE;
screen->buffer[i] = screen->buffer[i + VGA_WIDTH];
terminal_putentryat(get_font_node(screen->buffer[i]), terminal_putentryat(get_font_node(screen->buffer[i]),
screen->fg_color, screen->bg_color, x, y); screen->fg_color, screen->bg_color, x, y);
} }
/* for (size_t i = 0; i < VGA_WIDTH; i++) */ /* for (size_t i = 0; i < VGA_WIDTH; i++) */
/* terminal_putentryat(get_font_node(' '), 0, 0, i * FONT_SIZE, */ /* terminal_putentryat(get_font_node(' '), 0, 0, i * FONT_SIZE, */
/* VGA_HEIGHT - 1); */ /* (VGA_HEIGHT - 1) * FONT_SIZE); */
} }
static void terminal_new_line(void) static void terminal_new_line(void)
{ {
screen->column = 0; screen->column = 0;
if (++screen->row == VGA_HEIGHT) if (++screen->row == VGA_HEIGHT - 1)
terminal_scroll(); terminal_scroll();
} }
@ -121,20 +129,23 @@ void terminal_change_default_color(uint32_t color)
/* terminal_set_color(color); */ /* terminal_set_color(color); */
/* for (size_t y = 0; y < VGA_HEIGHT; y++) { */ /* for (size_t y = 0; y < VGA_HEIGHT; y++) { */
/* for (size_t x = 0; x < VGA_WIDTH; x++) { */ /* for (size_t x = 0; x < VGA_WIDTH; x++) { */
/* const size_t index = y * VGA_WIDTH + x; */ /* const size_t index = y * VGA_WIDTH + x;
*/
/* uint8_t entry_color = /* uint8_t entry_color =
* get_entry_color(TERM_BUF[index]); * get_entry_color(TERM_BUF[index]);
*/ */
/* TERM_BUF[index] = vga_entry( */ /* TERM_BUF[index] = vga_entry( */
/* TERM_BUF[index], */ /* TERM_BUF[index], */
/* entry_color == screen->default_color ? color /* entry_color == screen->default_color
* ? color
*/ */
/* : /* :
* entry_color); * entry_color);
*/ */
/* } */ /* } */
/* } */ /* } */
/* memcpy(screen->buffer, TERM_BUF, sizeof(screen->buffer)); */ /* memcpy(screen->buffer, TERM_BUF,
* sizeof(screen->buffer)); */
/* screen->default_color = color; */ /* screen->default_color = color; */
/* screen->color = color; */ /* screen->color = color; */
} }
@ -150,12 +161,15 @@ void terminal_clear(void)
// TODO // TODO
/* for (size_t y = 0; y < VGA_HEIGHT; y++) { */ /* for (size_t y = 0; y < VGA_HEIGHT; y++) { */
/* for (size_t x = 0; x < VGA_WIDTH; x++) { */ /* for (size_t x = 0; x < VGA_WIDTH; x++) { */
/* const size_t index = y * VGA_WIDTH + x; */ /* const size_t index = y * VGA_WIDTH + x;
/* TERM_BUF[index] = vga_entry(' ', screen->color); */
/* TERM_BUF[index] = vga_entry(' ',
* screen->color);
*/ */
/* } */ /* } */
/* } */ /* } */
/* memcpy(screen->buffer, TERM_BUF, sizeof(screen->buffer)); */ /* memcpy(screen->buffer, TERM_BUF,
* sizeof(screen->buffer)); */
/* screen->column = 0; */ /* screen->column = 0; */
/* screen->row = 0; */ /* screen->row = 0; */
} }
@ -168,12 +182,19 @@ int terminal_putchar(char c)
terminal_new_line(); terminal_new_line();
if (!isprint(c)) if (!isprint(c))
return 1; return 1;
/* if (c == ' ') { */
/* for (size_t cy = 0; cy < 13; cy++) */
/* for (size_t cx = 0; cx < 13; cx++) */
/* put_pixel(0, screen->column + cx, */
/* screen->row + cy); */
/* } else { */
screen->buffer[screen->column + screen->row * VGA_WIDTH] = c; screen->buffer[screen->column + screen->row * VGA_WIDTH] = c;
terminal_putentryat(get_font_node(c), screen->fg_color, terminal_putentryat(get_font_node(c), screen->fg_color,
screen->bg_color, screen->column * FONT_SIZE, screen->bg_color, screen->column * FONT_SIZE,
screen->row * FONT_SIZE); screen->row * FONT_SIZE);
if (++screen->column == VGA_WIDTH) if (++screen->column == VGA_WIDTH)
terminal_new_line(); terminal_new_line();
/* } */
return 1; return 1;
} }
@ -194,7 +215,8 @@ int terminal_writestring(const char *data)
void update_cursor(void) void update_cursor(void)
{ {
/* uint16_t pos = screen->row * VGA_WIDTH + screen->column; */ /* uint16_t pos = screen->row * VGA_WIDTH +
* screen->column; */
/* outb(0x3D4, 0x0F); */ /* outb(0x3D4, 0x0F); */
/* outb(0x3D5, pos & 0xFF); */ /* outb(0x3D5, pos & 0xFF); */

37
tools/icon_maker.py Normal file
View File

@ -0,0 +1,37 @@
from PIL import Image
import sys
import os
if (len(sys.argv) < 2):
print("Error: usage python icon_maker.py {img}")
image = Image.open(sys.argv[1])
width, height = image.size
pixels = list(image.getdata())
pixels = [r << 16 | g << 8 | b for r, g, b in pixels]
string = str(pixels).replace("(", "{").replace(")", "}").replace("[", "{").replace("]", "}")
filename: str = os.path.basename(sys.argv[1]).split(".")[0]
string = f"""\
#pragma once
#include <stdint.h>
#include "icon.h"
uint32_t {filename}_color_map[{width} * {height}] = {string};
struct icon {filename}_icon = {{
.height = {height},
.width = {width},
.pixels = {filename}_color_map
}};
"""
with open(f"./headers/icons/{filename}.h", "w") as f:
f.write(string)