Match perfectly text layout and drawing parameters #693
This commit is contained in:
@@ -933,6 +933,7 @@ void get_text_size(const PangoFontDescription *font,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
PangoAlignment alignment,
|
||||
gboolean markup,
|
||||
double scale)
|
||||
{
|
||||
@@ -951,6 +952,7 @@ void get_text_size(const PangoFontDescription *font,
|
||||
PangoLayout *layout = pango_layout_new(context);
|
||||
pango_layout_set_width(layout, available_width * PANGO_SCALE);
|
||||
pango_layout_set_height(layout, available_height * PANGO_SCALE);
|
||||
pango_layout_set_alignment(layout, alignment);
|
||||
pango_layout_set_wrap(layout, wrap);
|
||||
pango_layout_set_ellipsize(layout, ellipsis);
|
||||
pango_layout_set_font_description(layout, font);
|
||||
@@ -982,38 +984,41 @@ void get_text_size2(const PangoFontDescription *font,
|
||||
int text_len,
|
||||
PangoWrapMode wrap,
|
||||
PangoEllipsizeMode ellipsis,
|
||||
PangoAlignment alignment,
|
||||
gboolean markup,
|
||||
double scale)
|
||||
{
|
||||
get_text_size(font, height, width, available_height, available_width, text, text_len, wrap, ellipsis, markup, scale);
|
||||
get_text_size(font, height, width, available_height, available_width, text, text_len, wrap, ellipsis, alignment, markup, scale);
|
||||
|
||||
// We do multiple passes, because pango sucks
|
||||
int actual_height, actual_width, overflow = 0;
|
||||
while (true) {
|
||||
get_text_size(font, &actual_height, &actual_width, *height, *width, text, text_len, wrap, ellipsis, markup, scale);
|
||||
get_text_size(font, &actual_height, &actual_width, *height, *width, text, text_len, wrap, ellipsis, alignment, markup, scale);
|
||||
if (actual_height <= *height)
|
||||
break;
|
||||
if (*width >= available_width + 50)
|
||||
if (*width >= available_width)
|
||||
break;
|
||||
overflow = 1;
|
||||
fprintf(stderr, "tint2: text overflows, recomputing: available %dx%d, computed %dx%d, actual %dx%d\n",
|
||||
fprintf(stderr, "tint2: text overflows, recomputing: available %dx%d, computed %dx%d, actual %dx%d: %s\n",
|
||||
available_width,
|
||||
available_height,
|
||||
*width,
|
||||
*height,
|
||||
actual_width,
|
||||
actual_height);
|
||||
actual_height,
|
||||
text);
|
||||
(*width)++;
|
||||
}
|
||||
if (overflow) {
|
||||
*height = actual_height;
|
||||
fprintf(stderr, "tint2: text final size computed as: available %dx%d, computed %dx%d, actual %dx%d\n",
|
||||
fprintf(stderr, "tint2: text final size computed as: available %dx%d, computed %dx%d, actual %dx%d: %s\n",
|
||||
available_width,
|
||||
available_height,
|
||||
*width,
|
||||
*height,
|
||||
actual_width,
|
||||
actual_height);
|
||||
actual_height,
|
||||
text);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user