citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

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:
Msrc/gl_buffer.cc | 136++++++++++++++++++++++++++++++++-----------------------------------------------
Msrc/gl_buffer.h | 68++++++++++++++++++++++++++++----------------------------------------
Msrc/gl_main.cc | 10+++++-----
Msrc/gl_view.h | 1-
Msrc/process_file.cc | 21++++++++++-----------
Msrc/process_file.h | 6+++---
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; };