Serenity Operating System
at master 87 lines 2.7 kB view raw
1/* 2 * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Types.h> 10#include <Kernel/Graphics/Console/Console.h> 11#include <Kernel/PhysicalAddress.h> 12 13namespace Kernel::Graphics { 14 15class GenericFramebufferConsoleImpl : public Console { 16public: 17 virtual size_t bytes_per_base_glyph() const override; 18 virtual size_t chars_per_line() const override; 19 20 virtual size_t max_column() const override { return m_width / (m_glyph_columns + m_glyph_spacing); } 21 virtual size_t max_row() const override { return m_height / m_glyph_rows; } 22 23 virtual bool is_hardware_paged_capable() const override { return false; } 24 virtual bool has_hardware_cursor() const override { return false; } 25 26 virtual void set_cursor(size_t x, size_t y) override; 27 28 virtual void clear(size_t x, size_t y, size_t length) override; 29 virtual void write(size_t x, size_t y, char ch, Color background, Color foreground, bool critical = false) override; 30 virtual void write(size_t x, size_t y, char ch, bool critical = false) override; 31 virtual void write(char ch, bool critical = false) override; 32 33 virtual void enable() override; 34 virtual void disable() override; 35 36 virtual void set_resolution(size_t width, size_t height, size_t pitch) = 0; 37 38protected: 39 virtual void hide_cursor() override; 40 virtual void show_cursor() override; 41 42 GenericFramebufferConsoleImpl(size_t width, size_t height, size_t pitch) 43 : Console(width, height) 44 , m_pitch(pitch) 45 { 46 m_cursor_overriden_pixels.fill(0); 47 } 48 virtual u8* framebuffer_data() = 0; 49 size_t framebuffer_pitch() const { return m_pitch; } 50 virtual void clear_glyph(size_t x, size_t y); 51 52 union FramebufferOffset { 53 u8* bytes; 54 u32* pixels; 55 }; 56 FramebufferOffset framebuffer_offset(size_t x, size_t y); 57 void flush_glyph(size_t x, size_t y); 58 59 size_t const m_glyph_spacing { 1 }; 60 size_t const m_glyph_columns { 8 }; 61 size_t const m_glyph_rows { 16 }; 62 63 Array<u32, 8> m_cursor_overriden_pixels; 64 65 size_t m_pitch; 66}; 67 68class GenericFramebufferConsole : public GenericFramebufferConsoleImpl { 69public: 70 virtual void clear(size_t x, size_t y, size_t length) override; 71 virtual void write(size_t x, size_t y, char ch, Color background, Color foreground, bool critical = false) override; 72 73 virtual void enable() override; 74 virtual void disable() override; 75 76protected: 77 GenericFramebufferConsole(size_t width, size_t height, size_t pitch) 78 : GenericFramebufferConsoleImpl(width, height, pitch) 79 { 80 } 81 82 virtual void clear_glyph(size_t x, size_t y) override; 83 84 mutable Spinlock<LockRank::None> m_lock {}; 85}; 86 87}