commit 051749802d66bed46fc5577789b700ebdd907f86
parent fde43ef7ffb928b0fd2b81ac343400d6584bf3b6
Author: Kyle Milz <kyle@0x30.net>
Date: Thu, 15 Dec 2016 22:45:00 -0700
src: turn demo_buffer_t into a class
Diffstat:
6 files changed, 101 insertions(+), 141 deletions(-)
diff --git a/src/gl_buffer.cc b/src/gl_buffer.cc
@@ -19,93 +19,67 @@
#include "gl_buffer.h"
-struct demo_buffer_t {
- unsigned int refcount;
-
- glyphy_point_t cursor;
- std::vector<glyph_vertex_t> *vertices;
- glyphy_extents_t ink_extents;
- glyphy_extents_t logical_extents;
- bool dirty;
- GLuint buf_name;
-};
-
-demo_buffer_t *
-demo_buffer_create (void)
+GlBuffer::GlBuffer()
{
- demo_buffer_t *buffer = (demo_buffer_t *) calloc (1, sizeof (demo_buffer_t));
- buffer->refcount = 1;
+ m_refcount = 1;
- buffer->vertices = new std::vector<glyph_vertex_t>;
- glGenBuffers (1, &buffer->buf_name);
+ m_vertices = new std::vector<glyph_vertex_t>;
+ glGenBuffers(1, &m_buf_name);
- demo_buffer_clear (buffer);
-
- return buffer;
+ clear();
}
-demo_buffer_t *
-demo_buffer_reference (demo_buffer_t *buffer)
+GlBuffer::~GlBuffer()
{
- if (buffer) buffer->refcount++;
- return buffer;
+ //if (!buffer || --buffer->refcount)
+ // return;
+
+ glDeleteBuffers(1, &m_buf_name);
+ delete m_vertices;
}
void
-demo_buffer_destroy (demo_buffer_t *buffer)
+GlBuffer::reference()
{
- if (!buffer || --buffer->refcount)
- return;
-
- glDeleteBuffers (1, &buffer->buf_name);
- delete buffer->vertices;
- free (buffer);
+ m_refcount++;
}
-
void
-demo_buffer_clear (demo_buffer_t *buffer)
+GlBuffer::clear()
{
- buffer->vertices->clear ();
- glyphy_extents_clear (&buffer->ink_extents);
- glyphy_extents_clear (&buffer->logical_extents);
- buffer->dirty = true;
+ m_vertices->clear();
+ glyphy_extents_clear(&m_ink_extents);
+ glyphy_extents_clear(&m_logical_extents);
+ m_dirty = true;
}
void
-demo_buffer_extents (demo_buffer_t *buffer,
- glyphy_extents_t *ink_extents,
- glyphy_extents_t *logical_extents)
+GlBuffer::extents(glyphy_extents_t *ink, glyphy_extents_t *logical)
{
- if (ink_extents)
- *ink_extents = buffer->ink_extents;
- if (logical_extents)
- *logical_extents = buffer->logical_extents;
+ if (ink)
+ *ink = m_ink_extents;
+ if (logical)
+ *logical = m_logical_extents;
}
void
-demo_buffer_move_to (demo_buffer_t *buffer,
- const glyphy_point_t *p)
+GlBuffer::move_to(const glyphy_point_t *p)
{
- buffer->cursor = *p;
+ m_cursor = *p;
}
void
-demo_buffer_current_point (demo_buffer_t *buffer,
- glyphy_point_t *p)
+GlBuffer::current_point(glyphy_point_t *p)
{
- *p = buffer->cursor;
+ *p = m_cursor;
}
void
-demo_buffer_add_text (demo_buffer_t *buffer,
- const char *utf8,
- demo_font_t *font,
- double font_size)
+GlBuffer::add_text(const char *utf8, demo_font_t *font, double font_size)
{
- FT_Face face = demo_font_get_face (font);
- glyphy_point_t top_left = buffer->cursor;
- buffer->cursor.y += font_size /* * font->ascent */;
+ FT_Face face = demo_font_get_face(font);
+ glyphy_point_t top_left = m_cursor;
+ m_cursor.y += font_size /* * font->ascent */;
unsigned int unicode;
unsigned int col = 0;
@@ -132,60 +106,60 @@ demo_buffer_add_text (demo_buffer_t *buffer,
}
if (unicode == '\n') {
- buffer->cursor.y += font_size;
- buffer->cursor.x = top_left.x;
+ m_cursor.y += font_size;
+ m_cursor.x = top_left.x;
col = 0;
continue;
}
- unsigned int glyph_index = FT_Get_Char_Index (face, unicode);
+ unsigned int glyph_index = FT_Get_Char_Index(face, unicode);
glyph_info_t gi;
- demo_font_lookup_glyph (font, glyph_index, &gi);
+ demo_font_lookup_glyph(font, glyph_index, &gi);
/* Let tab operate like it does in editors, 8 spaces. */
if (unicode == '\t') {
int nspaces = 8 - (col % 8);
- buffer->cursor.x += font_size * gi.advance * nspaces;
+ m_cursor.x += font_size * gi.advance * nspaces;
col += nspaces;
continue;
}
/* Update ink extents */
- glyphy_extents_t ink_extents;
- demo_shader_add_glyph_vertices (buffer->cursor, font_size, &gi, buffer->vertices, &ink_extents);
- glyphy_extents_extend (&buffer->ink_extents, &ink_extents);
+ glyphy_extents_t m_ink_extents;
+ demo_shader_add_glyph_vertices(m_cursor, font_size, &gi, m_vertices, &m_ink_extents);
+ glyphy_extents_extend(&m_ink_extents, &m_ink_extents);
/* Update logical extents */
glyphy_point_t corner;
- corner.x = buffer->cursor.x;
- corner.y = buffer->cursor.y - font_size;
- glyphy_extents_add (&buffer->logical_extents, &corner);
- corner.x = buffer->cursor.x + font_size * gi.advance;
- corner.y = buffer->cursor.y;
- glyphy_extents_add (&buffer->logical_extents, &corner);
+ corner.x = m_cursor.x;
+ corner.y = m_cursor.y - font_size;
+ glyphy_extents_add(&m_logical_extents, &corner);
+ corner.x = m_cursor.x + font_size * gi.advance;
+ corner.y = m_cursor.y;
+ glyphy_extents_add(&m_logical_extents, &corner);
- buffer->cursor.x += font_size * gi.advance;
+ m_cursor.x += font_size * gi.advance;
/* Hack; Not all characters are a single column wide. */
col++;
}
- buffer->dirty = true;
+ m_dirty = true;
}
void
-demo_buffer_draw (demo_buffer_t *buffer)
+GlBuffer::draw()
{
GLint program;
- glGetIntegerv (GL_CURRENT_PROGRAM, &program);
- GLuint a_glyph_vertex_loc = glGetAttribLocation (program, "a_glyph_vertex");
- glBindBuffer (GL_ARRAY_BUFFER, buffer->buf_name);
- if (buffer->dirty) {
- glBufferData (GL_ARRAY_BUFFER, sizeof (glyph_vertex_t) * buffer->vertices->size (), (const char *) &(*buffer->vertices)[0], GL_STATIC_DRAW);
- buffer->dirty = false;
+ glGetIntegerv(GL_CURRENT_PROGRAM, &program);
+ GLuint a_glyph_vertex_loc = glGetAttribLocation(program, "a_glyph_vertex");
+ glBindBuffer(GL_ARRAY_BUFFER, m_buf_name);
+ if (m_dirty) {
+ glBufferData(GL_ARRAY_BUFFER, sizeof (glyph_vertex_t) * m_vertices->size (), (const char *) &(*m_vertices)[0], GL_STATIC_DRAW);
+ m_dirty = false;
}
glEnableVertexAttribArray (a_glyph_vertex_loc);
glVertexAttribPointer (a_glyph_vertex_loc, 4, GL_FLOAT, GL_FALSE, sizeof (glyph_vertex_t), 0);
- glDrawArrays (GL_TRIANGLES, 0, buffer->vertices->size ());
+ glDrawArrays (GL_TRIANGLES, 0, m_vertices->size ());
glDisableVertexAttribArray (a_glyph_vertex_loc);
}
diff --git a/src/gl_buffer.h b/src/gl_buffer.h
@@ -16,49 +16,37 @@
* Google Author(s): Behdad Esfahbod
*/
-#ifndef DEMO_BUFFER_H
-#define DEMO_BUFFER_H
+#ifndef GL_BUFFER_H
+#define GL_BUFFER_H
+
+#include <vector>
#include "demo-common.h"
#include "gl_font.h"
#include "demo-shader.h"
-typedef struct demo_buffer_t demo_buffer_t;
-
-demo_buffer_t *
-demo_buffer_create (void);
-
-demo_buffer_t *
-demo_buffer_reference (demo_buffer_t *buffer);
-
-void
-demo_buffer_destroy (demo_buffer_t *buffer);
-
-
-void
-demo_buffer_clear (demo_buffer_t *buffer);
-
-void
-demo_buffer_extents (demo_buffer_t *buffer,
- glyphy_extents_t *ink_extents,
- glyphy_extents_t *logical_extents);
-
-void
-demo_buffer_move_to (demo_buffer_t *buffer,
- const glyphy_point_t *p);
-
-void
-demo_buffer_current_point (demo_buffer_t *buffer,
- glyphy_point_t *p);
-
-void
-demo_buffer_add_text (demo_buffer_t *buffer,
- const char *utf8,
- demo_font_t *font,
- double font_size);
-
-void
-demo_buffer_draw (demo_buffer_t *buffer);
-
-#endif /* DEMO_BUFFER_H */
+class GlBuffer
+{
+ unsigned int m_refcount;
+ glyphy_point_t m_cursor;
+ std::vector<glyph_vertex_t> *m_vertices;
+ glyphy_extents_t m_ink_extents;
+ glyphy_extents_t m_logical_extents;
+ bool m_dirty;
+ GLuint m_buf_name;
+
+public:
+ GlBuffer();
+ ~GlBuffer();
+
+ void reference();
+ void clear();
+ void extents(glyphy_extents_t *, glyphy_extents_t *);
+ void move_to(const glyphy_point_t *);
+ void current_point(glyphy_point_t *);
+ void add_text(const char *, demo_font_t *, double);
+ void draw();
+};
+
+#endif // GL_BUFFER_H
diff --git a/src/gl_main.cc b/src/gl_main.cc
@@ -65,7 +65,7 @@ main(int argc, char *argv[])
std::vector<ProcessFile> drawables;
demo_glstate_t *st = demo_glstate_create();
- demo_buffer_t *buffer = demo_buffer_create();
+ GlBuffer buffer;
static_vu = new View(st);
@@ -74,13 +74,13 @@ main(int argc, char *argv[])
static_vu->setup();
glyphy_point_t top_left = { 0, 0 };
- demo_buffer_move_to(buffer, &top_left);
- demo_buffer_add_text(buffer, "waiting...", font, 1);
+ buffer.move_to(&top_left);
+ buffer.add_text("waiting...", font, 1);
while (!glfwWindowShouldClose(window)) {
for (std::string &file_name : m_pdir.scan())
- drawables.push_back(ProcessFile(file_name, font));
+ drawables.emplace_back(file_name, font);
glyphy_extents_t extents;
for (auto &i : drawables) {
@@ -94,7 +94,7 @@ main(int argc, char *argv[])
// Set up view transforms
static_vu->display(extents);
- demo_buffer_draw (buffer);
+ buffer.draw();
for (auto &i : drawables)
i.display();
diff --git a/src/gl_view.h b/src/gl_view.h
@@ -47,7 +47,6 @@ private:
unsigned int refcount;
demo_glstate_t *st;
- demo_buffer_t *buffer;
/* Output */
GLint vsync;
diff --git a/src/process_file.cc b/src/process_file.cc
@@ -112,8 +112,7 @@ ProcessFile::ProcessFile(std::string const &path, demo_font_t *font) :
m_path(path),
m_fd(0),
m_tus_with_execs(0),
- m_program_loc(0),
- m_gl_buffer(demo_buffer_create())
+ m_program_loc(0)
{
struct stat sb;
void *mem, *end;
@@ -144,7 +143,7 @@ ProcessFile::ProcessFile(std::string const &path, demo_font_t *font) :
assert(m_header->major == citrun_major);
while (mem < end)
- m_tus.push_back(TranslationUnit(mem));
+ m_tus.emplace_back(mem);
// Make sure internal increment in TranslationUnit works as intended.
assert(mem == end);
@@ -160,13 +159,13 @@ ProcessFile::ProcessFile(std::string const &path, demo_font_t *font) :
ss << "Process Group:" << m_header->pids[2] << std::endl;
glyphy_point_t cur_pos = { 0, 0 };
- demo_buffer_move_to(m_gl_buffer, &cur_pos);
- demo_buffer_add_text(m_gl_buffer, ss.str().c_str(), font, 2);
+ m_glbuffer.move_to(&cur_pos);
+ m_glbuffer.add_text(ss.str().c_str(), font, 2);
- demo_buffer_current_point(m_gl_buffer, &cur_pos);
+ m_glbuffer.current_point(&cur_pos);
cur_pos.x = 0;
for (auto &t : m_tus)
- demo_buffer_add_text(m_gl_buffer, t.comp_file_path().c_str(), font, 1);
+ m_glbuffer.add_text(t.comp_file_path().c_str(), font, 1);
}
//
@@ -190,16 +189,16 @@ ProcessFile::find_tu(std::string const &srcname) const
}
void
-ProcessFile::display() const
+ProcessFile::display()
{
- demo_buffer_draw (m_gl_buffer);
+ m_glbuffer.draw();
}
glyphy_extents_t
-ProcessFile::get_extents() const
+ProcessFile::get_extents()
{
glyphy_extents_t extents;
- demo_buffer_extents(m_gl_buffer, NULL, &extents);
+ m_glbuffer.extents(NULL, &extents);
return extents;
}
diff --git a/src/process_file.h b/src/process_file.h
@@ -36,15 +36,15 @@ class ProcessFile
size_t m_size;
int m_tus_with_execs;
unsigned int m_program_loc;
- demo_buffer_t *m_gl_buffer;
+ GlBuffer m_glbuffer;
public:
ProcessFile(std::string const &, demo_font_t *);
const TranslationUnit *find_tu(std::string const &) const;
bool is_alive() const;
- void display() const;
- glyphy_extents_t get_extents() const;
+ void display();
+ glyphy_extents_t get_extents();
std::vector<TranslationUnit> m_tus;
};