5 #include "system/line_stream.h"
6 #include "system/stacktrace.h"
7 #include "system/nth_alloc.h"
9 #include "system/str.h"
10 #include "system/log.h"
11 #include "math/point.h"
12 #include "label_layer.h"
15 #include "game/camera.h"
17 #define LABEL_LAYER_ID_MAX_SIZE 36
27 LayerPtr label_layer_as_layer(LabelLayer *label_layer)
36 LabelLayer *create_label_layer(void)
40 LabelLayer *label_layer = PUSH_LT(
41 lt, nth_calloc(1, sizeof(LabelLayer)), free);
42 if (label_layer == NULL) {
47 label_layer->ids = PUSH_LT(
49 create_dynarray(sizeof(char) * LABEL_LAYER_ID_MAX_SIZE),
51 if (label_layer->ids == NULL) {
55 label_layer->positions = PUSH_LT(lt, create_dynarray(sizeof(Point)), destroy_dynarray);
56 if (label_layer->positions == NULL) {
60 label_layer->colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
61 if (label_layer->colors == NULL) {
65 label_layer->texts = PUSH_LT(lt, create_dynarray(sizeof(char*)), destroy_dynarray);
66 if (label_layer->texts == NULL) {
73 LabelLayer *create_label_layer_from_line_stream(LineStream *line_stream)
75 trace_assert(line_stream);
76 LabelLayer *label_layer = create_label_layer();
78 if (label_layer == NULL) {
79 RETURN_LT(label_layer->lt, NULL);
82 const char *line = line_stream_next(line_stream);
84 log_fail("Could not read amount of labels\n");
85 RETURN_LT(label_layer->lt, NULL);
89 if (sscanf(line, "%zu", &n) == EOF) {
90 log_fail("Could not parse amount of labels\n");
91 RETURN_LT(label_layer->lt, NULL);
94 for (size_t i = 0; i < n; ++i) {
96 char id[LABEL_LAYER_ID_MAX_SIZE];
99 line = line_stream_next(line_stream);
101 log_fail("Could not read label meta info\n");
102 RETURN_LT(label_layer->lt, NULL);
107 "%"STRINGIFY(LABEL_LAYER_ID_MAX_SIZE)"s%f%f%6s\n",
108 id, &position.x, &position.y, hex) == EOF) {
109 log_fail("Could not parse label meta info\n");
110 RETURN_LT(label_layer->lt, NULL);
113 Color color = hexstr(hex);
115 dynarray_push(label_layer->ids, id);
116 dynarray_push(label_layer->positions, &position);
117 dynarray_push(label_layer->colors, &color);
119 line = line_stream_next(line_stream);
121 log_fail("Could not read label text\n");
124 char *label_text = PUSH_LT(label_layer->lt, string_duplicate(line, NULL), free);
125 trim_endline(label_text);
126 dynarray_push(label_layer->texts, &label_text);
132 void destroy_label_layer(LabelLayer *label_layer)
134 trace_assert(label_layer);
135 destroy_lt(label_layer->lt);
138 int label_layer_render(const LabelLayer *label_layer,
142 trace_assert(label_layer);
143 trace_assert(camera);
145 size_t n = dynarray_count(label_layer->ids);
146 Point *positions = dynarray_data(label_layer->positions);
147 Color *colors = dynarray_data(label_layer->colors);
148 char **texts = dynarray_data(label_layer->texts);
150 /* TODO(#891): LabelLayer doesn't show the final position of Label after the animation */
151 for (size_t i = 0; i < n; ++i) {
152 if (camera_render_text(
158 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f)),
167 int label_layer_event(LabelLayer *label_layer,
168 const SDL_Event *event,
169 const Camera *camera)
171 trace_assert(label_layer);
173 trace_assert(camera);
174 /* TODO(#892): LabelLayer doesn't allow to modify and add labels */
178 size_t label_layer_count(const LabelLayer *label_layer)
180 return dynarray_count(label_layer->ids);
183 char *label_layer_ids(const LabelLayer *label_layer)
185 return dynarray_data(label_layer->ids);
188 Point *label_layer_positions(const LabelLayer *label_layer)
190 return dynarray_data(label_layer->positions);
193 Color *label_layer_colors(const LabelLayer *label_layer)
195 return dynarray_data(label_layer->colors);
198 char **labels_layer_texts(const LabelLayer *label_layer)
200 return dynarray_data(label_layer->texts);
203 int label_layer_dump_stream(const LabelLayer *label_layer, FILE *filedump)
205 trace_assert(label_layer);
206 trace_assert(filedump);
208 size_t n = dynarray_count(label_layer->ids);
209 char *ids = dynarray_data(label_layer->ids);
210 Point *positions = dynarray_data(label_layer->positions);
211 Color *colors = dynarray_data(label_layer->colors);
212 char **texts = dynarray_data(label_layer->texts);
214 fprintf(filedump, "%zd\n", n);
215 for (size_t i = 0; i < n; ++i) {
216 fprintf(filedump, "%s %f %f ",
217 ids + LABEL_LAYER_ID_MAX_SIZE * i,
218 positions[i].x, positions[i].y);
219 color_hex_to_stream(colors[i], filedump);
220 fprintf(filedump, "\n%s\n", texts[i]);