Offscreen painting

This commit is contained in:
Baptiste Wicht 2016-09-24 18:07:58 +02:00
parent 7ed2ef6d31
commit 2c08bee567
7 changed files with 76 additions and 20 deletions

View File

@ -19,6 +19,8 @@ namespace stdio {
void init_console(); void init_console();
struct console { struct console {
void init();
size_t get_columns() const ; size_t get_columns() const ;
size_t get_rows() const ; size_t get_rows() const ;
@ -26,16 +28,18 @@ struct console {
void wipeout(); void wipeout();
void set_active(bool active);
void save(); void save();
void restore(); void restore();
private: private:
void next_line(); void next_line();
size_t current_line = 0; size_t current_line = 0;
size_t current_column = 0; size_t current_column = 0;
void* buffer; void* buffer = nullptr;
bool active = false;
}; };
} // end of namespace stdio } // end of namespace stdio

View File

@ -83,9 +83,6 @@ struct virtual_terminal {
void set_active(bool); void set_active(bool);
void save();
void restore();
console& get_console(); console& get_console();
size_t id; size_t id;

View File

@ -12,11 +12,19 @@
struct vesa_console { struct vesa_console {
void init(); void init();
size_t lines();
size_t columns(); size_t lines() const ;
size_t columns() const ;
void clear(); void clear();
void clear(void* buffer);
void scroll_up(); void scroll_up();
void scroll_up(void* buffer);
void print_char(size_t line, size_t column, char c); void print_char(size_t line, size_t column, char c);
void print_char(void* buffer, size_t line, size_t column, char c);
void* save(void* buffer); void* save(void* buffer);
void restore(void* buffer); void restore(void* buffer);
}; };

View File

@ -35,6 +35,12 @@ void stdio::init_console(){
} }
} }
void stdio::console::init(){
if(!text){
buffer = vesa::create_buffer();
}
}
size_t stdio::console::get_rows() const { size_t stdio::console::get_rows() const {
if(text){ if(text){
return t_console.lines(); return t_console.lines();
@ -67,7 +73,11 @@ void stdio::console::print(char key){
if(text){ if(text){
t_console.print_char(current_line, current_column, key); t_console.print_char(current_line, current_column, key);
} else { } else {
v_console.print_char(current_line, current_column, key); if(active){
v_console.print_char(current_line, current_column, key);
} else {
v_console.print_char(buffer, current_line, current_column, key);
}
} }
++current_column; ++current_column;
@ -82,7 +92,11 @@ void stdio::console::wipeout(){
if(text){ if(text){
t_console.clear(); t_console.clear();
} else { } else {
v_console.clear(); if(active){
v_console.clear();
} else {
v_console.clear(buffer);
}
} }
current_line = 0; current_line = 0;
@ -101,6 +115,10 @@ void stdio::console::restore(){
v_console.restore(buffer); v_console.restore(buffer);
} }
void stdio::console::set_active(bool active){
this->active = active;
}
void stdio::console::next_line(){ void stdio::console::next_line(){
++current_line; ++current_line;
@ -108,7 +126,11 @@ void stdio::console::next_line(){
if(text){ if(text){
t_console.scroll_up(); t_console.scroll_up();
} else { } else {
v_console.scroll_up(); if(active){
v_console.scroll_up();
} else {
v_console.scroll_up(buffer);
}
} }
--current_line; --current_line;

View File

@ -136,8 +136,11 @@ void stdio::init_terminals(){
terminal.mouse = false; terminal.mouse = false;
} }
// Initialize the active terminal
active_terminal = 0; active_terminal = 0;
terminals[active_terminal].active = true; terminals[active_terminal].active = true;
terminals[active_terminal].get_console().set_active(true);
} }
void stdio::register_devices(){ void stdio::register_devices(){
@ -162,7 +165,7 @@ void stdio::finalize(){
terminal.input_thread_pid = input_process.pid; terminal.input_thread_pid = input_process.pid;
// Save the initial image of the terminal // Save the initial image of the terminal
terminal.save(); terminal.get_console().save();
} }
} }
@ -184,8 +187,9 @@ void stdio::switch_terminal(size_t id){
if(active_terminal != id){ if(active_terminal != id){
logging::logf(logging::log_level::TRACE, "stdio: Switch activate virtual terminal %u\n", id); logging::logf(logging::log_level::TRACE, "stdio: Switch activate virtual terminal %u\n", id);
terminals[active_terminal].save(); // Effectively switch the terminal
terminals[id].restore(); terminals[active_terminal].set_active(false);
terminals[id].set_active(true);
active_terminal = id; active_terminal = id;
} }

View File

@ -130,12 +130,20 @@ bool stdio::virtual_terminal::is_canonical() const {
return canonical; return canonical;
} }
void stdio::virtual_terminal::save(){ void stdio::virtual_terminal::set_active(bool active){
cons.save(); if(this->active == active){
} return;
}
void stdio::virtual_terminal::restore(){ this->active = active;
cons.restore();
cons.set_active(active);
if(active){
cons.restore();
} else {
cons.save();
}
} }
stdio::console& stdio::virtual_terminal::get_console(){ stdio::console& stdio::virtual_terminal::get_console(){

View File

@ -47,11 +47,11 @@ void vesa_console::init() {
vesa::draw_char(title_left + 24, PADDING + MARGIN, 'R', _color); vesa::draw_char(title_left + 24, PADDING + MARGIN, 'R', _color);
} }
size_t vesa_console::lines() { size_t vesa_console::lines() const {
return _lines; return _lines;
} }
size_t vesa_console::columns() { size_t vesa_console::columns() const {
return _columns; return _columns;
} }
@ -59,15 +59,28 @@ void vesa_console::clear() {
vesa::draw_rect(LEFT, TOP, _columns * 8, _lines * 16, vesa::make_color(0, 0, 0)); vesa::draw_rect(LEFT, TOP, _columns * 8, _lines * 16, vesa::make_color(0, 0, 0));
} }
void vesa_console::clear(void* buffer) {
vesa::draw_rect(buffer, LEFT, TOP, _columns * 8, _lines * 16, vesa::make_color(0, 0, 0));
}
void vesa_console::scroll_up() { void vesa_console::scroll_up() {
vesa::move_lines_up(TOP + 16, LEFT, _columns * 8, (_lines - 1) * 16, 16); vesa::move_lines_up(TOP + 16, LEFT, _columns * 8, (_lines - 1) * 16, 16);
vesa::draw_rect(LEFT, TOP + (_lines - 1) * 16, _columns * 8, 16, vesa::make_color(0, 0, 0)); vesa::draw_rect(LEFT, TOP + (_lines - 1) * 16, _columns * 8, 16, vesa::make_color(0, 0, 0));
} }
void vesa_console::scroll_up(void* buffer) {
vesa::move_lines_up(buffer, TOP + 16, LEFT, _columns * 8, (_lines - 1) * 16, 16);
vesa::draw_rect(buffer, LEFT, TOP + (_lines - 1) * 16, _columns * 8, 16, vesa::make_color(0, 0, 0));
}
void vesa_console::print_char(size_t line, size_t column, char c) { void vesa_console::print_char(size_t line, size_t column, char c) {
vesa::draw_char(LEFT + 8 * column, TOP + 16 * line, c, _color); vesa::draw_char(LEFT + 8 * column, TOP + 16 * line, c, _color);
} }
void vesa_console::print_char(void* buffer, size_t line, size_t column, char c) {
vesa::draw_char(buffer, LEFT + 8 * column, TOP + 16 * line, c, _color);
}
void* vesa_console::save(void* buffer) { void* vesa_console::save(void* buffer) {
void* buffer32 = static_cast<uint32_t*>(buffer); void* buffer32 = static_cast<uint32_t*>(buffer);
if (!buffer32) { if (!buffer32) {