diff --git a/src/kernel/FbTty.cpp b/src/kernel/FbTty.cpp index 5f951ec62..b7294f953 100644 --- a/src/kernel/FbTty.cpp +++ b/src/kernel/FbTty.cpp @@ -10,6 +10,10 @@ FbTty::FbTty(Framebuffer *fb) : _fb(fb) { _max_col = _fb->dimensions().x / 8; _max_row = _fb->dimensions().y / 16; + _buf.resize(_max_col); + for (auto &b: _buf) { + b.resize(_max_row); + } } void FbTty::putchar(char c) { if (c == '\n') { diff --git a/src/kernel/FbTty.hpp b/src/kernel/FbTty.hpp index 617a65736..4c3fee1a5 100644 --- a/src/kernel/FbTty.hpp +++ b/src/kernel/FbTty.hpp @@ -4,9 +4,10 @@ #ifndef FBTTY_HPP #define FBTTY_HPP + #include #include - +#include class Framebuffer; class FbTty : public Tty { @@ -27,6 +28,8 @@ private: int _max_row = 0; int _max_col = 0; + Vector> _buf; + void next_col(); void next_row(); diff --git a/src/kernel/templates/Vector.hpp b/src/kernel/templates/Vector.hpp index b7a0338ba..3a261bf32 100644 --- a/src/kernel/templates/Vector.hpp +++ b/src/kernel/templates/Vector.hpp @@ -146,6 +146,34 @@ public: return out; } + void resize(size_t size) { + if (size == _cur_size) return; + + if (size < _cur_size) { + for (int i = size; i < _cur_size; i++) { + if constexpr (!std::is_trivially_destructible::value) + std::destroy_at(_data + i); + } + _cur_size = size; + compact(); + return; + } + + if (size > _cur_size) { + if (_capacity < size) { + _capacity = size; + _data = (T *) krealloc(reinterpret_cast(_data), _capacity * sizeof(T)); + } + for (int i = size; i < _cur_size; i++) { + if constexpr (!std::is_trivially_constructible::value) + new (_data + i) T(); + else + memset((char *) (_data + i), 0, sizeof(T)); + } + return; + } + } + T *data() { return _data; } const T *data() const { return _data; }