4 #include <std/common.h> 7 typedef void (*event_handler)(
void* obj,
void* context);
12 #include <gfx/font/font.h> 14 #include <kernel/drivers/vbe/vbe.h> 17 unsigned short di, si, bp, sp, bx, dx, cx, ax;
18 unsigned short gs, fs, es, ds, eflags;
28 volatile int finished_drawing;
30 Size default_font_size;
38 extern void int32(
unsigned char intnum, regs16_t* regs);
40 Screen* screen_create(
Size dimensions, uint32_t* physbase, uint8_t depth);
42 void gfx_teardown(
Screen* screen);
43 void vga_boot_screen(
Screen* screen);
48 void write_screen(
Screen* screen);
50 void write_screen_region(
Rect region);
52 void draw_boot_background();
53 void display_boot_screen();
55 void gfx_init(
void* mboot_ptr);
56 void process_gfx_switch(
Screen* screen,
int new_depth);
57 void set_gfx_depth(uint32_t depth);
62 Vec2d vec2d(
double x,
float y);
65 inline void putpixel(ca_layer* layer,
int x,
int y,
Color color) {
69 int depth = gfx_depth();
71 bool write_directly = !(layer);
72 int offset = (x * bpp) + (y * layer->size.width * bpp);
75 if (depth == 4 || write_directly) {
76 offset = (x * bpp) + (y * gfx_screen()->resolution.width * bpp);
78 int bank = offset / BANK_SIZE;
79 int bank_offset = offset % BANK_SIZE;
82 uint8_t* vmem = (uint8_t*)VBE_DISPI_LFB_PHYSICAL_ADDRESS;
85 vmem[bank_offset] = 3;
87 else if (write_directly) {
88 vmem[bank_offset + 0] = color.val[0];
89 vmem[bank_offset + 1] = color.val[1];
90 vmem[bank_offset + 2] = color.val[2];
95 for (
int i = 0; i < MIN(3, bpp); i++) {
98 layer->raw[offset + i] = color.val[bpp - 1 - i];
102 inline void addpixel(ca_layer* layer,
int x,
int y,
Color color) {
104 if (x < 0 || y < 0 || x >= layer->size.width || y >= layer->size.height)
return;
107 int offset = (x * bpp) + (y * layer->size.width * bpp);
108 for (
int i = 0; i < bpp; i++) {
110 layer->raw[offset + i] += color.val[bpp - 1 - i];