#include #include #include #include gfx_context kernel_fb; gfx_context *term_fb; static int setup = 0; void fbterm_movecursor(unsigned int cursor) { (void) cursor; } void fbterm_flush(struct vga_cell *buffer) { if(!setup) return; int i = 0; for(int row = 0; row < VGA_ROWS; row++) { for(int col=0; col < VGA_COLS; col++) { putCharacter(term_fb, col*8, row*16, 0xebdbb2, 0x282828, (char)buffer[i++].c); } } flip(term_fb); } void fbterm_init(struct fbinfo *fbinfo) { kernel_fb.width = fbinfo->framebuffer_width; kernel_fb.height = fbinfo->framebuffer_height; kernel_fb.bpp = fbinfo->framebuffer_bpp/8; kernel_fb.pitch = fbinfo->framebuffer_pitch/kernel_fb.bpp; kernel_fb.addr = P2V(fbinfo->framebuffer_addr); kernel_fb.size = fbinfo->framebuffer_pitch * (kernel_fb.height); kernel_fb.buffer = calloc(1, kernel_fb.size); for( uintptr_t p = (uintptr_t)kernel_fb.addr; p < ((uintptr_t)kernel_fb.addr + kernel_fb.size); p += PAGE_SIZE ) { vmm_set_page(kernel_P4, p, V2P(p), PAGE_GLOBAL | PAGE_WRITE | PAGE_PRESENT); } draw_rect(&kernel_fb, 20, 20, 8*VGA_COLS+8, 16*VGA_ROWS+8, RGB(255, 0, 0)); flip(&kernel_fb); term_fb = framebuffer_make_subcontext(&kernel_fb, 24, 24, 8*VGA_COLS, 16*VGA_ROWS); flip(term_fb); setup = 1; draw_line(&kernel_fb, 750, 850, 120, 120, RGB(255,0,0)); draw_line(&kernel_fb, 750, 750, 120, 220, RGB(0,255,0)); draw_line(&kernel_fb, 750, 850, 120, 220, RGB(0,0,255)); draw_line(&kernel_fb, 750, 800, 120, 220, RGB(255,0,255)); draw_line(&kernel_fb, 750, 850, 120, 170, RGB(255,255,0)); flip(&kernel_fb); }