diff options
Diffstat (limited to 'applications/goldman/source/renderer.hpp')
-rw-r--r-- | applications/goldman/source/renderer.hpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/applications/goldman/source/renderer.hpp b/applications/goldman/source/renderer.hpp new file mode 100644 index 0000000..14a5964 --- /dev/null +++ b/applications/goldman/source/renderer.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include <daguerre/image.hpp> +#include "window.hpp" +#include <mutex> +#include <list> + +class renderer { + + daguerre::image<daguerre::hilbert_color> framebuffer; + daguerre::image<daguerre::hilbert_color> double_buffer; + + daguerre::image<daguerre::hilbert_color> background; + daguerre::image<daguerre::hilbert_color> cursor; + daguerre::hilbert_color cursor_background; + + int cursor_x; + int cursor_y; + + //bottom to top + std::list<const window *> windows; + + std::mutex mut; + + euler::syscall::stream_handle + dispatcher_handle_1, dispatcher_handle_2; + + void do_render(); + +public: + renderer( + daguerre::image<daguerre::hilbert_color> &&framebuffer, + daguerre::image<daguerre::hilbert_color> &&background, + daguerre::hilbert_color background_color, + daguerre::image<daguerre::hilbert_color> &&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); + +}; |