Render from the piece table!

This commit is contained in:
Josh Holtrop 2016-07-19 22:34:11 -04:00
parent e52710b47c
commit 20a2786755
4 changed files with 16 additions and 38 deletions

View File

@ -8,7 +8,7 @@ Buffer::Buffer()
{ {
m_file_buffer = nullptr; m_file_buffer = nullptr;
m_file_buffer_size = 0u; m_file_buffer_size = 0u;
m_piece_table = std::make_shared<PieceTable>(nullptr, 0u); piece_table = std::make_shared<PieceTable>(nullptr, 0u);
} }
Buffer::~Buffer() Buffer::~Buffer()
@ -48,16 +48,12 @@ bool Buffer::load_from_file(const char * filename)
TextLoader text_loader; TextLoader text_loader;
text_loader.load_buffer(m_file_buffer, file_size); text_loader.load_buffer(m_file_buffer, file_size);
for (auto it = text_loader.begin(); it != text_loader.end(); it++)
{
m_lines.push_back(std::make_shared<Text>(it->first, it->second));
}
m_piece_table = std::make_shared<PieceTable>(m_file_buffer, m_file_buffer_size); piece_table = std::make_shared<PieceTable>(m_file_buffer, m_file_buffer_size);
for (auto it = text_loader.begin(); it != text_loader.end(); it++) for (auto it = text_loader.begin(); it != text_loader.end(); it++)
{ {
/* TODO: correctly calculate n_chars based on current file encoding. */ /* TODO: correctly calculate n_chars based on current file encoding. */
m_piece_table->append_initial_line_piece(it->first, it->second, it->second); piece_table->append_initial_line_piece(it->first, it->second, it->second);
} }
return true; return true;

View File

@ -3,35 +3,20 @@
#include <list> #include <list>
#include <memory> #include <memory>
#include "Text.h"
#include "PieceTable.h" #include "PieceTable.h"
class Buffer class Buffer
{ {
public: public:
std::shared_ptr<PieceTable> piece_table;
Buffer(); Buffer();
~Buffer(); ~Buffer();
bool load_from_file(const char * filename); bool load_from_file(const char * filename);
typedef std::shared_ptr<Text> LineType;
typedef std::list<LineType> LinesType;
auto begin() { return m_lines.begin(); }
auto end() { return m_lines.end(); }
auto cbegin() const { return m_lines.cbegin(); }
auto cend() const { return m_lines.cend(); }
auto rbegin() { return m_lines.rbegin(); }
auto rend() { return m_lines.rend(); }
auto crbegin() const { return m_lines.crbegin(); }
auto crend() const { return m_lines.crend(); }
int get_num_lines() { return m_lines.size(); }
protected: protected:
LinesType m_lines;
uint8_t * m_file_buffer; uint8_t * m_file_buffer;
unsigned long m_file_buffer_size; unsigned long m_file_buffer_size;
std::shared_ptr<PieceTable> m_piece_table;
void free_file_buffer(); void free_file_buffer();
}; };

View File

@ -113,7 +113,7 @@ bool Window::create(std::shared_ptr<Buffer> buffer)
m_programs.text->set_color(1.0, 1.0, 1.0, 1.0); m_programs.text->set_color(1.0, 1.0, 1.0, 1.0);
m_buffer = buffer; m_buffer = buffer;
m_line = 0; m_start_piece = m_buffer->piece_table->start_descriptor->next;
resize(); resize();
@ -223,18 +223,18 @@ void Window::handle_event(SDL_Event & event)
void Window::scroll_down() void Window::scroll_down()
{ {
if (m_line < m_buffer->get_num_lines() - 1) if (m_start_piece->next != m_buffer->piece_table->end_descriptor)
{ {
m_line++; m_start_piece = m_start_piece->next;
redraw(); redraw();
} }
} }
void Window::scroll_up() void Window::scroll_up()
{ {
if (m_line > 0) if (m_start_piece->prev != m_buffer->piece_table->start_descriptor)
{ {
m_line--; m_start_piece = m_start_piece->prev;
redraw(); redraw();
} }
} }
@ -257,17 +257,14 @@ void Window::redraw()
int advance = m_font.get_advance(); int advance = m_font.get_advance();
int line_height = m_font.get_line_height(); int line_height = m_font.get_line_height();
int y = m_height - line_height; int y = m_height - line_height;
int line_number = 0; for (PieceTable::PieceDescriptor * pd = m_start_piece;
for (auto line = m_buffer->cbegin(); line != m_buffer->cend(); line++) pd != m_buffer->piece_table->end_descriptor;
pd = pd->next)
{ {
if (line_number++ < m_line)
{
continue;
}
int x = 0; int x = 0;
for (int i = 0, len = (*line)->size(); i < len; i++) for (int i = 0, len = pd->length; i < len; i++)
{ {
uint8_t c = (**line)[i]; uint8_t c = pd->start[i];
auto g = m_font.get_glyph(c); auto g = m_font.get_glyph(c);
m_programs.text->set_position(x, y); m_programs.text->set_position(x, y);
g->render(); g->render();

View File

@ -32,7 +32,7 @@ protected:
std::shared_ptr<Buffer> m_buffer; std::shared_ptr<Buffer> m_buffer;
int m_line; PieceTable::PieceDescriptor * m_start_piece;
}; };
#endif #endif