From 1ea09891bcb303d01b77d6d659424b40479475bb Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 30 Sep 2020 17:29:07 +0200 Subject: [PATCH] VBE: Add margin gradient --- limine.bin | Bin 32768 -> 32768 bytes stage2/drivers/vbe.c | 45 +++++++++++++++++++++++++++++++++++++++++-- stage2/drivers/vbe.h | 2 +- stage2/lib/blib.c | 24 +++++++++++++++++++++++ stage2/lib/blib.h | 2 ++ stage2/lib/term.c | 4 ++-- stage2/lib/term.h | 2 +- stage2/menu.c | 9 +++++++-- 8 files changed, 80 insertions(+), 8 deletions(-) diff --git a/limine.bin b/limine.bin index d95d865b08760d93babe7b3d800841f7049d7762..79fd1a85bd94a2c6da2cd78959a83686941f32cb 100644 GIT binary patch delta 21610 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 24) #define R(rgb) (uint8_t)(rgb >> 16) @@ -85,11 +86,49 @@ static void _vbe_plot_bg_blent_px(int x, int y, uint32_t hex) { void (*vbe_plot_bg_blent_px)(int x, int y, uint32_t hex) = vbe_plot_px; +static uint32_t blend_gradient_from_box(int x, int y, uint32_t hex) { + if (x >= frame_width && x < frame_width + VGA_FONT_WIDTH * cols + && y >= frame_height && y < frame_height + VGA_FONT_HEIGHT * rows) { + return hex; + } + + int distance, x_distance, y_distance; + + if (x < frame_width) + x_distance = frame_width - x; + else + x_distance = x - (frame_width + VGA_FONT_WIDTH * cols); + + if (y < frame_height) + y_distance = frame_height - y; + else + y_distance = y - (frame_height + VGA_FONT_HEIGHT * rows); + + if (x >= frame_width && x < frame_width + VGA_FONT_WIDTH * cols) { + distance = y_distance; + } else if (y >= frame_height && y < frame_height + VGA_FONT_HEIGHT * rows) { + distance = x_distance; + } else { + distance = sqrt((uint64_t)x_distance * (uint64_t)x_distance + + (uint64_t)y_distance * (uint64_t)y_distance); + } + + uint32_t bg_px = background->get_pixel(background, x, y); + + if (distance > margin_gradient) + return bg_px; + + uint8_t gradient_step = (0xff - A(hex)) / margin_gradient; + uint8_t new_alpha = A(hex) + gradient_step * distance; + + return colour_blend((hex & 0xffffff) | (new_alpha << 24), bg_px); +} + void vbe_plot_background(int x, int y, int width, int height) { if (background) { for (int yy = 0; yy < height; yy++) { for (int xx = 0; xx < width; xx++) { - vbe_plot_px(x + xx, y + yy, background->get_pixel(background, x + xx, y + yy)); + vbe_plot_px(x + xx, y + yy, blend_gradient_from_box(xx, yy, text_bg)); } } } else { @@ -273,7 +312,7 @@ void vbe_putchar(char c) { } } -void vbe_tty_init(int *_rows, int *_cols, uint32_t *_colours, int _margin, struct image *_background) { +void vbe_tty_init(int *_rows, int *_cols, uint32_t *_colours, int _margin, int _margin_gradient, struct image *_background) { init_vbe(&vbe_framebuffer, &vbe_pitch, &vbe_width, &vbe_height, &vbe_bpp); mtrr_set_range((uint64_t)(size_t)vbe_framebuffer, @@ -292,6 +331,8 @@ void vbe_tty_init(int *_rows, int *_cols, uint32_t *_colours, int _margin, struc text_bg = ansi_colours[0]; text_fg = ansi_colours[7]; + margin_gradient = _margin_gradient; + frame_height = vbe_height / 2 - (VGA_FONT_HEIGHT * rows) / 2; frame_width = vbe_width / 2 - (VGA_FONT_WIDTH * cols) / 2; diff --git a/stage2/drivers/vbe.h b/stage2/drivers/vbe.h index 1150e11c..faefe05a 100644 --- a/stage2/drivers/vbe.h +++ b/stage2/drivers/vbe.h @@ -7,7 +7,7 @@ int init_vbe(uint32_t **framebuffer, uint16_t *pitch, uint16_t *target_width, uint16_t *target_height, uint16_t *target_bpp); -void vbe_tty_init(int *rows, int *cols, uint32_t *colours, int margin, struct image *background); +void vbe_tty_init(int *rows, int *cols, uint32_t *colours, int margin, int margin_gradient, struct image *background); void vbe_putchar(char c); void vbe_clear(bool move); diff --git a/stage2/lib/blib.c b/stage2/lib/blib.c index d98014ef..b74a3b57 100644 --- a/stage2/lib/blib.c +++ b/stage2/lib/blib.c @@ -10,6 +10,30 @@ #include #include +// This integer sqrt implementation has been adapted from: +// https://stackoverflow.com/questions/1100090/looking-for-an-efficient-integer-square-root-algorithm-for-arm-thumb2 +uint64_t sqrt(uint64_t a_nInput) { + uint64_t op = a_nInput; + uint64_t res = 0; + uint64_t one = (uint64_t)1 << 62; + + // "one" starts at the highest power of four <= than the argument. + while (one > op) { + one >>= 2; + } + + while (one != 0) { + if (op >= res + one) { + op = op - (res + one); + res = res + 2 * one; + } + res >>= 1; + one >>= 2; + } + + return res; +} + uint8_t bcd_to_int(uint8_t val) { return (val & 0x0f) + ((val & 0xf0) >> 4) * 10; } diff --git a/stage2/lib/blib.h b/stage2/lib/blib.h index 015d5839..49577df1 100644 --- a/stage2/lib/blib.h +++ b/stage2/lib/blib.h @@ -4,6 +4,8 @@ #include #include +uint64_t sqrt(uint64_t a_nInput); + uint8_t bcd_to_int(uint8_t val); int cpuid(uint32_t leaf, uint32_t subleaf, diff --git a/stage2/lib/term.c b/stage2/lib/term.c index 51a0c555..2eb660a4 100644 --- a/stage2/lib/term.c +++ b/stage2/lib/term.c @@ -24,9 +24,9 @@ void (*set_text_bg)(int bg); static int rows, cols; -void term_vbe(uint32_t *colours, int margin, struct image *background) { +void term_vbe(uint32_t *colours, int margin, int margin_gradient, struct image *background) { term_deinit(); - vbe_tty_init(&rows, &cols, colours, margin, background); + vbe_tty_init(&rows, &cols, colours, margin, margin_gradient, background); raw_putchar = vbe_putchar; clear = vbe_clear; diff --git a/stage2/lib/term.h b/stage2/lib/term.h index ba7e8d67..9d7e967d 100644 --- a/stage2/lib/term.h +++ b/stage2/lib/term.h @@ -14,7 +14,7 @@ extern void (*get_cursor_pos)(int *x, int *y); extern void (*set_text_fg)(int fg); extern void (*set_text_bg)(int bg); -void term_vbe(uint32_t *colours, int margin, struct image *background); +void term_vbe(uint32_t *colours, int margin, int margin_gradient, struct image *background); void term_textmode(void); void term_deinit(void); void term_write(const char *buf, size_t count); diff --git a/stage2/menu.c b/stage2/menu.c index 636ef501..180eea1f 100644 --- a/stage2/menu.c +++ b/stage2/menu.c @@ -38,6 +38,7 @@ char *menu(int boot_drive) { if (config_get_value(buf, 0, 16, "GRAPHICS") && !strcmp(buf, "yes")) { // default scheme int margin = 64; + int margin_gradient = 20; uint32_t colourscheme[] = { 0x00000000, // black 0x00aa0000, // red @@ -85,6 +86,10 @@ char *menu(int boot_drive) { margin = (int)strtoui(buf); } + if (config_get_value(buf, 0, 16, "THEME_MARGIN_GRADIENT")) { + margin_gradient = (int)strtoui(buf); + } + int bg_drive; if (!config_get_value(buf, 0, 16, "BACKGROUND_DRIVE")) { bg_drive = boot_drive; @@ -108,11 +113,11 @@ char *menu(int boot_drive) { if (open_image(bg, bg_file)) goto nobg; - term_vbe(colourscheme, margin, bg); + term_vbe(colourscheme, margin, margin_gradient, bg); goto yesbg; nobg: - term_vbe(colourscheme, margin, NULL); + term_vbe(colourscheme, margin, margin_gradient, NULL); yesbg:; }