aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mgl/graphics/text.h2
-rw-r--r--src/graphics/text.c17
2 files changed, 12 insertions, 7 deletions
diff --git a/include/mgl/graphics/text.h b/include/mgl/graphics/text.h
index 4dd0219..8e4817b 100644
--- a/include/mgl/graphics/text.h
+++ b/include/mgl/graphics/text.h
@@ -48,7 +48,7 @@ void mgl_text_set_max_width(mgl_text *self, float max_width);
/* If |max_rows| is 0 then the text can display an unlimited amount of rows */
void mgl_text_set_max_rows(mgl_text *self, unsigned int max_rows);
mgl_vec2f mgl_text_get_bounds(mgl_text *self);
-/* Returns the position of the character on the screen (relative to the current mgl_view) */
+/* Returns the position of the character relative to the window top left (relative to the current mgl_view) */
mgl_vec2f mgl_text_find_character_pos(mgl_text *self, size_t index);
void mgl_text_draw(mgl_context *context, mgl_text *text);
diff --git a/src/graphics/text.c b/src/graphics/text.c
index e17dd5a..e84e4b1 100644
--- a/src/graphics/text.c
+++ b/src/graphics/text.c
@@ -178,25 +178,30 @@ mgl_vec2f mgl_text_get_bounds(mgl_text *self) {
}
typedef struct {
- mgl_vec2f position;
+ mgl_vec2f glyph_offset;
const mgl_text *text;
size_t index;
} FindCharacterPosUserdata;
static bool find_character_pos_callback(codepoint_loop_callback_data callback_data, void *userdata) {
FindCharacterPosUserdata *find_character_pos_userdata = userdata;
- find_character_pos_userdata->position.x = find_character_pos_userdata->position.x + callback_data.glyph_offset.x;
- find_character_pos_userdata->position.y = find_character_pos_userdata->position.y + callback_data.glyph_offset.y;
- return callback_data.codepoint_index < find_character_pos_userdata->index;
+ find_character_pos_userdata->glyph_offset = callback_data.glyph_offset;
+ if(callback_data.codepoint_index >= find_character_pos_userdata->index)
+ return false;
+
+ find_character_pos_userdata->glyph_offset.x += callback_data.glyph_width;
+ if(callback_data.codepoint == '\n')
+ find_character_pos_userdata->glyph_offset.y += find_character_pos_userdata->text->font->character_size;
+ return true;
}
mgl_vec2f mgl_text_find_character_pos(mgl_text *self, size_t index) {
FindCharacterPosUserdata find_character_pos_userdata;
- find_character_pos_userdata.position = self->position;
+ find_character_pos_userdata.glyph_offset = (mgl_vec2f){0.0f, 0.0f};
find_character_pos_userdata.text = self;
find_character_pos_userdata.index = index;
mgl_text_for_each_codepoint(self, find_character_pos_callback, &find_character_pos_userdata);
- return (mgl_vec2f){ find_character_pos_userdata.position.x, find_character_pos_userdata.position.y };
+ return (mgl_vec2f){ self->position.x + find_character_pos_userdata.glyph_offset.x, self->position.y + find_character_pos_userdata.glyph_offset.y };
}
static void mgl_text_draw_glyph(mgl_context *context, const mgl_font_glyph *glyph, mgl_vec2i position) {