3 #include "system/line_stream.h"
4 #include "system/stacktrace.h"
5 #include "system/nth_alloc.h"
7 #include "system/str.h"
8 #include "system/log.h"
9 #include "math/point.h"
10 #include "label_layer.h"
13 #include "game/camera.h"
15 #define LABEL_LAYER_ID_MAX_SIZE 36
25 LayerPtr label_layer_as_layer(LabelLayer *label_layer)
34 LabelLayer *create_label_layer(void)
38 LabelLayer *label_layer = PUSH_LT(
39 lt, nth_calloc(1, sizeof(LabelLayer)), free);
40 if (label_layer == NULL) {
45 label_layer->ids = PUSH_LT(
47 create_dynarray(sizeof(char) * LABEL_LAYER_ID_MAX_SIZE),
49 if (label_layer->ids == NULL) {
53 label_layer->positions = PUSH_LT(lt, create_dynarray(sizeof(Point)), destroy_dynarray);
54 if (label_layer->positions == NULL) {
58 label_layer->colors = PUSH_LT(lt, create_dynarray(sizeof(Color)), destroy_dynarray);
59 if (label_layer->colors == NULL) {
63 label_layer->texts = PUSH_LT(lt, create_dynarray(sizeof(char*)), destroy_dynarray);
64 if (label_layer->texts == NULL) {
71 LabelLayer *create_label_layer_from_line_stream(LineStream *line_stream)
73 trace_assert(line_stream);
74 LabelLayer *label_layer = create_label_layer();
76 if (label_layer == NULL) {
77 RETURN_LT(label_layer->lt, NULL);
80 const char *line = line_stream_next(line_stream);
82 log_fail("Could not read amount of labels\n");
83 RETURN_LT(label_layer->lt, NULL);
87 if (sscanf(line, "%lu", &n) == EOF) {
88 log_fail("Could not parse amount of labels\n");
89 RETURN_LT(label_layer->lt, NULL);
92 for (size_t i = 0; i < n; ++i) {
94 char id[LABEL_LAYER_ID_MAX_SIZE];
97 line = line_stream_next(line_stream);
99 log_fail("Could not read label meta info\n");
100 RETURN_LT(label_layer->lt, NULL);
105 "%"STRINGIFY(LABEL_LAYER_ID_MAX_SIZE)"s%f%f%6s\n",
106 id, &position.x, &position.y, hex) == EOF) {
107 log_fail("Could not parse label meta info\n");
108 RETURN_LT(label_layer->lt, NULL);
111 Color color = hexstr(hex);
113 dynarray_push(label_layer->ids, id);
114 dynarray_push(label_layer->positions, &position);
115 dynarray_push(label_layer->colors, &color);
117 line = line_stream_next(line_stream);
119 log_fail("Could not read label text\n");
122 char *label_text = PUSH_LT(label_layer->lt, string_duplicate(line, NULL), free);
123 trim_endline(label_text);
124 dynarray_push(label_layer->texts, &label_text);
130 void destroy_label_layer(LabelLayer *label_layer)
132 trace_assert(label_layer);
133 destroy_lt(label_layer->lt);
136 int label_layer_render(const LabelLayer *label_layer,
140 trace_assert(label_layer);
141 trace_assert(camera);
143 size_t n = dynarray_count(label_layer->ids);
144 Point *positions = dynarray_data(label_layer->positions);
145 Color *colors = dynarray_data(label_layer->colors);
146 char **texts = dynarray_data(label_layer->texts);
148 /* TODO(#891): LabelLayer doesn't show the final position of Label after the animation */
149 for (size_t i = 0; i < n; ++i) {
150 if (camera_render_text(
156 rgba(1.0f, 1.0f, 1.0f, fa)),
165 int label_layer_event(LabelLayer *label_layer,
166 const SDL_Event *event,
167 const Camera *camera)
169 trace_assert(label_layer);
171 trace_assert(camera);
172 /* TODO(#892): LabelLayer doesn't allow to modify and add labels */
176 size_t label_layer_count(const LabelLayer *label_layer)
178 return dynarray_count(label_layer->ids);
181 char *label_layer_ids(const LabelLayer *label_layer)
183 return dynarray_data(label_layer->ids);
186 Point *label_layer_positions(const LabelLayer *label_layer)
188 return dynarray_data(label_layer->positions);
191 Color *label_layer_colors(const LabelLayer *label_layer)
193 return dynarray_data(label_layer->colors);
196 char **labels_layer_texts(const LabelLayer *label_layer)
198 return dynarray_data(label_layer->texts);