fixed output not found
This commit is contained in:
17
src/output.cc
Normal file
17
src/output.cc
Normal file
@ -0,0 +1,17 @@
|
||||
#include "output.h"
|
||||
|
||||
#include "constants.h"
|
||||
|
||||
output::output():
|
||||
contents{DISPLAY_BUFFER_SIZE, 0} {
|
||||
for (int i = 0; i < DISPLAY_BUFFER_SIZE; ++i)
|
||||
contents.push_back(0);
|
||||
}
|
||||
|
||||
void output::clear() {
|
||||
contents.clear();
|
||||
contents.reserve(DISPLAY_BUFFER_SIZE);
|
||||
|
||||
for (int i = 0; i < DISPLAY_BUFFER_SIZE; ++i)
|
||||
contents.push_back(0);
|
||||
}
|
35
src/output.h
Normal file
35
src/output.h
Normal file
@ -0,0 +1,35 @@
|
||||
#ifndef __DISPLAY_H__
|
||||
#define __DISPLAY_H__
|
||||
|
||||
#include <ncurses.h>
|
||||
#include <vector>
|
||||
#include "position.h"
|
||||
#include "cursor.h"
|
||||
|
||||
class output {
|
||||
protected:
|
||||
// use an array of ints to keep track of what's on the screen
|
||||
// This will have a bit of buffer for the last line
|
||||
// just in case it overflows
|
||||
std::vector<int> contents;
|
||||
public:
|
||||
output();
|
||||
|
||||
virtual ~output() = default;
|
||||
|
||||
// Only call this to refresh the entire output
|
||||
virtual void render() = 0;
|
||||
|
||||
// Clears the contents buffer
|
||||
virtual void clear();
|
||||
|
||||
virtual void print_char(const position &pos, const char ch,
|
||||
const int attrs =
|
||||
A_NORMAL | COLOR_PAIR(COLOR_WHITE)) = 0;
|
||||
virtual void print_str(const position &pos, const std::string &str,
|
||||
const int attrs =
|
||||
A_NORMAL | COLOR_PAIR(COLOR_WHITE)) = 0;
|
||||
// default arguments are to be set in the base class's declaration
|
||||
};
|
||||
|
||||
#endif
|
100
src/output/console_output.cc
Normal file
100
src/output/console_output.cc
Normal file
@ -0,0 +1,100 @@
|
||||
#include "console_output.h"
|
||||
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <ncurses.h>
|
||||
|
||||
#include "../constants.h"
|
||||
|
||||
console_output::console_output(std::ostream &cout): out{cout} {}
|
||||
|
||||
/* Attributes
|
||||
black 30 40
|
||||
red 31 41
|
||||
green 32 42
|
||||
yellow 33 43
|
||||
blue 34 44
|
||||
magenta 35 45
|
||||
cyan 36 46
|
||||
white 37 47
|
||||
reset 0 (everything back to normal)
|
||||
bold/bright 1 (often a brighter shade of the same colour)
|
||||
underline 4
|
||||
inverse 7 (swap foreground and background colours)
|
||||
bold/bright off 21
|
||||
underline off 24
|
||||
inverse off 27
|
||||
|
||||
Format:
|
||||
\033[X;Ym
|
||||
X Y are numbers from above
|
||||
*/
|
||||
|
||||
std::string console_output::get_code(const int attrs) {
|
||||
if (attrs < 255)
|
||||
return "\033[0m";
|
||||
|
||||
std::string result = "\033[0m\033[";
|
||||
|
||||
if (attrs & A_BOLD)
|
||||
result += "1;";
|
||||
|
||||
if (attrs & A_UNDERLINE)
|
||||
result += "4;";
|
||||
|
||||
if (attrs & A_STANDOUT)
|
||||
result += "7;";
|
||||
|
||||
if ((attrs & COLOR_PAIR(COLOR_WHITE)) == COLOR_PAIR(COLOR_WHITE))
|
||||
result += "37;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_CYAN)) == COLOR_PAIR(COLOR_CYAN))
|
||||
result += "36;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_MAGENTA)) == COLOR_PAIR(COLOR_MAGENTA))
|
||||
result += "35;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_BLUE)) == COLOR_PAIR(COLOR_BLUE))
|
||||
result += "34;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_YELLOW)) == COLOR_PAIR(COLOR_YELLOW))
|
||||
result += "33;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_RED)) == COLOR_PAIR(COLOR_RED))
|
||||
result += "31;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_GREEN)) == COLOR_PAIR(COLOR_GREEN))
|
||||
result += "32;";
|
||||
else if ((attrs & COLOR_PAIR(COLOR_BLACK_ON_WHITE)) == COLOR_BLACK_ON_WHITE)
|
||||
result += "30;47;";
|
||||
|
||||
result[result.length() - 1] = 'm';
|
||||
return result;
|
||||
}
|
||||
|
||||
void console_output::render() {
|
||||
out << "\x1B[2J\x1B[H";
|
||||
|
||||
for (std::size_t idx = 0; idx < contents.size(); ++idx) {
|
||||
if (idx % DISPLAY_WIDTH == 0 && idx)
|
||||
out << std::endl;
|
||||
|
||||
out << get_code(contents[idx])
|
||||
<< (char)(contents[idx] ? contents[idx] : ' ');
|
||||
}
|
||||
|
||||
out << std::endl;
|
||||
}
|
||||
|
||||
void console_output::print_char(const position &pos, const char ch,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
contents[pos.y * DISPLAY_WIDTH + pos.x] = attrs | ch;
|
||||
}
|
||||
|
||||
void console_output::print_str(const position &pos, const std::string &str,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
int head = pos.y * DISPLAY_WIDTH + pos.x;
|
||||
|
||||
for (std::size_t i = 0; i < str.length(); ++i)
|
||||
contents[i + head] = attrs | str[i];
|
||||
}
|
21
src/output/console_output.h
Normal file
21
src/output/console_output.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef __CONSOLE_OUTPUT_H__
|
||||
#define __CONSOLE_OUTPUT_H__
|
||||
|
||||
#include <iostream>
|
||||
#include "../output.h"
|
||||
|
||||
class console_output final : public output {
|
||||
private:
|
||||
std::ostream &out;
|
||||
std::string get_code(const int attrs);
|
||||
public:
|
||||
console_output(std::ostream &cout);
|
||||
|
||||
void render() override;
|
||||
void print_char(const position &pos,
|
||||
const char ch, const int attrs) override;
|
||||
void print_str(const position &pos,
|
||||
const std::string &str, const int attrs) override;
|
||||
};
|
||||
|
||||
#endif
|
38
src/output/curses_output.cc
Normal file
38
src/output/curses_output.cc
Normal file
@ -0,0 +1,38 @@
|
||||
#include "curses_output.h"
|
||||
|
||||
#include "../constants.h"
|
||||
|
||||
curses_output::curses_output(cursor *new_curse):
|
||||
curse{new_curse} {}
|
||||
|
||||
void curses_output::render() {
|
||||
curse->show();
|
||||
}
|
||||
|
||||
void curses_output::clear() {
|
||||
curse->clear();
|
||||
}
|
||||
|
||||
void curses_output::print_char(const position &pos, const char ch,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
curse->print_char(pos, ch, attrs);
|
||||
}
|
||||
|
||||
void curses_output::print_str(const position &pos, const std::string &str,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
position tmp = pos;
|
||||
|
||||
for (std::size_t i = 0; i < str.length(); ++i) {
|
||||
curse->print_char(tmp, str[i], attrs);
|
||||
tmp += {1, 0};
|
||||
|
||||
if (tmp.x >= DISPLAY_WIDTH)
|
||||
tmp = {0, tmp.y + 1};
|
||||
}
|
||||
}
|
23
src/output/curses_output.h
Normal file
23
src/output/curses_output.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef __CURSES_OUTPUT_H__
|
||||
#define __CURSES_OUTPUT_H__
|
||||
|
||||
#include <utility>
|
||||
#include <memory>
|
||||
#include "../cursor.h"
|
||||
#include "../output.h"
|
||||
|
||||
class curses_output final : public output {
|
||||
private:
|
||||
cursor *curse;
|
||||
public:
|
||||
curses_output(cursor *new_curse);
|
||||
|
||||
void render() override;
|
||||
void clear() override;
|
||||
void print_char(const position &pos,
|
||||
const char ch, const int attrs) override;
|
||||
void print_str(const position &pos,
|
||||
const std::string &str, const int attrs) override;
|
||||
};
|
||||
|
||||
#endif
|
38
src/output/file_output.cc
Normal file
38
src/output/file_output.cc
Normal file
@ -0,0 +1,38 @@
|
||||
#include "file_output.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "../constants.h"
|
||||
|
||||
file_output::file_output(std::ofstream &&ofs):
|
||||
out{std::move(ofs)} {}
|
||||
|
||||
void file_output::render() {
|
||||
for (std::size_t idx = 0; idx < contents.size(); ++idx) {
|
||||
if (idx % DISPLAY_WIDTH == 0 && idx)
|
||||
out << std::endl;
|
||||
|
||||
out << (char)(contents[idx] ? contents[idx] : ' ');
|
||||
}
|
||||
|
||||
out << std::endl;
|
||||
}
|
||||
|
||||
void file_output::print_char(const position &pos, const char ch,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
contents[pos.y * DISPLAY_WIDTH + pos.x] = ch;
|
||||
}
|
||||
|
||||
void file_output::print_str(const position &pos, const std::string &str,
|
||||
const int attrs) {
|
||||
if (pos.x >= DISPLAY_WIDTH || pos.y >= DISPLAY_HEIGHT)
|
||||
return;
|
||||
|
||||
int head = pos.y * DISPLAY_WIDTH + pos.x;
|
||||
|
||||
for (std::size_t i = 0; i < str.length(); ++i)
|
||||
contents[i + head] = str[i];
|
||||
}
|
20
src/output/file_output.h
Normal file
20
src/output/file_output.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef __FILE_OUTPUT_H__
|
||||
#define __FILE_OUTPUT_H__
|
||||
|
||||
#include <fstream>
|
||||
#include "../output.h"
|
||||
|
||||
class file_output final : public output {
|
||||
private:
|
||||
std::ofstream out;
|
||||
public:
|
||||
file_output(std::ofstream &&ofs);
|
||||
|
||||
void render() override;
|
||||
void print_char(const position &pos,
|
||||
const char ch, const int attrs) override;
|
||||
void print_str(const position &pos,
|
||||
const std::string &str, const int attrs) override;
|
||||
};
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user