]> git.lizzy.rs Git - nothing.git/blob - src/ui/menu_title.c
create_lt() -> {0}
[nothing.git] / src / ui / menu_title.c
1 #include <SDL2/SDL.h>
2
3 #include "math/point.h"
4
5 #include "./menu_title.h"
6 #include "system/lt.h"
7 #include "system/stacktrace.h"
8 #include "system/nth_alloc.h"
9 #include "system/str.h"
10 #include "game/sprite_font.h"
11
12 struct MenuTitle
13 {
14     Lt lt;
15     const char *text;
16     Vec font_scale;
17     const Sprite_font *sprite_font;
18     float angle;
19     Vec position;
20 };
21
22 MenuTitle *create_menu_title(const char *text,
23                              Vec font_scale,
24                              const Sprite_font *sprite_font)
25 {
26     trace_assert(text);
27
28     Lt lt = {0};
29     if (lt == NULL) {
30         return NULL;
31     }
32
33     MenuTitle *menu_title = PUSH_LT(
34         lt,
35         nth_calloc(1, sizeof(MenuTitle)),
36         free);
37     if (menu_title == NULL) {
38         RETURN_LT(lt, NULL);
39     }
40     menu_title->lt = lt;
41
42     menu_title->text = PUSH_LT(
43         lt,
44         string_duplicate(text, NULL),
45         free);
46     if (menu_title->text == NULL) {
47         RETURN_LT(lt, NULL);
48     }
49
50     menu_title->font_scale = font_scale;
51     menu_title->sprite_font = sprite_font;
52     menu_title->angle = 0.0f;
53     menu_title->position = vec(0.0f, 0.0f);
54
55     return menu_title;
56 }
57
58 void destroy_menu_title(MenuTitle *menu_title)
59 {
60     trace_assert(menu_title);
61     RETURN_LT0(menu_title->lt);
62 }
63
64 int menu_title_render(const MenuTitle *menu_title,
65                       SDL_Renderer *renderer)
66 {
67     trace_assert(menu_title);
68     trace_assert(renderer);
69
70
71     const size_t n = strlen(menu_title->text);
72     char buf[2] = {0, 0};
73
74     for (size_t i = 0; i < n; ++i) {
75         buf[0] = menu_title->text[i];
76
77         if (sprite_font_render_text(
78                 menu_title->sprite_font,
79                 renderer,
80                 vec_sum(
81                     menu_title->position,
82                     vec(
83                         (float) (i * FONT_CHAR_WIDTH) * menu_title->font_scale.x,
84                         sinf(menu_title->angle + (float) i / (float) n * 10.0f) * 20.0f)),
85                 menu_title->font_scale,
86                 rgba(1.0f, 1.0f, 1.0f, 1.0f),
87                 buf) < 0) {
88             return -1;
89         }
90     }
91
92     return 0;
93 }
94
95 int menu_title_update(MenuTitle *menu_title, float delta_time)
96 {
97     trace_assert(menu_title);
98     menu_title->angle = fmodf(menu_title->angle + 10.0f * delta_time, 2 * PI);
99     return 0;
100 }
101
102 Vec menu_title_size(const MenuTitle *menu_title)
103 {
104     trace_assert(menu_title);
105
106     Rect boundary = sprite_font_boundary_box(
107         menu_title->sprite_font,
108         vec(0.0f, 0.0f),
109         menu_title->font_scale,
110         menu_title->text);
111
112     return vec(boundary.w, boundary.h);
113 }
114
115 void menu_title_move(MenuTitle *menu_title,
116                      Vec position)
117 {
118     menu_title->position = position;
119 }