Преглед на файлове

Merge pull request #99906 from bruvzg/lbl_empty_lines

[Label] Fix empty paragraph height.
Rémi Verschelde преди 9 месеца
родител
ревизия
715a7bac00
променени са 1 файла, в които са добавени 36 реда и са изтрити 10 реда
  1. 36 10
      scene/gui/label.cpp

+ 36 - 10
scene/gui/label.cpp

@@ -91,10 +91,12 @@ bool Label::is_uppercase() const {
 
 int Label::get_line_height(int p_line) const {
 	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 	if (p_line >= 0 && p_line < total_line_count) {
-		return TS->shaped_text_get_size(get_line_rid(p_line)).y;
+		return MAX(font_h, TS->shaped_text_get_size(get_line_rid(p_line)).y);
 	} else if (total_line_count > 0) {
-		int h = 0;
+		int h = font_h;
 		for (const Paragraph &para : paragraphs) {
 			for (const RID &line_rid : para.lines_rid) {
 				h = MAX(h, TS->shaped_text_get_size(line_rid).y);
@@ -102,7 +104,6 @@ int Label::get_line_height(int p_line) const {
 		}
 		return h;
 	} else {
-		int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
 		return font->get_height(font_size);
 	}
 }
@@ -334,6 +335,9 @@ void Label::_update_visible() const {
 	int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing;
 	int paragraph_spacing = settings.is_valid() ? settings->get_paragraph_spacing() : theme_cache.paragraph_spacing;
 	Ref<StyleBox> style = theme_cache.normal_style;
+	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 	int lines_visible = total_line_count;
 
 	if (max_lines_visible >= 0 && lines_visible > max_lines_visible) {
@@ -354,7 +358,7 @@ void Label::_update_visible() const {
 				break;
 			}
 			for (int i = start; i < end; i++) {
-				minsize.height += TS->shaped_text_get_size(para.lines_rid[i]).y + line_spacing;
+				minsize.height += MAX(font_h, TS->shaped_text_get_size(para.lines_rid[i]).y) + line_spacing;
 			}
 			minsize.height += paragraph_spacing;
 			line_index += para.lines_rid.size();
@@ -447,8 +451,12 @@ Rect2 Label::_get_line_rect(int p_para, int p_line) const {
 	bool rtl = TS->shaped_text_get_inferred_direction(paragraphs[p_para].text_rid) == TextServer::DIRECTION_RTL;
 	bool rtl_layout = is_layout_rtl();
 	Ref<StyleBox> style = theme_cache.normal_style;
+	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 	Size2 size = get_size();
 	Size2 line_size = TS->shaped_text_get_size(paragraphs[p_para].lines_rid[p_line]);
+	line_size.y = MAX(font_h, line_size.y);
 	Vector2 offset;
 	switch (horizontal_alignment) {
 		case HORIZONTAL_ALIGNMENT_FILL:
@@ -485,6 +493,9 @@ int Label::get_layout_data(Vector2 &r_offset, int &r_last_line, int &r_line_spac
 	// for a given line of text.
 	Size2 size = get_size();
 	Ref<StyleBox> style = theme_cache.normal_style;
+	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 	int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing;
 	int paragraph_spacing = settings.is_valid() ? settings->get_paragraph_spacing() : theme_cache.paragraph_spacing;
 	float total_h = 0.0;
@@ -498,7 +509,7 @@ int Label::get_layout_data(Vector2 &r_offset, int &r_last_line, int &r_line_spac
 		} else {
 			int start = (line_index < lines_skipped) ? lines_skipped - line_index : 0;
 			for (int i = start; i < para.lines_rid.size(); i++) {
-				total_h += TS->shaped_text_get_size(para.lines_rid[i]).y + line_spacing;
+				total_h += MAX(font_h, TS->shaped_text_get_size(para.lines_rid[i]).y) + line_spacing;
 				if (total_h > (get_size().height - style->get_minimum_size().height + line_spacing)) {
 					break;
 				}
@@ -529,7 +540,7 @@ int Label::get_layout_data(Vector2 &r_offset, int &r_last_line, int &r_line_spac
 				break;
 			}
 			for (int i = start; i < end; i++) {
-				total_h += TS->shaped_text_get_size(para.lines_rid[i]).y + line_spacing;
+				total_h += MAX(font_h, TS->shaped_text_get_size(para.lines_rid[i]).y) + line_spacing;
 				total_glyphs += TS->shaped_text_get_glyph_count(para.lines_rid[i]) + TS->shaped_text_get_ellipsis_glyph_count(para.lines_rid[i]);
 			}
 			total_h += paragraph_spacing;
@@ -658,6 +669,9 @@ void Label::_notification(int p_what) {
 
 			Size2 string_size;
 			Ref<StyleBox> style = theme_cache.normal_style;
+			Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+			int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+			int font_h = font->get_height(font_size);
 			Color font_color = has_settings ? settings->get_font_color() : theme_cache.font_color;
 			Color font_shadow_color = has_settings ? settings->get_shadow_color() : theme_cache.font_shadow_color;
 			Point2 shadow_ofs = has_settings ? settings->get_shadow_offset() : theme_cache.font_shadow_offset;
@@ -697,6 +711,12 @@ void Label::_notification(int p_what) {
 						Vector2 line_offset = _get_line_rect(p, i).position;
 						ofs.x = line_offset.x;
 
+						int asc = TS->shaped_text_get_ascent(line_rid);
+						int dsc = TS->shaped_text_get_descent(line_rid);
+						if (asc + dsc < font_h) {
+							dsc = font_h - asc;
+						}
+
 						const Glyph *glyphs = TS->shaped_text_get_glyphs(line_rid);
 						int gl_size = TS->shaped_text_get_glyph_count(line_rid);
 
@@ -706,7 +726,7 @@ void Label::_notification(int p_what) {
 						const Glyph *ellipsis_glyphs = TS->shaped_text_get_ellipsis_glyphs(line_rid);
 						int ellipsis_gl_size = TS->shaped_text_get_ellipsis_glyph_count(line_rid);
 
-						ofs.y += TS->shaped_text_get_ascent(line_rid);
+						ofs.y += asc;
 
 						// Draw shadow, outline and text. Note: Do not merge this into the single loop iteration, to prevent overlaps.
 						int processed_glyphs_step = 0;
@@ -789,7 +809,7 @@ void Label::_notification(int p_what) {
 							}
 						}
 						processed_glyphs = processed_glyphs_step;
-						ofs.y += TS->shaped_text_get_descent(line_rid) + line_spacing;
+						ofs.y += dsc + line_spacing;
 					}
 					ofs.y += paragraph_spacing;
 					line_index += para.lines_rid.size();
@@ -814,6 +834,9 @@ Rect2 Label::get_character_bounds(int p_pos) const {
 	_ensure_shaped();
 
 	int paragraph_spacing = settings.is_valid() ? settings->get_paragraph_spacing() : theme_cache.paragraph_spacing;
+	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 
 	Vector2 ofs;
 	int line_spacing;
@@ -855,7 +878,7 @@ Rect2 Label::get_character_bounds(int p_pos) const {
 					}
 					gl_off += glyphs[j].advance * glyphs[j].repeat;
 				}
-				ofs.y += TS->shaped_text_get_ascent(line_rid) + TS->shaped_text_get_descent(line_rid) + line_spacing;
+				ofs.y += MAX(font_h, TS->shaped_text_get_ascent(line_rid) + TS->shaped_text_get_descent(line_rid)) + line_spacing;
 			}
 			ofs.y += paragraph_spacing;
 			line_index += para.lines_rid.size();
@@ -909,6 +932,9 @@ int Label::get_line_count() const {
 
 int Label::get_visible_line_count() const {
 	Ref<StyleBox> style = theme_cache.normal_style;
+	Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : theme_cache.font;
+	int font_size = settings.is_valid() ? settings->get_font_size() : theme_cache.font_size;
+	int font_h = font->get_height(font_size);
 	int line_spacing = settings.is_valid() ? settings->get_line_spacing() : theme_cache.line_spacing;
 	int paragraph_spacing = settings.is_valid() ? settings->get_paragraph_spacing() : theme_cache.paragraph_spacing;
 	int lines_visible = 0;
@@ -921,7 +947,7 @@ int Label::get_visible_line_count() const {
 		} else {
 			int start = (line_index < lines_skipped) ? lines_skipped - line_index : 0;
 			for (int i = start; i < para.lines_rid.size(); i++) {
-				total_h += TS->shaped_text_get_size(para.lines_rid[i]).y + line_spacing;
+				total_h += MAX(font_h, TS->shaped_text_get_size(para.lines_rid[i]).y) + line_spacing;
 				if (total_h > (get_size().height - style->get_minimum_size().height + line_spacing)) {
 					break;
 				}