]> git.lizzy.rs Git - nothing.git/blob - src/ui/menu_title.c
(#788) Make Slider only consume SDL_MOUSEBUTTONDOWN
[nothing.git] / src / ui / menu_title.c
1 #include <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 = create_lt();
29
30     MenuTitle *menu_title = PUSH_LT(
31         lt,
32         nth_calloc(1, sizeof(MenuTitle)),
33         free);
34     if (menu_title == NULL) {
35         RETURN_LT(lt, NULL);
36     }
37     menu_title->lt = lt;
38
39     menu_title->text = PUSH_LT(
40         lt,
41         string_duplicate(text, NULL),
42         free);
43     if (menu_title->text == NULL) {
44         RETURN_LT(lt, NULL);
45     }
46
47     menu_title->font_scale = font_scale;
48     menu_title->sprite_font = sprite_font;
49     menu_title->angle = 0.0f;
50     menu_title->position = vec(0.0f, 0.0f);
51
52     return menu_title;
53 }
54
55 void destroy_menu_title(MenuTitle *menu_title)
56 {
57     trace_assert(menu_title);
58     RETURN_LT0(menu_title->lt);
59 }
60
61 int menu_title_render(const MenuTitle *menu_title,
62                       SDL_Renderer *renderer)
63 {
64     trace_assert(menu_title);
65     trace_assert(renderer);
66
67
68     const size_t n = strlen(menu_title->text);
69     char buf[2] = {0, 0};
70
71     for (size_t i = 0; i < n; ++i) {
72         buf[0] = menu_title->text[i];
73
74         if (sprite_font_render_text(
75                 menu_title->sprite_font,
76                 renderer,
77                 vec_sum(
78                     menu_title->position,
79                     vec(
80                         (float) (i * FONT_CHAR_WIDTH) * menu_title->font_scale.x,
81                         sinf(menu_title->angle + (float) i / (float) n * 10.0f) * 20.0f)),
82                 menu_title->font_scale,
83                 rgba(1.0f, 1.0f, 1.0f, 1.0f),
84                 buf) < 0) {
85             return -1;
86         }
87     }
88
89     return 0;
90 }
91
92 int menu_title_update(MenuTitle *menu_title, float delta_time)
93 {
94     trace_assert(menu_title);
95     menu_title->angle = fmodf(menu_title->angle + 10.0f * delta_time, 2 * PI);
96     return 0;
97 }
98
99 Vec menu_title_size(const MenuTitle *menu_title)
100 {
101     trace_assert(menu_title);
102
103     Rect boundary = sprite_font_boundary_box(
104         menu_title->sprite_font,
105         vec(0.0f, 0.0f),
106         menu_title->font_scale,
107         menu_title->text);
108
109     return vec(boundary.w, boundary.h);
110 }
111
112 void menu_title_move(MenuTitle *menu_title,
113                      Vec position)
114 {
115     menu_title->position = position;
116 }