2021-03-02 08:05:14 +03:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <lib/gterm.h>
|
2022-08-27 00:44:47 +03:00
|
|
|
#include <lib/misc.h>
|
2021-03-02 08:05:14 +03:00
|
|
|
#include <lib/libc.h>
|
|
|
|
#include <lib/config.h>
|
|
|
|
#include <lib/print.h>
|
|
|
|
#include <lib/uri.h>
|
2021-03-02 08:21:05 +03:00
|
|
|
#include <lib/fb.h>
|
2022-10-04 22:00:39 +03:00
|
|
|
#include <lib/image.h>
|
2021-03-02 08:05:14 +03:00
|
|
|
#include <mm/pmm.h>
|
2022-10-04 01:58:00 +03:00
|
|
|
#include <term/term.h>
|
|
|
|
#include <term/backends/framebuffer.h>
|
|
|
|
#include <lib/term.h>
|
2021-10-14 16:36:53 +03:00
|
|
|
|
2022-10-04 07:04:31 +03:00
|
|
|
// Builtin font originally taken from:
|
|
|
|
// https://github.com/viler-int10h/vga-text-mode-fonts/raw/master/FONTS/PC-OTHER/TOSH-SAT.F16
|
|
|
|
static const uint8_t builtin_font[] = {
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x81, 0x81, 0xa5, 0xa5, 0x81,
|
|
|
|
0x81, 0xa5, 0x99, 0x81, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0xff,
|
|
|
|
0xff, 0xdb, 0xdb, 0xff, 0xff, 0xdb, 0xe7, 0xff, 0x7e, 0x3c, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10,
|
|
|
|
0x10, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe,
|
|
|
|
0x7c, 0x7c, 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
|
|
|
|
0x3c, 0x3c, 0xdb, 0xff, 0xff, 0xdb, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0xff, 0x66, 0x18, 0x18,
|
|
|
|
0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78,
|
|
|
|
0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0x84, 0x84, 0xcc, 0x78, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
|
|
|
|
0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1e,
|
|
|
|
0x0e, 0x1e, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0xfc, 0x30, 0x30,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x1c, 0x1e, 0x16, 0x12,
|
|
|
|
0x10, 0x10, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x2c,
|
|
|
|
0x26, 0x32, 0x3a, 0x2e, 0x26, 0x22, 0x62, 0xe2, 0xc6, 0x0e, 0x0c, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf8, 0xfe,
|
|
|
|
0xf8, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
|
|
|
|
0x06, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x30, 0x78, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x78,
|
|
|
|
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
|
|
|
|
0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
|
|
|
|
0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c,
|
|
|
|
0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78,
|
|
|
|
0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x78, 0x30, 0xfc, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x30, 0x78, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
|
|
|
|
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
|
|
|
|
0x30, 0x30, 0xfc, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x18, 0x0c, 0xfe, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0xfe, 0x60, 0x30, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x24, 0x66, 0xff, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
|
|
|
|
0x38, 0x38, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x30, 0x78, 0x78, 0x78, 0x78, 0x30, 0x30, 0x30, 0x00, 0x30,
|
|
|
|
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
|
|
|
|
0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x18, 0x18, 0x7c, 0xc6, 0xc0, 0xc0, 0x7c, 0x06, 0x06, 0xc6, 0x7c,
|
|
|
|
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x0c, 0x0c, 0x18, 0x38,
|
|
|
|
0x30, 0x60, 0x60, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
|
|
|
|
0x6c, 0x38, 0x30, 0x76, 0xde, 0xcc, 0xcc, 0xde, 0x76, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x60, 0x60, 0x60,
|
|
|
|
0x60, 0x60, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x38, 0xfe, 0x38, 0x6c, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
|
|
|
|
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06,
|
|
|
|
0x0c, 0x0c, 0x18, 0x38, 0x30, 0x60, 0x60, 0xc0, 0xc0, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
|
|
|
|
0x06, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0x06, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc,
|
|
|
|
0xfe, 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x3c, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
|
|
|
|
0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
|
|
|
|
0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c,
|
|
|
|
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
|
|
|
|
0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c,
|
|
|
|
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00,
|
|
|
|
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60,
|
|
|
|
0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x06, 0x0c, 0x18, 0x30, 0x30, 0x00, 0x30,
|
|
|
|
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
|
|
|
|
0xde, 0xde, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30,
|
|
|
|
0x30, 0x30, 0x30, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
|
|
|
|
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xc6, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6,
|
|
|
|
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
|
|
|
|
0xee, 0xfe, 0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xc6, 0xc6, 0xe6, 0xe6, 0xf6, 0xde, 0xce, 0xce, 0xc6, 0xc6,
|
|
|
|
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xf6, 0xda,
|
|
|
|
0x6c, 0x06, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0xfc,
|
|
|
|
0xd8, 0xcc, 0xcc, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
|
|
|
|
0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c,
|
|
|
|
0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x38,
|
|
|
|
0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc,
|
|
|
|
0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xfe, 0x06, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x60, 0x60, 0x60, 0x60, 0x60,
|
|
|
|
0x60, 0x60, 0x60, 0x60, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
|
|
|
|
0x60, 0x60, 0x30, 0x38, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
|
|
|
|
0x00, 0x00, 0x18, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x06,
|
|
|
|
0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xe6, 0xdc, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x76, 0xce, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x30,
|
|
|
|
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xce, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x06,
|
|
|
|
0x06, 0x06, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xc6, 0xcc, 0xd8, 0xf0, 0xf0, 0xd8, 0xcc, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xfe, 0xd6,
|
|
|
|
0xd6, 0xd6, 0xd6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xe6, 0xdc, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x76, 0xce, 0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0x06, 0x06, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0,
|
|
|
|
0x70, 0x1c, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
|
|
|
|
0x30, 0xfe, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0xc6, 0xc6, 0xd6, 0xd6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6,
|
|
|
|
0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0xfe, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x1c, 0x30, 0x30, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x30, 0x30,
|
|
|
|
0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00,
|
|
|
|
0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x30,
|
|
|
|
0x30, 0x30, 0x30, 0x1c, 0x30, 0x30, 0x30, 0x30, 0xe0, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x38, 0x38, 0x6c,
|
|
|
|
0x6c, 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x18, 0xcc, 0x78, 0x00,
|
|
|
|
0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6,
|
|
|
|
0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
|
|
|
|
0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7e, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0x06, 0x06,
|
|
|
|
0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
|
|
|
|
0x00, 0x7c, 0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc6,
|
|
|
|
0x7c, 0x18, 0x0c, 0x38, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
|
|
|
|
0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
|
|
|
|
0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0, 0x7e, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc0, 0xc0, 0xc0,
|
|
|
|
0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x38, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
|
|
|
|
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x3c, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
|
|
|
|
0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x18, 0x30, 0x60, 0x00, 0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x36, 0x36,
|
|
|
|
0x76, 0xde, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3c,
|
|
|
|
0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
|
|
|
|
0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x10, 0x38, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c,
|
|
|
|
0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0xc6, 0x7c, 0x00,
|
|
|
|
0x6c, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
|
|
|
|
0x30, 0x78, 0xcc, 0xc0, 0xc0, 0xcc, 0x78, 0x30, 0x30, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x38, 0x6c, 0x60, 0x60, 0x60, 0xf8, 0x60, 0x60, 0x60, 0xe6,
|
|
|
|
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0xfc,
|
|
|
|
0x30, 0xfc, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc,
|
|
|
|
0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0xd8, 0x70, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0x06, 0x06,
|
|
|
|
0x7e, 0xc6, 0xc6, 0xc6, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
|
|
|
|
0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0xc6, 0xc6, 0xc6,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
|
|
|
|
0x00, 0xdc, 0xe6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x76, 0xdc, 0x00, 0xc6, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6,
|
|
|
|
0xc6, 0x00, 0x00, 0x00, 0x00, 0x78, 0xd8, 0xd8, 0x6c, 0x00, 0xfc, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
|
|
|
|
0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xc6,
|
|
|
|
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0xfe, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xc0, 0xc2, 0xc6, 0xcc, 0xd8, 0x30, 0x60, 0xdc, 0x86, 0x0c,
|
|
|
|
0x18, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc2, 0xc6, 0xcc, 0xd8, 0x30,
|
|
|
|
0x66, 0xce, 0x9e, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30,
|
|
|
|
0x00, 0x30, 0x30, 0x30, 0x78, 0x78, 0x78, 0x78, 0x30, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
|
|
|
|
0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x88, 0x22, 0x88,
|
|
|
|
0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
|
|
|
|
0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
|
|
|
|
0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
|
|
|
|
0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18,
|
|
|
|
0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18,
|
|
|
|
0x18, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0xf6, 0xf6, 0x06, 0x06, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x06,
|
|
|
|
0x06, 0xf6, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0xf6, 0xf6, 0x06, 0x06, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0xfe, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0xf8, 0x18,
|
|
|
|
0x18, 0xf8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0xf8, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
|
|
|
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
|
|
|
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
|
|
|
|
0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x37, 0x37, 0x30, 0x30, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x30, 0x30, 0x37, 0x37, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0xf7, 0x00,
|
|
|
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0xff, 0xff, 0x00, 0x00, 0xf7, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x30, 0x30, 0x37, 0x37, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
|
|
|
|
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0xf7, 0xf7, 0x00, 0x00, 0xf7, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
|
|
|
|
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
|
|
|
|
0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x1f, 0x1f, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
|
|
|
|
0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x36, 0x36, 0x36, 0xff, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0x18, 0x18, 0xff, 0xff, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
|
|
|
|
0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x1f, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
|
|
|
|
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
|
|
|
|
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
|
|
|
|
0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x76, 0xd6, 0xdc, 0xc8, 0xc8, 0xdc, 0xd6, 0x76, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
|
|
|
|
0xd8, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
|
|
|
|
0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x7e, 0xfe, 0x24, 0x24, 0x24, 0x24, 0x66, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0xfe, 0xfe, 0xc2, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc2, 0xfe,
|
|
|
|
0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xc8, 0xcc,
|
|
|
|
0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x6c, 0x60, 0xc0, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xfc, 0x98, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x30, 0x30, 0x78, 0xcc, 0xcc,
|
|
|
|
0xcc, 0x78, 0x30, 0x30, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c,
|
|
|
|
0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0x60, 0x30, 0x78, 0xcc,
|
|
|
|
0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x76, 0xbb, 0x99, 0x99, 0xdd, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x02, 0x06, 0x3c, 0x6c, 0xce, 0xd6, 0xd6, 0xe6, 0x6c, 0x78,
|
|
|
|
0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x60, 0xc0, 0xc0, 0xfe,
|
|
|
|
0xc0, 0xc0, 0x60, 0x30, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
|
|
|
|
0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xfc,
|
|
|
|
0x30, 0x30, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00,
|
|
|
|
0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x36, 0x30, 0x30, 0x30,
|
|
|
|
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18,
|
|
|
|
0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
|
|
|
|
0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xcc, 0xcc,
|
|
|
|
0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
|
|
|
|
0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0x6c, 0x3c, 0x1c, 0x0c, 0x00, 0x00,
|
|
|
|
0x00, 0xd8, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x0c, 0x18, 0x30, 0x60, 0x7c,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
0x00, 0x00, 0x00, 0x00
|
|
|
|
};
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2022-10-04 07:04:31 +03:00
|
|
|
struct fb_info fbinfo;
|
2021-03-02 08:05:14 +03:00
|
|
|
|
|
|
|
static struct image *background;
|
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
static size_t margin = 64;
|
|
|
|
static size_t margin_gradient = 4;
|
2022-01-19 01:46:25 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
static uint32_t default_bg, default_fg;
|
2022-01-19 01:46:25 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
static size_t bg_canvas_size;
|
|
|
|
static uint32_t *bg_canvas;
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2021-08-26 02:23:27 +03:00
|
|
|
#define A(rgb) (uint8_t)(rgb >> 24)
|
|
|
|
#define R(rgb) (uint8_t)(rgb >> 16)
|
|
|
|
#define G(rgb) (uint8_t)(rgb >> 8)
|
|
|
|
#define B(rgb) (uint8_t)(rgb)
|
|
|
|
#define ARGB(a, r, g, b) (a << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF)
|
2021-03-02 08:05:14 +03:00
|
|
|
|
|
|
|
static inline uint32_t colour_blend(uint32_t fg, uint32_t bg) {
|
|
|
|
unsigned alpha = 255 - A(fg);
|
|
|
|
unsigned inv_alpha = A(fg) + 1;
|
|
|
|
|
|
|
|
uint8_t r = (uint8_t)((alpha * R(fg) + inv_alpha * R(bg)) / 256);
|
|
|
|
uint8_t g = (uint8_t)((alpha * G(fg) + inv_alpha * G(bg)) / 256);
|
|
|
|
uint8_t b = (uint8_t)((alpha * B(fg) + inv_alpha * B(bg)) / 256);
|
|
|
|
|
|
|
|
return ARGB(0, r, g, b);
|
|
|
|
}
|
|
|
|
|
2021-08-16 19:02:28 +03:00
|
|
|
static uint32_t blend_gradient_from_box(size_t x, size_t y, uint32_t bg_px, uint32_t hex) {
|
|
|
|
size_t distance, x_distance, y_distance;
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t gradient_stop_x = fbinfo.framebuffer_width - margin;
|
|
|
|
size_t gradient_stop_y = fbinfo.framebuffer_height - margin;
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2021-10-12 17:38:24 +03:00
|
|
|
if (x < margin)
|
|
|
|
x_distance = margin - x;
|
2021-03-02 08:05:14 +03:00
|
|
|
else
|
2021-10-12 17:38:24 +03:00
|
|
|
x_distance = x - gradient_stop_x;
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2021-10-12 17:38:24 +03:00
|
|
|
if (y < margin)
|
|
|
|
y_distance = margin - y;
|
2021-03-02 08:05:14 +03:00
|
|
|
else
|
2021-10-12 17:38:24 +03:00
|
|
|
y_distance = y - gradient_stop_y;
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2021-10-12 17:38:24 +03:00
|
|
|
if (x >= margin && x < gradient_stop_x) {
|
2021-03-02 08:05:14 +03:00
|
|
|
distance = y_distance;
|
2021-10-12 17:38:24 +03:00
|
|
|
} else if (y >= margin && y < gradient_stop_y) {
|
2021-03-02 08:05:14 +03:00
|
|
|
distance = x_distance;
|
|
|
|
} else {
|
|
|
|
distance = sqrt((uint64_t)x_distance * (uint64_t)x_distance
|
|
|
|
+ (uint64_t)y_distance * (uint64_t)y_distance);
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2021-08-16 19:02:28 +03:00
|
|
|
typedef size_t fixedp6; // the last 6 bits are the fixed point part
|
|
|
|
static size_t fixedp6_to_int(fixedp6 value) { return value / 64; }
|
|
|
|
static fixedp6 int_to_fixedp6(size_t value) { return value * 64; }
|
2021-07-11 08:28:09 +03:00
|
|
|
|
|
|
|
// Draw rect at coordinates, copying from the image to the fb and canvas, applying fn on every pixel
|
2021-08-16 19:02:28 +03:00
|
|
|
__attribute__((always_inline)) static inline void genloop(size_t xstart, size_t xend, size_t ystart, size_t yend, uint32_t (*blend)(size_t x, size_t y, uint32_t orig)) {
|
2021-07-11 08:28:09 +03:00
|
|
|
uint8_t *img = background->img;
|
2021-08-16 19:02:28 +03:00
|
|
|
const size_t img_width = background->img_width, img_height = background->img_height, img_pitch = background->pitch, colsize = background->bpp / 8;
|
2021-07-11 08:28:09 +03:00
|
|
|
|
|
|
|
switch (background->type) {
|
|
|
|
case IMAGE_TILED:
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t y = ystart; y < yend; y++) {
|
|
|
|
size_t image_y = y % img_height, image_x = xstart % img_width;
|
2021-07-11 08:28:09 +03:00
|
|
|
const size_t off = img_pitch * (img_height - 1 - image_y);
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t canvas_off = fbinfo.framebuffer_width * y;
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t x = xstart; x < xend; x++) {
|
2021-07-11 08:28:09 +03:00
|
|
|
uint32_t img_pixel = *(uint32_t*)(img + image_x * colsize + off);
|
|
|
|
uint32_t i = blend(x, y, img_pixel);
|
2022-10-04 01:58:00 +03:00
|
|
|
bg_canvas[canvas_off + x] = i;
|
2021-07-11 08:28:09 +03:00
|
|
|
if (image_x++ == img_width) image_x = 0; // image_x = x % img_width, but modulo is too expensive
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IMAGE_CENTERED:
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t y = ystart; y < yend; y++) {
|
|
|
|
size_t image_y = y - background->y_displacement;
|
2021-07-11 08:28:09 +03:00
|
|
|
const size_t off = img_pitch * (img_height - 1 - image_y);
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t canvas_off = fbinfo.framebuffer_width * y;
|
2021-08-16 19:02:28 +03:00
|
|
|
if (image_y >= background->y_size) { /* external part */
|
|
|
|
for (size_t x = xstart; x < xend; x++) {
|
2021-07-11 08:28:09 +03:00
|
|
|
uint32_t i = blend(x, y, background->back_colour);
|
2022-10-04 01:58:00 +03:00
|
|
|
bg_canvas[canvas_off + x] = i;
|
2021-07-11 08:28:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else { /* internal part */
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t x = xstart; x < xend; x++) {
|
|
|
|
size_t image_x = (x - background->x_displacement);
|
|
|
|
bool x_external = image_x >= background->x_size;
|
2021-07-11 08:28:09 +03:00
|
|
|
uint32_t img_pixel = *(uint32_t*)(img + image_x * colsize + off);
|
|
|
|
uint32_t i = blend(x, y, x_external ? background->back_colour : img_pixel);
|
2022-10-04 01:58:00 +03:00
|
|
|
bg_canvas[canvas_off + x] = i;
|
2021-07-11 08:28:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
// For every pixel, ratio = img_width / gterm_width, img_x = x * ratio, x = (xstart + i)
|
|
|
|
// hence x = xstart * ratio + i * ratio
|
|
|
|
// so you can set x = xstart * ratio, and increment by ratio at each iteration
|
|
|
|
case IMAGE_STRETCHED:
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t y = ystart; y < yend; y++) {
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t img_y = (y * img_height) / fbinfo.framebuffer_height; // calculate Y with full precision
|
2021-08-16 19:02:28 +03:00
|
|
|
size_t off = img_pitch * (img_height - 1 - img_y);
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t canvas_off = fbinfo.framebuffer_width * y;
|
2021-07-11 08:28:09 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t ratio = int_to_fixedp6(img_width) / fbinfo.framebuffer_width;
|
2021-07-11 08:28:09 +03:00
|
|
|
fixedp6 img_x = ratio * xstart;
|
2021-08-16 19:02:28 +03:00
|
|
|
for (size_t x = xstart; x < xend; x++) {
|
2021-07-11 08:28:09 +03:00
|
|
|
uint32_t img_pixel = *(uint32_t*)(img + fixedp6_to_int(img_x) * colsize + off);
|
|
|
|
uint32_t i = blend(x, y, img_pixel);
|
2022-10-04 01:58:00 +03:00
|
|
|
bg_canvas[canvas_off + x] = i;
|
2021-07-11 08:28:09 +03:00
|
|
|
img_x += ratio;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-09-26 19:16:55 +03:00
|
|
|
|
2021-08-16 19:02:28 +03:00
|
|
|
static uint32_t blend_external(size_t x, size_t y, uint32_t orig) { (void)x; (void)y; return orig; }
|
|
|
|
static uint32_t blend_internal(size_t x, size_t y, uint32_t orig) { (void)x; (void)y; return colour_blend(default_bg, orig); }
|
|
|
|
static uint32_t blend_margin(size_t x, size_t y, uint32_t orig) { return blend_gradient_from_box(x, y, orig, default_bg); }
|
2021-07-11 08:28:09 +03:00
|
|
|
|
2021-08-16 19:02:28 +03:00
|
|
|
static void loop_external(size_t xstart, size_t xend, size_t ystart, size_t yend) { genloop(xstart, xend, ystart, yend, blend_external); }
|
|
|
|
static void loop_margin(size_t xstart, size_t xend, size_t ystart, size_t yend) { genloop(xstart, xend, ystart, yend, blend_margin); }
|
|
|
|
static void loop_internal(size_t xstart, size_t xend, size_t ystart, size_t yend) { genloop(xstart, xend, ystart, yend, blend_internal); }
|
2021-07-11 08:28:09 +03:00
|
|
|
|
2022-10-04 08:24:42 +03:00
|
|
|
static void generate_canvas(void) {
|
2021-03-02 08:05:14 +03:00
|
|
|
if (background) {
|
2022-10-04 01:58:00 +03:00
|
|
|
bg_canvas_size = fbinfo.framebuffer_width * fbinfo.framebuffer_height * sizeof(uint32_t);
|
|
|
|
bg_canvas = ext_mem_alloc(bg_canvas_size);
|
|
|
|
|
2022-03-07 13:46:25 +03:00
|
|
|
int64_t margin_no_gradient = (int64_t)margin - margin_gradient;
|
|
|
|
|
|
|
|
if (margin_no_gradient < 0) {
|
|
|
|
margin_no_gradient = 0;
|
|
|
|
}
|
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t scan_stop_x = fbinfo.framebuffer_width - margin_no_gradient;
|
|
|
|
size_t scan_stop_y = fbinfo.framebuffer_height - margin_no_gradient;
|
2021-10-12 17:38:24 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
loop_external(0, fbinfo.framebuffer_width, 0, margin_no_gradient);
|
|
|
|
loop_external(0, fbinfo.framebuffer_width, scan_stop_y, fbinfo.framebuffer_height);
|
2021-10-12 17:38:24 +03:00
|
|
|
loop_external(0, margin_no_gradient, margin_no_gradient, scan_stop_y);
|
2022-10-04 01:58:00 +03:00
|
|
|
loop_external(scan_stop_x, fbinfo.framebuffer_width, margin_no_gradient, scan_stop_y);
|
2021-07-11 08:28:09 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t gradient_stop_x = fbinfo.framebuffer_width - margin;
|
|
|
|
size_t gradient_stop_y = fbinfo.framebuffer_height - margin;
|
2021-07-11 08:28:09 +03:00
|
|
|
|
|
|
|
if (margin_gradient) {
|
2021-10-12 17:38:24 +03:00
|
|
|
loop_margin(margin_no_gradient, scan_stop_x, margin_no_gradient, margin);
|
|
|
|
loop_margin(margin_no_gradient, scan_stop_x, gradient_stop_y, scan_stop_y);
|
|
|
|
loop_margin(margin_no_gradient, margin, margin, gradient_stop_y);
|
|
|
|
loop_margin(gradient_stop_x, scan_stop_x, margin, gradient_stop_y);
|
2021-03-02 08:05:14 +03:00
|
|
|
}
|
2021-07-11 08:28:09 +03:00
|
|
|
|
2021-10-12 17:38:24 +03:00
|
|
|
loop_internal(margin, gradient_stop_x, margin, gradient_stop_y);
|
2022-10-04 08:24:42 +03:00
|
|
|
} else {
|
|
|
|
bg_canvas = NULL;
|
2021-09-26 19:16:55 +03:00
|
|
|
}
|
2021-03-02 08:05:14 +03:00
|
|
|
}
|
|
|
|
|
2022-03-02 20:51:32 +03:00
|
|
|
static bool last_serial = false;
|
2022-08-14 16:09:57 +03:00
|
|
|
static char *last_config = NULL;
|
2022-03-02 20:51:32 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
bool gterm_init(char *config, size_t width, size_t height) {
|
2022-10-04 09:21:59 +03:00
|
|
|
if (quiet) {
|
2022-10-05 16:01:01 +03:00
|
|
|
if (term != NULL) {
|
|
|
|
term->deinit(term, pmm_free);
|
|
|
|
term = NULL;
|
|
|
|
}
|
2022-10-04 02:37:19 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-10-06 06:29:13 +03:00
|
|
|
#if defined (UEFI)
|
|
|
|
if (serial || COM_OUTPUT) {
|
|
|
|
if (term != NULL) {
|
|
|
|
term->deinit(term, pmm_free);
|
|
|
|
term = NULL;
|
|
|
|
}
|
|
|
|
term_fallback();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2022-10-04 09:21:59 +03:00
|
|
|
if (term != NULL
|
|
|
|
&& term_backend == GTERM
|
2021-04-11 03:30:48 +03:00
|
|
|
&& fbinfo.default_res == true
|
|
|
|
&& width == 0
|
|
|
|
&& height == 0
|
|
|
|
&& fbinfo.framebuffer_bpp == 32
|
2022-08-14 16:09:57 +03:00
|
|
|
&& serial == last_serial
|
|
|
|
&& config == last_config) {
|
2022-10-04 01:58:00 +03:00
|
|
|
term->clear(term, true);
|
2021-04-11 03:30:48 +03:00
|
|
|
return true;
|
|
|
|
}
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2022-10-04 09:21:59 +03:00
|
|
|
if (term != NULL
|
|
|
|
&& term_backend == GTERM
|
2021-04-11 03:30:48 +03:00
|
|
|
&& fbinfo.framebuffer_width == width
|
|
|
|
&& fbinfo.framebuffer_height == height
|
|
|
|
&& fbinfo.framebuffer_bpp == 32
|
2022-08-14 16:09:57 +03:00
|
|
|
&& serial == last_serial
|
|
|
|
&& config == last_config) {
|
2022-10-04 01:58:00 +03:00
|
|
|
term->clear(term, true);
|
2021-04-11 03:30:48 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2022-10-04 08:24:42 +03:00
|
|
|
if (term != NULL) {
|
|
|
|
term->deinit(term, pmm_free);
|
|
|
|
term = NULL;
|
|
|
|
}
|
|
|
|
|
2021-03-02 08:05:14 +03:00
|
|
|
// We force bpp to 32
|
2022-10-04 08:24:42 +03:00
|
|
|
if (!fb_init(&fbinfo, width, height, 32)) {
|
2021-04-11 03:30:48 +03:00
|
|
|
return false;
|
2022-10-04 08:24:42 +03:00
|
|
|
}
|
2021-04-11 03:30:48 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
// Ensure this is xRGB8888, we only support that for the menu
|
|
|
|
if (fbinfo.red_mask_size != 8
|
|
|
|
|| fbinfo.red_mask_shift != 16
|
|
|
|
|| fbinfo.green_mask_size != 8
|
|
|
|
|| fbinfo.green_mask_shift != 8
|
|
|
|
|| fbinfo.blue_mask_size != 8
|
2022-10-04 08:24:42 +03:00
|
|
|
|| fbinfo.blue_mask_shift != 0) {
|
2022-10-04 01:58:00 +03:00
|
|
|
return false;
|
2022-10-04 08:24:42 +03:00
|
|
|
}
|
2022-03-02 20:51:32 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
last_serial = serial;
|
2022-10-04 06:39:48 +03:00
|
|
|
last_config = config;
|
2021-08-16 21:00:37 +03:00
|
|
|
|
2021-04-11 03:30:48 +03:00
|
|
|
// default scheme
|
2021-10-12 17:38:24 +03:00
|
|
|
margin = 64;
|
2021-07-07 05:50:32 +03:00
|
|
|
margin_gradient = 4;
|
2021-04-11 03:30:48 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
uint32_t ansi_colours[8];
|
|
|
|
|
2021-04-11 03:30:48 +03:00
|
|
|
ansi_colours[0] = 0x00000000; // black
|
|
|
|
ansi_colours[1] = 0x00aa0000; // red
|
|
|
|
ansi_colours[2] = 0x0000aa00; // green
|
|
|
|
ansi_colours[3] = 0x00aa5500; // brown
|
|
|
|
ansi_colours[4] = 0x000000aa; // blue
|
|
|
|
ansi_colours[5] = 0x00aa00aa; // magenta
|
|
|
|
ansi_colours[6] = 0x0000aaaa; // cyan
|
|
|
|
ansi_colours[7] = 0x00aaaaaa; // grey
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *colours = config_get_value(config, 0, "TERM_PALETTE");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (colours != NULL) {
|
|
|
|
const char *first = colours;
|
2021-08-16 19:02:28 +03:00
|
|
|
size_t i;
|
2022-03-22 06:09:29 +03:00
|
|
|
for (i = 0; i < 8; i++) {
|
2021-04-11 03:30:48 +03:00
|
|
|
const char *last;
|
|
|
|
uint32_t col = strtoui(first, &last, 16);
|
|
|
|
if (first == last)
|
|
|
|
break;
|
2022-03-22 06:09:29 +03:00
|
|
|
ansi_colours[i] = col & 0xffffff;
|
2021-04-11 03:30:48 +03:00
|
|
|
if (*last == 0)
|
|
|
|
break;
|
|
|
|
first = last + 1;
|
|
|
|
}
|
2021-08-01 00:51:48 +03:00
|
|
|
}
|
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
uint32_t ansi_bright_colours[8];
|
|
|
|
|
2021-08-01 00:51:48 +03:00
|
|
|
ansi_bright_colours[0] = 0x00555555; // black
|
|
|
|
ansi_bright_colours[1] = 0x00ff5555; // red
|
|
|
|
ansi_bright_colours[2] = 0x0055ff55; // green
|
|
|
|
ansi_bright_colours[3] = 0x00ffff55; // brown
|
|
|
|
ansi_bright_colours[4] = 0x005555ff; // blue
|
|
|
|
ansi_bright_colours[5] = 0x00ff55ff; // magenta
|
|
|
|
ansi_bright_colours[6] = 0x0055ffff; // cyan
|
|
|
|
ansi_bright_colours[7] = 0x00ffffff; // grey
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *bright_colours = config_get_value(config, 0, "TERM_PALETTE_BRIGHT");
|
2021-08-01 00:51:48 +03:00
|
|
|
if (bright_colours != NULL) {
|
|
|
|
const char *first = bright_colours;
|
2021-08-16 19:02:28 +03:00
|
|
|
size_t i;
|
2021-08-01 00:51:48 +03:00
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
const char *last;
|
|
|
|
uint32_t col = strtoui(first, &last, 16);
|
|
|
|
if (first == last)
|
|
|
|
break;
|
2021-09-28 00:43:25 +03:00
|
|
|
ansi_bright_colours[i] = col & 0xffffff;
|
2021-08-01 00:51:48 +03:00
|
|
|
if (*last == 0)
|
|
|
|
break;
|
|
|
|
first = last + 1;
|
2021-04-11 03:30:48 +03:00
|
|
|
}
|
|
|
|
}
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2022-03-22 06:09:29 +03:00
|
|
|
default_bg = 0x00000000; // background (black)
|
|
|
|
default_fg = 0x00aaaaaa; // foreground (grey)
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *theme_background = config_get_value(config, 0, "TERM_BACKGROUND");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (theme_background != NULL) {
|
2021-08-01 00:51:48 +03:00
|
|
|
default_bg = strtoui(theme_background, NULL, 16);
|
2021-04-11 03:30:48 +03:00
|
|
|
}
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *theme_foreground = config_get_value(config, 0, "TERM_FOREGROUND");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (theme_foreground != NULL) {
|
2021-09-28 00:43:25 +03:00
|
|
|
default_fg = strtoui(theme_foreground, NULL, 16) & 0xffffff;
|
2021-04-11 03:30:48 +03:00
|
|
|
}
|
|
|
|
|
2022-03-07 23:11:17 +03:00
|
|
|
background = NULL;
|
2022-08-14 16:09:57 +03:00
|
|
|
char *background_path = config_get_value(config, 0, "TERM_WALLPAPER");
|
2022-03-07 23:11:17 +03:00
|
|
|
if (background_path != NULL) {
|
|
|
|
struct file_handle *bg_file;
|
|
|
|
if ((bg_file = uri_open(background_path)) != NULL) {
|
|
|
|
background = image_open(bg_file);
|
|
|
|
fclose(bg_file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (background == NULL) {
|
|
|
|
margin = 0;
|
|
|
|
margin_gradient = 0;
|
2022-03-30 04:19:05 +03:00
|
|
|
} else {
|
|
|
|
if (theme_background == NULL) {
|
2022-09-04 04:57:32 +03:00
|
|
|
default_bg = 0x80000000;
|
2022-03-30 04:19:05 +03:00
|
|
|
}
|
2022-03-07 23:11:17 +03:00
|
|
|
}
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *theme_margin = config_get_value(config, 0, "TERM_MARGIN");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (theme_margin != NULL) {
|
|
|
|
margin = strtoui(theme_margin, NULL, 10);
|
|
|
|
}
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *theme_margin_gradient = config_get_value(config, 0, "TERM_MARGIN_GRADIENT");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (theme_margin_gradient != NULL) {
|
|
|
|
margin_gradient = strtoui(theme_margin_gradient, NULL, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (background != NULL) {
|
2022-08-14 16:09:57 +03:00
|
|
|
char *background_layout = config_get_value(config, 0, "TERM_WALLPAPER_STYLE");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (background_layout != NULL && strcmp(background_layout, "centered") == 0) {
|
2022-08-14 16:09:57 +03:00
|
|
|
char *background_colour = config_get_value(config, 0, "TERM_BACKDROP");
|
2021-04-11 03:30:48 +03:00
|
|
|
if (background_colour == NULL)
|
|
|
|
background_colour = "0";
|
|
|
|
uint32_t bg_col = strtoui(background_colour, NULL, 16);
|
|
|
|
image_make_centered(background, fbinfo.framebuffer_width, fbinfo.framebuffer_height, bg_col);
|
2022-03-22 06:09:29 +03:00
|
|
|
} else if (background_layout != NULL && strcmp(background_layout, "tiled") == 0) {
|
|
|
|
} else {
|
2021-07-07 03:46:40 +03:00
|
|
|
image_make_stretched(background, fbinfo.framebuffer_width, fbinfo.framebuffer_height);
|
2021-04-11 03:30:48 +03:00
|
|
|
}
|
|
|
|
}
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t font_width = 8;
|
|
|
|
size_t font_height = 16;
|
|
|
|
size_t font_size = (font_width * font_height * FBTERM_FONT_GLYPHS) / 8;
|
2021-08-20 20:25:42 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
#define FONT_MAX 16384
|
|
|
|
uint8_t *font = ext_mem_alloc(FONT_MAX);
|
2021-08-20 23:18:15 +03:00
|
|
|
|
2022-10-04 07:04:31 +03:00
|
|
|
memcpy(font, builtin_font, 4096);
|
2021-08-20 23:18:15 +03:00
|
|
|
|
|
|
|
size_t tmp_font_width, tmp_font_height;
|
2021-08-20 20:25:42 +03:00
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *menu_font_size = config_get_value(config, 0, "TERM_FONT_SIZE");
|
2021-08-18 22:02:03 +03:00
|
|
|
if (menu_font_size != NULL) {
|
2021-08-20 23:18:15 +03:00
|
|
|
parse_resolution(&tmp_font_width, &tmp_font_height, NULL, menu_font_size);
|
2021-03-10 07:08:37 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t tmp_font_size = (tmp_font_width * tmp_font_height * FBTERM_FONT_GLYPHS) / 8;
|
2021-03-04 12:13:02 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
if (tmp_font_size > FONT_MAX) {
|
|
|
|
print("Font would be too large (%u bytes, %u bytes allowed). Not loading.\n", tmp_font_size, FONT_MAX);
|
2021-08-20 23:18:15 +03:00
|
|
|
goto no_load_font;
|
|
|
|
}
|
2021-08-18 15:06:55 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
font_size = tmp_font_size;
|
2021-08-18 15:06:55 +03:00
|
|
|
}
|
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *menu_font = config_get_value(config, 0, "TERM_FONT");
|
2021-03-02 08:05:14 +03:00
|
|
|
if (menu_font != NULL) {
|
2021-10-21 02:27:05 +03:00
|
|
|
struct file_handle *f;
|
|
|
|
if ((f = uri_open(menu_font)) == NULL) {
|
2021-03-02 08:05:14 +03:00
|
|
|
print("menu: Could not open font file.\n");
|
|
|
|
} else {
|
2022-10-04 01:58:00 +03:00
|
|
|
fread(f, font, 0, font_size);
|
2021-10-21 02:27:05 +03:00
|
|
|
if (menu_font_size != NULL) {
|
2022-10-04 01:58:00 +03:00
|
|
|
font_width = tmp_font_width;
|
|
|
|
font_height = tmp_font_height;
|
2021-08-20 20:25:42 +03:00
|
|
|
}
|
2021-10-21 02:27:05 +03:00
|
|
|
fclose(f);
|
2021-07-11 09:30:54 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-20 23:18:15 +03:00
|
|
|
no_load_font:;
|
2021-08-20 20:25:42 +03:00
|
|
|
size_t font_spacing = 1;
|
2022-08-14 16:09:57 +03:00
|
|
|
char *font_spacing_str = config_get_value(config, 0, "TERM_FONT_SPACING");
|
2021-08-20 20:25:42 +03:00
|
|
|
if (font_spacing_str != NULL) {
|
|
|
|
font_spacing = strtoui(font_spacing_str, NULL, 10);
|
|
|
|
}
|
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
size_t font_scale_x = 1;
|
|
|
|
size_t font_scale_y = 1;
|
2021-08-20 23:18:15 +03:00
|
|
|
|
2022-08-14 16:09:57 +03:00
|
|
|
char *menu_font_scale = config_get_value(config, 0, "TERM_FONT_SCALE");
|
2021-08-18 15:49:25 +03:00
|
|
|
if (menu_font_scale != NULL) {
|
2022-10-04 01:58:00 +03:00
|
|
|
parse_resolution(&font_scale_x, &font_scale_y, NULL, menu_font_scale);
|
|
|
|
if (font_scale_x > 8 || font_scale_y > 8) {
|
|
|
|
font_scale_x = 1;
|
|
|
|
font_scale_y = 1;
|
2021-08-18 15:49:25 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-04 08:24:42 +03:00
|
|
|
generate_canvas();
|
2021-10-14 16:36:53 +03:00
|
|
|
|
2022-10-04 01:58:00 +03:00
|
|
|
term = fbterm_init(ext_mem_alloc,
|
|
|
|
(void *)(uintptr_t)fbinfo.framebuffer_addr,
|
|
|
|
fbinfo.framebuffer_width, fbinfo.framebuffer_height, fbinfo.framebuffer_pitch,
|
2022-10-04 08:24:42 +03:00
|
|
|
bg_canvas,
|
2022-10-04 01:58:00 +03:00
|
|
|
ansi_colours, ansi_bright_colours,
|
|
|
|
&default_bg, &default_fg,
|
|
|
|
font, font_width, font_height, font_spacing,
|
|
|
|
font_scale_x, font_scale_y,
|
|
|
|
margin);
|
2021-03-02 08:05:14 +03:00
|
|
|
|
2022-10-04 07:04:31 +03:00
|
|
|
pmm_free(font, FONT_MAX);
|
2022-10-04 08:24:42 +03:00
|
|
|
if (bg_canvas != NULL) {
|
|
|
|
pmm_free(bg_canvas, bg_canvas_size);
|
|
|
|
}
|
2022-10-04 07:04:31 +03:00
|
|
|
|
2022-10-06 04:24:54 +03:00
|
|
|
if (term == NULL) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-10-04 02:37:19 +03:00
|
|
|
if (serial) {
|
|
|
|
term->cols = term->cols > 80 ? 80 : term->cols;
|
|
|
|
term->rows = term->rows > 24 ? 24 : term->rows;
|
|
|
|
}
|
|
|
|
|
2022-10-04 06:39:48 +03:00
|
|
|
term->in_bootloader = true;
|
|
|
|
|
2022-10-04 02:37:19 +03:00
|
|
|
term_context_reinit(term);
|
2022-10-04 06:39:48 +03:00
|
|
|
term->full_refresh(term);
|
2022-10-04 02:37:19 +03:00
|
|
|
|
2022-10-04 06:39:48 +03:00
|
|
|
term_backend = GTERM;
|
2022-10-04 02:37:19 +03:00
|
|
|
|
2021-03-02 08:05:14 +03:00
|
|
|
return true;
|
|
|
|
}
|