diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2013-02-10 18:26:59 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2013-02-10 18:26:59 +0000 |
commit | 3148f8a6c34c4d41652132595fe0fce99750cc5a (patch) | |
tree | 3bdaed2fb25f5364fb0f7714ede6252be0d9203e | |
parent | db8ec60fc04930a0dc03a67853af9cffaf4fc4bf (diff) | |
download | netsurf-3148f8a6c34c4d41652132595fe0fce99750cc5a.tar.gz netsurf-3148f8a6c34c4d41652132595fe0fce99750cc5a.tar.bz2 |
Make compatible with new nsfont_split expectations. Only splits on spaces.
-rw-r--r-- | framebuffer/font_freetype.c | 24 | ||||
-rw-r--r-- | framebuffer/font_internal.c | 27 |
2 files changed, 36 insertions, 15 deletions
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; |