diff options
-rw-r--r-- | include/mgl/graphics/text.h | 2 | ||||
-rw-r--r-- | src/graphics/text.c | 17 |
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) { |