Render from the piece table!
This commit is contained in:
parent
e52710b47c
commit
20a2786755
@ -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;
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user