Serenity Operating System
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}