]> git.lizzy.rs Git - nothing.git/blob - src/ui/console_log.c
Merge pull request #670 from tsoding/static-libraries
[nothing.git] / src / ui / console_log.c
1 #include "system/stacktrace.h"
2 #include <stdlib.h>
3 #include <SDL2/SDL.h>
4
5 #include "color.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"
12
13 struct Console_Log
14 {
15     Lt *lt;
16
17     const Sprite_font *font;
18     Vec font_size;
19
20     Color *colors;
21     char **buffer;
22     size_t cursor;
23     size_t capacity;
24 };
25
26 Console_Log *create_console_log(const Sprite_font *font,
27                 Vec font_size,
28                 size_t capacity)
29 {
30     Lt *lt = create_lt();
31     if (lt == NULL) {
32         return NULL;
33     }
34
35     Console_Log *console_log = PUSH_LT(lt, nth_alloc(sizeof(Console_Log)), free);
36     if (console_log == NULL) {
37         RETURN_LT(lt, NULL);
38     }
39     console_log->lt = lt;
40     console_log->font = font;
41     console_log->font_size = font_size;
42     console_log->capacity = capacity;
43
44     console_log->buffer = PUSH_LT(lt, nth_calloc(capacity, sizeof(char*)), free);
45     if (console_log->buffer == NULL) {
46         RETURN_LT(lt, NULL);
47     }
48
49     console_log->colors = PUSH_LT(lt, nth_calloc(capacity, sizeof(Color)), free);
50     if (console_log->colors == NULL) {
51         RETURN_LT(lt, NULL);
52     }
53
54     console_log->cursor = 0;
55
56     return console_log;
57 }
58
59 void destroy_console_log(Console_Log *console_log)
60 {
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]);
65         }
66     }
67     RETURN_LT0(console_log->lt);
68 }
69
70 int console_log_render(const Console_Log *console_log,
71                SDL_Renderer *renderer,
72                Point position)
73 {
74     trace_assert(console_log);
75     trace_assert(renderer);
76     (void) position;
77
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,
82                                         renderer,
83                                         vec_sum(position,
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) {
88                 return -1;
89             }
90         }
91     }
92
93     return 0;
94 }
95
96 int console_log_push_line(Console_Log *console_log, const char *line, Color color)
97 {
98     trace_assert(console_log);
99     trace_assert(line);
100
101     const size_t next_cursor = (console_log->cursor + 1) % console_log->capacity;
102
103     if (console_log->buffer[console_log->cursor] != NULL) {
104         free(console_log->buffer[console_log->cursor]);
105     }
106
107     console_log->buffer[console_log->cursor] = string_duplicate(line, NULL);
108     console_log->colors[console_log->cursor] = color;
109
110     if (console_log->buffer[console_log->cursor] == NULL) {
111         return -1;
112     }
113
114     console_log->cursor = next_cursor;
115
116     return 0;
117 }