From 3148f8a6c34c4d41652132595fe0fce99750cc5a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sun, 10 Feb 2013 18:26:59 +0000 Subject: Make compatible with new nsfont_split expectations. Only splits on spaces. --- framebuffer/font_freetype.c | 24 +++++++++++++++--------- framebuffer/font_internal.c | 27 +++++++++++++++++++++------ 2 files changed, 36 insertions(+), 15 deletions(-) (limited to 'framebuffer') diff --git a/framebuffer/font_freetype.c b/framebuffer/font_freetype.c index c2279a116..987b101c7 100644 --- a/framebuffer/font_freetype.c +++ b/framebuffer/font_freetype.c @@ -497,15 +497,22 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle, * * \param fstyle style for this text * \param string UTF-8 string to measure - * \param length length of string + * \param length length of string, in bytes * \param x width available - * \param char_offset updated to offset in string of actual_x, [0..length] + * \param char_offset updated to offset in string of actual_x, [1..length] * \param actual_x updated to x coordinate of character closest to x * \return true on success, false on error and error reported * - * On exit, [char_offset == 0 || - * string[char_offset] == ' ' || - * char_offset == length] + * On exit, char_offset indicates first character after split point. + * + * Note: char_offset of 0 should never be returned. + * + * Returns: + * char_offset giving split point closest to x, where actual_x <= x + * else + * char_offset giving split point closest to x, where actual_x > x + * + * Returning char_offset == length means no split possible */ static bool nsfont_split(const plot_font_style_t *fstyle, @@ -532,10 +539,9 @@ static bool nsfont_split(const plot_font_style_t *fstyle, } *actual_x += glyph->advance.x >> 16; - if (*actual_x > x) { - /* string has exceeded available width return previous - * space - */ + if (*actual_x > x && last_space_idx != 0) { + /* string has exceeded available width and we've + * found a space; return previous space */ *actual_x = last_space_x; *char_offset = last_space_idx; return true; diff --git a/framebuffer/font_internal.c b/framebuffer/font_internal.c index 6535ac4d5..ff2bfa1ef 100644 --- a/framebuffer/font_internal.c +++ b/framebuffer/font_internal.c @@ -121,20 +121,28 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle, } + /** * Find where to split a string to make it fit a width. * * \param fstyle style for this text * \param string UTF-8 string to measure - * \param length length of string + * \param length length of string, in bytes * \param x width available - * \param char_offset updated to offset in string of actual_x, [0..length] + * \param char_offset updated to offset in string of actual_x, [1..length] * \param actual_x updated to x coordinate of character closest to x * \return true on success, false on error and error reported * - * On exit, [char_offset == 0 || - * string[char_offset] == ' ' || - * char_offset == length] + * On exit, char_offset indicates first character after split point. + * + * Note: char_offset of 0 should never be returned. + * + * Returns: + * char_offset giving split point closest to x, where actual_x <= x + * else + * char_offset giving split point closest to x, where actual_x > x + * + * Returning char_offset == length means no split possible */ static bool nsfont_split(const plot_font_style_t *fstyle, @@ -143,7 +151,7 @@ static bool nsfont_split(const plot_font_style_t *fstyle, { const struct fb_font_desc* fb_font = fb_get_font(fstyle); - *char_offset = x / fb_font->width; + int c_off = *char_offset = x / fb_font->width; if (*char_offset > length) { *char_offset = length; } else { @@ -152,6 +160,13 @@ static bool nsfont_split(const plot_font_style_t *fstyle, break; (*char_offset)--; } + if (*char_offset == 0) { + *char_offset = c_off; + while (*char_offset < length && + string[*char_offset] != ' ') { + (*char_offset)++; + } + } } *actual_x = *char_offset * fb_font->width; return true; -- cgit v1.2.3