summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--framebuffer/font_freetype.c24
-rw-r--r--framebuffer/font_internal.c27
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;