1 #include "system/stacktrace.h"
6 #include "game/sprite_font.h"
7 #include "console_log.h"
8 #include "math/point.h"
9 #include "system/str.h"
10 #include "system/lt.h"
11 #include "system/nth_alloc.h"
17 const Sprite_font *font;
26 Console_Log *create_console_log(const Sprite_font *font,
35 Console_Log *console_log = PUSH_LT(lt, nth_calloc(1, sizeof(Console_Log)), free);
36 if (console_log == NULL) {
40 console_log->font = font;
41 console_log->font_size = font_size;
42 console_log->capacity = capacity;
44 console_log->buffer = PUSH_LT(lt, nth_calloc(capacity, sizeof(char*)), free);
45 if (console_log->buffer == NULL) {
49 console_log->colors = PUSH_LT(lt, nth_calloc(capacity, sizeof(Color)), free);
50 if (console_log->colors == NULL) {
54 console_log->cursor = 0;
59 void destroy_console_log(Console_Log *console_log)
61 trace_assert(console_log);
62 for (size_t i = 0; i < console_log->capacity; ++i) {
63 if (console_log->buffer[i]) {
64 free(console_log->buffer[i]);
67 RETURN_LT0(console_log->lt);
70 int console_log_render(const Console_Log *console_log,
71 SDL_Renderer *renderer,
74 trace_assert(console_log);
75 trace_assert(renderer);
78 for (size_t i = 0; i < console_log->capacity; ++i) {
79 const size_t j = (i + console_log->cursor) % console_log->capacity;
80 if (console_log->buffer[j]) {
81 if (sprite_font_render_text(console_log->font,
84 vec(0.0f, FONT_CHAR_HEIGHT * console_log->font_size.y * (float) i)),
85 console_log->font_size,
86 console_log->colors[j],
87 console_log->buffer[j]) < 0) {
96 int console_log_push_line(Console_Log *console_log, const char *line, Color color)
98 trace_assert(console_log);
101 const size_t next_cursor = (console_log->cursor + 1) % console_log->capacity;
103 if (console_log->buffer[console_log->cursor] != NULL) {
104 free(console_log->buffer[console_log->cursor]);
107 console_log->buffer[console_log->cursor] = string_duplicate(line, NULL);
108 console_log->colors[console_log->cursor] = color;
110 if (console_log->buffer[console_log->cursor] == NULL) {
114 console_log->cursor = next_cursor;