#pragma once #include #include "window.hpp" #include #include class renderer { daguerre::image framebuffer; daguerre::image double_buffer; daguerre::image background; daguerre::image cursor; daguerre::hilbert_color cursor_background; int cursor_x; int cursor_y; //bottom to top std::list windows; std::mutex mut; euler::syscall::stream_handle dispatcher_handle_1, dispatcher_handle_2; void do_render(); public: renderer( daguerre::image &&framebuffer, daguerre::image &&background, daguerre::hilbert_color background_color, daguerre::image &&cursor, daguerre::hilbert_color cursor_background); inline ~renderer() { euler::syscall::close_stream(dispatcher_handle_1); euler::syscall::close_stream(dispatcher_handle_2); } renderer(const renderer &) = delete; renderer &operator =(const renderer &) = delete; [[noreturn]] void render_thread_main(); inline void lock() { mut.lock(); } inline void unlock() { mut.unlock(); } inline void dispatch_render() { uint8_t byte = 0; euler::syscall::write_to_stream(dispatcher_handle_1, 1, &byte); } void bump_cursor(int x_offset, int y_offset); void add_window(const window *w); void remove_window(const window *w); };