|
@@ -17,9 +17,11 @@ struct app {
|
|
|
struct font font;
|
|
struct font font;
|
|
|
struct buffer buf;
|
|
struct buffer buf;
|
|
|
bool running;
|
|
bool running;
|
|
|
|
|
+ uint64_t target_fps;
|
|
|
struct {
|
|
struct {
|
|
|
uint8_t tab_size;
|
|
uint8_t tab_size;
|
|
|
} cfg;
|
|
} cfg;
|
|
|
|
|
+ bool show_fps;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
struct app app_create(const char *win_title);
|
|
struct app app_create(const char *win_title);
|
|
@@ -32,9 +34,13 @@ void app_render_cursor(struct app app, uint32_t color);
|
|
|
void app_render_char(struct app app, const char c, struct vec2 pos,
|
|
void app_render_char(struct app app, const char c, struct vec2 pos,
|
|
|
double scale);
|
|
double scale);
|
|
|
|
|
|
|
|
|
|
+void app_render_buffer(struct app app, struct vec2 pos,
|
|
|
|
|
+ uint32_t color, double scale);
|
|
|
void app_render_text(struct app app, const char *text, size_t text_size,
|
|
void app_render_text(struct app app, const char *text, size_t text_size,
|
|
|
struct vec2 pos, uint32_t color, double scale);
|
|
struct vec2 pos, uint32_t color, double scale);
|
|
|
|
|
|
|
|
|
|
+struct vec2 app_calc_cur_pos(struct app app);
|
|
|
|
|
+
|
|
|
#if defined(APP_IMP) || defined(IMP)
|
|
#if defined(APP_IMP) || defined(IMP)
|
|
|
|
|
|
|
|
#define UNHEX_COLOR(hex) \
|
|
#define UNHEX_COLOR(hex) \
|
|
@@ -54,8 +60,9 @@ app_create(const char *win_title)
|
|
|
.running = true,
|
|
.running = true,
|
|
|
.buf = buffer_create(),
|
|
.buf = buffer_create(),
|
|
|
.cfg = {
|
|
.cfg = {
|
|
|
- .tab_size = 4
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .tab_size = 8
|
|
|
|
|
+ },
|
|
|
|
|
+ .target_fps = 120,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
app.rdr = SDL_CreateRenderer(app.win.ptr, -1, SDL_RENDERER_ACCELERATED);
|
|
app.rdr = SDL_CreateRenderer(app.win.ptr, -1, SDL_RENDERER_ACCELERATED);
|
|
@@ -114,20 +121,24 @@ app_get_text_color(struct app app) {
|
|
|
(((cond)) * (when_true) + (!(cond)) * (when_false))
|
|
(((cond)) * (when_true) + (!(cond)) * (when_false))
|
|
|
|
|
|
|
|
void
|
|
void
|
|
|
-app_render_text(struct app app, const char *text, size_t text_size,
|
|
|
|
|
- struct vec2 pos, uint32_t color, double scale)
|
|
|
|
|
|
|
+app_render_buffer(struct app app, struct vec2 pos,
|
|
|
|
|
+ uint32_t color, double scale)
|
|
|
{
|
|
{
|
|
|
app_set_text_color(app, color);
|
|
app_set_text_color(app, color);
|
|
|
|
|
|
|
|
|
|
+ struct buffer buf = app.buf;
|
|
|
|
|
+ DA_DEF_STRUCT_ITEM(char, da);
|
|
|
|
|
+ DA_ASSIGN(da, buf.data);
|
|
|
|
|
+
|
|
|
struct vec2 pen = pos;
|
|
struct vec2 pen = pos;
|
|
|
- size_t i = 0;
|
|
|
|
|
|
|
+ size_t i = buf.render_start;
|
|
|
char c;
|
|
char c;
|
|
|
- for ( ; i < text_size; ++i ) {
|
|
|
|
|
- c = text[i];
|
|
|
|
|
- bool cond = (pen.x > app.win.w);
|
|
|
|
|
- pen.x = BRANCHLESS_IF(cond, pos.x, pen.x);
|
|
|
|
|
- pen.y += BRANCHLESS_IF(cond,
|
|
|
|
|
- (double) (app.font.ch_h * scale), 0);
|
|
|
|
|
|
|
+ for ( ; i < da.size; ++i ) {
|
|
|
|
|
+ c = da.items[i];
|
|
|
|
|
+ /* bool cond = (pen.x > app.win.w); */
|
|
|
|
|
+ /* pen.x = BRANCHLESS_IF(cond, pos.x, pen.x); */
|
|
|
|
|
+ /* pen.y += BRANCHLESS_IF(cond, */
|
|
|
|
|
+ /* (double) (app.font.ch_h * scale), 0); */
|
|
|
switch ( c ) {
|
|
switch ( c ) {
|
|
|
case '\n': {
|
|
case '\n': {
|
|
|
if ( i == app.buf.cur ) {
|
|
if ( i == app.buf.cur ) {
|
|
@@ -155,7 +166,34 @@ app_render_text(struct app app, const char *text, size_t text_size,
|
|
|
if ( i == app.buf.cur ) {
|
|
if ( i == app.buf.cur ) {
|
|
|
app_render_cursor_in_pos(app, pen, 0xFF00FFFF);
|
|
app_render_cursor_in_pos(app, pen, 0xFF00FFFF);
|
|
|
}
|
|
}
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+void
|
|
|
|
|
+app_render_text(struct app app, const char *text, size_t text_size,
|
|
|
|
|
+ struct vec2 pos, uint32_t color, double scale)
|
|
|
|
|
+{
|
|
|
|
|
+ app_set_text_color(app, color);
|
|
|
|
|
+
|
|
|
|
|
+ struct vec2 pen = pos;
|
|
|
|
|
+ size_t i = 0;
|
|
|
|
|
+ char c;
|
|
|
|
|
+ for ( ; i < text_size; ++i ) {
|
|
|
|
|
+ c = text[i];
|
|
|
|
|
+ switch ( c ) {
|
|
|
|
|
+ case '\n': {
|
|
|
|
|
+ pen.x = pos.x;
|
|
|
|
|
+ pen.y += (double) (app.font.ch_h * scale);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ } break;
|
|
|
|
|
+ case '\t': {
|
|
|
|
|
+ pen.x += (double) ((app.font.ch_w * scale)
|
|
|
|
|
+ * app.cfg.tab_size);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ } break;
|
|
|
|
|
+ }
|
|
|
|
|
+ app_render_char(app, c, pen, scale);
|
|
|
|
|
+ pen.x += (double) (app.font.ch_w * scale);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
void
|
|
@@ -193,6 +231,38 @@ app_render_cursor(struct app app, uint32_t color)
|
|
|
app_render_cursor_in_pos(app, pos, color);
|
|
app_render_cursor_in_pos(app, pos, color);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+struct vec2
|
|
|
|
|
+app_calc_cur_pos(struct app app)
|
|
|
|
|
+{
|
|
|
|
|
+ size_t col = 0;
|
|
|
|
|
+ size_t row = buffer_calc_cur_row(app.buf);
|
|
|
|
|
+ enum buffer_err err;
|
|
|
|
|
+ /* RET_UNWRAP2(col, row, */
|
|
|
|
|
+ /* struct ret_size_t_size_t, */
|
|
|
|
|
+ /* buffer_calc_cur_pos(app.buf)); */
|
|
|
|
|
+ size_t start_line;
|
|
|
|
|
+ RET_UNWRAP2(start_line, err, struct ret_size_t_err,
|
|
|
|
|
+ buffer_index_bw_char(app.buf, app.buf.cur, '\n'));
|
|
|
|
|
+ col = (app.buf.cur - start_line) - 1;
|
|
|
|
|
+ if ( err == BUFFER_ERR_NOT_FOUND ) {
|
|
|
|
|
+ col = app.buf.cur;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ size_t tabs_n = 0;
|
|
|
|
|
+ RET_UNWRAP2(tabs_n, err,
|
|
|
|
|
+ struct ret_size_t_err,
|
|
|
|
|
+ buffer_count_char_between(app.buf, '\t',
|
|
|
|
|
+ start_line, app.buf.cur));
|
|
|
|
|
+ col += ( tabs_n > 0 ) * ((tabs_n * app.cfg.tab_size) - tabs_n);
|
|
|
|
|
+
|
|
|
|
|
+ double row_px = (((double)row)
|
|
|
|
|
+ * (app.font.ch_h * app.font.scale));
|
|
|
|
|
+ double col_px = (((double) col) *
|
|
|
|
|
+ (app.font.ch_w * app.font.scale));
|
|
|
|
|
+
|
|
|
|
|
+ return vec2(col_px, row_px);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
#endif /* defined(APP_IMP) || defined(IMP) */
|
|
#endif /* defined(APP_IMP) || defined(IMP) */
|
|
|
|
|
|