Serenity Operating System
at master 81 lines 2.2 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/AtomicRefCounted.h> 10#include <AK/Types.h> 11#include <Kernel/Graphics/GenericGraphicsAdapter.h> 12 13namespace Kernel::Graphics { 14 15class Console : public AtomicRefCounted<Console> { 16public: 17 // Stanadard VGA text mode colors 18 enum Color : u8 { 19 Black = 0, 20 Blue, 21 Green, 22 Cyan, 23 Red, 24 Magenta, 25 Brown, 26 LightGray, 27 DarkGray, 28 BrightBlue, 29 BrightGreen, 30 BrightCyan, 31 BrightRed, 32 BrightMagenta, 33 Yellow, 34 White, 35 }; 36 37public: 38 size_t width() const { return m_width; } 39 size_t height() const { return m_height; } 40 size_t pitch() const { return bytes_per_base_glyph() * width(); } 41 virtual size_t max_column() const { return m_width; } 42 virtual size_t max_row() const { return m_height; } 43 virtual size_t bytes_per_base_glyph() const = 0; 44 virtual size_t chars_per_line() const = 0; 45 46 virtual void enable() = 0; 47 virtual void disable() = 0; 48 49 virtual bool is_hardware_paged_capable() const = 0; 50 virtual bool has_hardware_cursor() const = 0; 51 52 virtual void set_cursor(size_t x, size_t y) = 0; 53 54 virtual void clear(size_t x, size_t y, size_t length) = 0; 55 virtual void write(size_t x, size_t y, char ch, Color background, Color foreground, bool critical = false) = 0; 56 virtual void write(size_t x, size_t y, char ch, bool critical = false) = 0; 57 virtual void write(char ch, bool critical = false) = 0; 58 virtual void flush(size_t x, size_t y, size_t width, size_t height) = 0; 59 60 virtual ~Console() = default; 61 62protected: 63 virtual void hide_cursor() = 0; 64 virtual void show_cursor() = 0; 65 66 Console(size_t width, size_t height) 67 : m_width(width) 68 , m_height(height) 69 { 70 m_enabled.store(true); 71 } 72 73 Atomic<bool> m_enabled; 74 Color m_default_foreground_color { Color::White }; 75 Color m_default_background_color { Color::Black }; 76 size_t m_width; 77 size_t m_height; 78 mutable size_t m_x { 0 }; 79 mutable size_t m_y { 0 }; 80}; 81}