Browse Source

[RichTextLabel] Fix theme bold / italics / bold italics and mono font size not applied correctly.

bruvzg 3 years ago
parent
commit
94e5ad2019
3 changed files with 135 additions and 72 deletions
  1. 1 0
      doc/classes/RichTextLabel.xml
  2. 130 69
      scene/gui/rich_text_label.cpp
  3. 4 3
      scene/gui/rich_text_label.h

+ 1 - 0
doc/classes/RichTextLabel.xml

@@ -272,6 +272,7 @@
 		<method name="push_font">
 		<method name="push_font">
 			<return type="void" />
 			<return type="void" />
 			<argument index="0" name="font" type="Font" />
 			<argument index="0" name="font" type="Font" />
+			<argument index="1" name="font_size" type="int" />
 			<description>
 			<description>
 				Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for its duration.
 				Adds a [code][font][/code] tag to the tag stack. Overrides default fonts for its duration.
 			</description>
 			</description>

+ 130 - 69
scene/gui/rich_text_label.cpp

@@ -224,13 +224,21 @@ void RichTextLabel::_update_line_font(ItemFrame *p_frame, int p_line, const Ref<
 	for (int i = 0; i < spans; i++) {
 	for (int i = 0; i < spans; i++) {
 		ItemText *it = reinterpret_cast<ItemText *>((uint64_t)TS->shaped_get_span_meta(t, i));
 		ItemText *it = reinterpret_cast<ItemText *>((uint64_t)TS->shaped_get_span_meta(t, i));
 		if (it) {
 		if (it) {
-			Ref<Font> font = _find_font(it);
-			if (font.is_null()) {
-				font = p_base_font;
+			Ref<Font> font = p_base_font;
+			int font_size = p_base_font_size;
+
+			ItemFont *font_it = _find_font(it);
+			if (font_it) {
+				if (font_it->font.is_valid()) {
+					font = font_it->font;
+				}
+				if (font_it->font_size > 0) {
+					font_size = font_it->font_size;
+				}
 			}
 			}
-			int font_size = _find_font_size(it);
-			if (font_size == -1) {
-				font_size = p_base_font_size;
+			ItemFontSize *font_size_it = _find_font_size(it);
+			if (font_size_it && font_size_it->font_size > 0) {
+				font_size = font_size_it->font_size;
 			}
 			}
 			TS->shaped_set_span_update_font(t, i, font->get_rids(), font_size, font->get_opentype_features());
 			TS->shaped_set_span_update_font(t, i, font->get_rids(), font_size, font->get_opentype_features());
 			for (int j = 0; j < TextServer::SPACING_MAX; j++) {
 			for (int j = 0; j < TextServer::SPACING_MAX; j++) {
@@ -483,13 +491,21 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
 				l.dc_ol_color = dc->ol_color;
 				l.dc_ol_color = dc->ol_color;
 			} break;
 			} break;
 			case ITEM_NEWLINE: {
 			case ITEM_NEWLINE: {
-				Ref<Font> font = _find_font(it);
-				if (font.is_null()) {
-					font = p_base_font;
+				Ref<Font> font = p_base_font;
+				int font_size = p_base_font_size;
+
+				ItemFont *font_it = _find_font(it);
+				if (font_it) {
+					if (font_it->font.is_valid()) {
+						font = font_it->font;
+					}
+					if (font_it->font_size > 0) {
+						font_size = font_it->font_size;
+					}
 				}
 				}
-				int font_size = _find_font_size(it);
-				if (font_size == -1) {
-					font_size = p_base_font_size;
+				ItemFontSize *font_size_it = _find_font_size(it);
+				if (font_size_it && font_size_it->font_size > 0) {
+					font_size = font_size_it->font_size;
 				}
 				}
 				l.text_buf->add_string("\n", font, font_size);
 				l.text_buf->add_string("\n", font, font_size);
 				text += "\n";
 				text += "\n";
@@ -498,13 +514,21 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font>
 			} break;
 			} break;
 			case ITEM_TEXT: {
 			case ITEM_TEXT: {
 				ItemText *t = static_cast<ItemText *>(it);
 				ItemText *t = static_cast<ItemText *>(it);
-				Ref<Font> font = _find_font(it);
-				if (font.is_null()) {
-					font = p_base_font;
+				Ref<Font> font = p_base_font;
+				int font_size = p_base_font_size;
+
+				ItemFont *font_it = _find_font(it);
+				if (font_it) {
+					if (font_it->font.is_valid()) {
+						font = font_it->font;
+					}
+					if (font_it->font_size > 0) {
+						font_size = font_it->font_size;
+					}
 				}
 				}
-				int font_size = _find_font_size(it);
-				if (font_size == -1) {
-					font_size = p_base_font_size;
+				ItemFontSize *font_size_it = _find_font_size(it);
+				if (font_size_it && font_size_it->font_size > 0) {
+					font_size = font_size_it->font_size;
 				}
 				}
 				String lang = _find_language(it);
 				String lang = _find_language(it);
 				String tx = t->text;
 				String tx = t->text;
@@ -750,13 +774,21 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
 		}
 		}
 	}
 	}
 	if (!prefix.is_empty()) {
 	if (!prefix.is_empty()) {
-		Ref<Font> font = _find_font(l.from);
-		if (font.is_null()) {
-			font = get_theme_font(SNAME("normal_font"));
+		Ref<Font> font = get_theme_font(SNAME("normal_font"));
+		int font_size = get_theme_font_size(SNAME("normal_font_size"));
+
+		ItemFont *font_it = _find_font(l.from);
+		if (font_it) {
+			if (font_it->font.is_valid()) {
+				font = font_it->font;
+			}
+			if (font_it->font_size > 0) {
+				font_size = font_it->font_size;
+			}
 		}
 		}
-		int font_size = _find_font_size(l.from);
-		if (font_size == -1) {
-			font_size = get_theme_font_size(SNAME("normal_font_size"));
+		ItemFontSize *font_size_it = _find_font_size(l.from);
+		if (font_size_it && font_size_it->font_size > 0) {
+			font_size = font_size_it->font_size;
 		}
 		}
 		if (rtl) {
 		if (rtl) {
 			float offx = 0.0f;
 			float offx = 0.0f;
@@ -1519,13 +1551,20 @@ float RichTextLabel::_find_click_in_line(ItemFrame *p_frame, int p_line, const V
 				int stop = text_rect_begin;
 				int stop = text_rect_begin;
 				*r_click_item = _find_indentable(it);
 				*r_click_item = _find_indentable(it);
 				while (*r_click_item) {
 				while (*r_click_item) {
-					Ref<Font> font = _find_font(*r_click_item);
-					if (!font.is_valid()) {
-						font = get_theme_font(SNAME("normal_font"));
+					Ref<Font> font = get_theme_font(SNAME("normal_font"));
+					int font_size = get_theme_font_size(SNAME("normal_font_size"));
+					ItemFont *font_it = _find_font(*r_click_item);
+					if (font_it) {
+						if (font_it->font.is_valid()) {
+							font = font_it->font;
+						}
+						if (font_it->font_size > 0) {
+							font_size = font_it->font_size;
+						}
 					}
 					}
-					int font_size = _find_font_size(*r_click_item);
-					if (font_size == -1) {
-						font_size = get_theme_font_size(SNAME("normal_font_size"));
+					ItemFontSize *font_size_it = _find_font_size(*r_click_item);
+					if (font_size_it && font_size_it->font_size > 0) {
+						font_size = font_size_it->font_size;
 					}
 					}
 					if (rtl) {
 					if (rtl) {
 						stop += tab_size * font->get_char_size(' ', font_size).width;
 						stop += tab_size * font->get_char_size(' ', font_size).width;
@@ -2109,34 +2148,34 @@ RichTextLabel::Item *RichTextLabel::_find_indentable(Item *p_item) {
 	return indentable;
 	return indentable;
 }
 }
 
 
-Ref<Font> RichTextLabel::_find_font(Item *p_item) {
+RichTextLabel::ItemFont *RichTextLabel::_find_font(Item *p_item) {
 	Item *fontitem = p_item;
 	Item *fontitem = p_item;
 
 
 	while (fontitem) {
 	while (fontitem) {
 		if (fontitem->type == ITEM_FONT) {
 		if (fontitem->type == ITEM_FONT) {
 			ItemFont *fi = static_cast<ItemFont *>(fontitem);
 			ItemFont *fi = static_cast<ItemFont *>(fontitem);
-			return fi->font;
+			return fi;
 		}
 		}
 
 
 		fontitem = fontitem->parent;
 		fontitem = fontitem->parent;
 	}
 	}
 
 
-	return Ref<Font>();
+	return nullptr;
 }
 }
 
 
-int RichTextLabel::_find_font_size(Item *p_item) {
+RichTextLabel::ItemFontSize *RichTextLabel::_find_font_size(Item *p_item) {
 	Item *sizeitem = p_item;
 	Item *sizeitem = p_item;
 
 
 	while (sizeitem) {
 	while (sizeitem) {
 		if (sizeitem->type == ITEM_FONT_SIZE) {
 		if (sizeitem->type == ITEM_FONT_SIZE) {
 			ItemFontSize *fi = static_cast<ItemFontSize *>(sizeitem);
 			ItemFontSize *fi = static_cast<ItemFontSize *>(sizeitem);
-			return fi->font_size;
+			return fi;
 		}
 		}
 
 
 		sizeitem = sizeitem->parent;
 		sizeitem = sizeitem->parent;
 	}
 	}
 
 
-	return -1;
+	return nullptr;
 }
 }
 
 
 int RichTextLabel::_find_outline_size(Item *p_item, int p_default) {
 int RichTextLabel::_find_outline_size(Item *p_item, int p_default) {
@@ -2222,24 +2261,40 @@ int RichTextLabel::_find_margin(Item *p_item, const Ref<Font> &p_base_font, int
 
 
 	while (item) {
 	while (item) {
 		if (item->type == ITEM_INDENT) {
 		if (item->type == ITEM_INDENT) {
-			Ref<Font> font = _find_font(item);
-			if (font.is_null()) {
-				font = p_base_font;
+			Ref<Font> font = p_base_font;
+			int font_size = p_base_font_size;
+
+			ItemFont *font_it = _find_font(item);
+			if (font_it) {
+				if (font_it->font.is_valid()) {
+					font = font_it->font;
+				}
+				if (font_it->font_size > 0) {
+					font_size = font_it->font_size;
+				}
 			}
 			}
-			int font_size = _find_font_size(item);
-			if (font_size == -1) {
-				font_size = p_base_font_size;
+			ItemFontSize *font_size_it = _find_font_size(item);
+			if (font_size_it && font_size_it->font_size > 0) {
+				font_size = font_size_it->font_size;
 			}
 			}
 			margin += tab_size * font->get_char_size(' ', font_size).width;
 			margin += tab_size * font->get_char_size(' ', font_size).width;
 
 
 		} else if (item->type == ITEM_LIST) {
 		} else if (item->type == ITEM_LIST) {
-			Ref<Font> font = _find_font(item);
-			if (font.is_null()) {
-				font = p_base_font;
+			Ref<Font> font = p_base_font;
+			int font_size = p_base_font_size;
+
+			ItemFont *font_it = _find_font(item);
+			if (font_it) {
+				if (font_it->font.is_valid()) {
+					font = font_it->font;
+				}
+				if (font_it->font_size > 0) {
+					font_size = font_it->font_size;
+				}
 			}
 			}
-			int font_size = _find_font_size(item);
-			if (font_size == -1) {
-				font_size = p_base_font_size;
+			ItemFontSize *font_size_it = _find_font_size(item);
+			if (font_size_it && font_size_it->font_size > 0) {
+				font_size = font_size_it->font_size;
 			}
 			}
 			margin += tab_size * font->get_char_size(' ', font_size).width;
 			margin += tab_size * font->get_char_size(' ', font_size).width;
 		}
 		}
@@ -2918,7 +2973,7 @@ void RichTextLabel::push_dropcap(const String &p_string, const Ref<Font> &p_font
 	_add_item(item, false);
 	_add_item(item, false);
 }
 }
 
 
-void RichTextLabel::push_font(const Ref<Font> &p_font) {
+void RichTextLabel::push_font(const Ref<Font> &p_font, int p_size) {
 	_stop_thread();
 	_stop_thread();
 	MutexLock data_lock(data_mutex);
 	MutexLock data_lock(data_mutex);
 
 
@@ -2927,6 +2982,7 @@ void RichTextLabel::push_font(const Ref<Font> &p_font) {
 	ItemFont *item = memnew(ItemFont);
 	ItemFont *item = memnew(ItemFont);
 
 
 	item->font = p_font;
 	item->font = p_font;
+	item->font_size = p_size;
 	_add_item(item, true);
 	_add_item(item, true);
 }
 }
 
 
@@ -2934,35 +2990,35 @@ void RichTextLabel::push_normal() {
 	Ref<Font> normal_font = get_theme_font(SNAME("normal_font"));
 	Ref<Font> normal_font = get_theme_font(SNAME("normal_font"));
 	ERR_FAIL_COND(normal_font.is_null());
 	ERR_FAIL_COND(normal_font.is_null());
 
 
-	push_font(normal_font);
+	push_font(normal_font, get_theme_font_size(SNAME("normal_font_size")));
 }
 }
 
 
 void RichTextLabel::push_bold() {
 void RichTextLabel::push_bold() {
 	Ref<Font> bold_font = get_theme_font(SNAME("bold_font"));
 	Ref<Font> bold_font = get_theme_font(SNAME("bold_font"));
 	ERR_FAIL_COND(bold_font.is_null());
 	ERR_FAIL_COND(bold_font.is_null());
 
 
-	push_font(bold_font);
+	push_font(bold_font, get_theme_font_size(SNAME("bold_font_size")));
 }
 }
 
 
 void RichTextLabel::push_bold_italics() {
 void RichTextLabel::push_bold_italics() {
 	Ref<Font> bold_italics_font = get_theme_font(SNAME("bold_italics_font"));
 	Ref<Font> bold_italics_font = get_theme_font(SNAME("bold_italics_font"));
 	ERR_FAIL_COND(bold_italics_font.is_null());
 	ERR_FAIL_COND(bold_italics_font.is_null());
 
 
-	push_font(bold_italics_font);
+	push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
 }
 }
 
 
 void RichTextLabel::push_italics() {
 void RichTextLabel::push_italics() {
 	Ref<Font> italics_font = get_theme_font(SNAME("italics_font"));
 	Ref<Font> italics_font = get_theme_font(SNAME("italics_font"));
 	ERR_FAIL_COND(italics_font.is_null());
 	ERR_FAIL_COND(italics_font.is_null());
 
 
-	push_font(italics_font);
+	push_font(italics_font, get_theme_font_size(SNAME("italics_font_size")));
 }
 }
 
 
 void RichTextLabel::push_mono() {
 void RichTextLabel::push_mono() {
 	Ref<Font> mono_font = get_theme_font(SNAME("mono_font"));
 	Ref<Font> mono_font = get_theme_font(SNAME("mono_font"));
 	ERR_FAIL_COND(mono_font.is_null());
 	ERR_FAIL_COND(mono_font.is_null());
 
 
-	push_font(mono_font);
+	push_font(mono_font, get_theme_font_size(SNAME("mono_font_size")));
 }
 }
 
 
 void RichTextLabel::push_font_size(int p_font_size) {
 void RichTextLabel::push_font_size(int p_font_size) {
@@ -3552,9 +3608,9 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 			//use bold font
 			//use bold font
 			in_bold = true;
 			in_bold = true;
 			if (in_italics) {
 			if (in_italics) {
-				push_font(bold_italics_font);
+				push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
 			} else {
 			} else {
-				push_font(bold_font);
+				push_font(bold_font, get_theme_font_size(SNAME("bold_font_size")));
 			}
 			}
 			pos = brk_end + 1;
 			pos = brk_end + 1;
 			tag_stack.push_front(tag);
 			tag_stack.push_front(tag);
@@ -3562,15 +3618,15 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 			//use italics font
 			//use italics font
 			in_italics = true;
 			in_italics = true;
 			if (in_bold) {
 			if (in_bold) {
-				push_font(bold_italics_font);
+				push_font(bold_italics_font, get_theme_font_size(SNAME("bold_italics_font_size")));
 			} else {
 			} else {
-				push_font(italics_font);
+				push_font(italics_font, get_theme_font_size(SNAME("italics_font_size")));
 			}
 			}
 			pos = brk_end + 1;
 			pos = brk_end + 1;
 			tag_stack.push_front(tag);
 			tag_stack.push_front(tag);
 		} else if (tag == "code") {
 		} else if (tag == "code") {
 			//use monospace font
 			//use monospace font
-			push_font(mono_font);
+			push_font(mono_font, get_theme_font_size(SNAME("mono_font_size")));
 			pos = brk_end + 1;
 			pos = brk_end + 1;
 			tag_stack.push_front(tag);
 			tag_stack.push_front(tag);
 		} else if (tag.begins_with("table=")) {
 		} else if (tag.begins_with("table=")) {
@@ -3999,9 +4055,16 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 			String fnt_ftr = tag.substr(18, tag.length());
 			String fnt_ftr = tag.substr(18, tag.length());
 			Vector<String> subtag = fnt_ftr.split(",");
 			Vector<String> subtag = fnt_ftr.split(",");
 			if (subtag.size() > 0) {
 			if (subtag.size() > 0) {
-				Ref<Font> font = _find_font(current);
-				if (font.is_null()) {
-					font = normal_font;
+				Ref<Font> font = normal_font;
+				int font_size = 0;
+				ItemFont *font_it = _find_font(current);
+				if (font_it) {
+					if (font_it->font.is_valid()) {
+						font = font_it->font;
+					}
+					if (font_it->font_size > 0) {
+						font_size = font_it->font_size;
+					}
 				}
 				}
 				Ref<FontVariation> fc;
 				Ref<FontVariation> fc;
 				fc.instantiate();
 				fc.instantiate();
@@ -4016,7 +4079,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 					}
 					}
 				}
 				}
 				fc->set_opentype_features(features);
 				fc->set_opentype_features(features);
-				push_font(fc);
+				push_font(fc, font_size);
 			}
 			}
 			pos = brk_end + 1;
 			pos = brk_end + 1;
 			tag_stack.push_front("opentype_features");
 			tag_stack.push_front("opentype_features");
@@ -4037,6 +4100,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 
 
 			Ref<FontVariation> fc;
 			Ref<FontVariation> fc;
 			fc.instantiate();
 			fc.instantiate();
+			int fnt_size = 0;
 			for (int i = 1; i < subtag.size(); i++) {
 			for (int i = 1; i < subtag.size(); i++) {
 				Vector<String> subtag_a = subtag[i].split("=", true, 2);
 				Vector<String> subtag_a = subtag[i].split("=", true, 2);
 				if (subtag_a.size() == 2) {
 				if (subtag_a.size() == 2) {
@@ -4047,10 +4111,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 							fc->set_base_font(font_data);
 							fc->set_base_font(font_data);
 						}
 						}
 					} else if (subtag_a[0] == "size" || subtag_a[0] == "s") {
 					} else if (subtag_a[0] == "size" || subtag_a[0] == "s") {
-						int fnt_size = subtag_a[1].to_int();
-						if (fnt_size > 0) {
-							push_font_size(fnt_size);
-						}
+						fnt_size = subtag_a[1].to_int();
 					} else if (subtag_a[0] == "glyph_spacing" || subtag_a[0] == "gl") {
 					} else if (subtag_a[0] == "glyph_spacing" || subtag_a[0] == "gl") {
 						int spacing = subtag_a[1].to_int();
 						int spacing = subtag_a[1].to_int();
 						fc->set_spacing(TextServer::SPACING_GLYPH, spacing);
 						fc->set_spacing(TextServer::SPACING_GLYPH, spacing);
@@ -4101,7 +4162,7 @@ void RichTextLabel::append_text(const String &p_bbcode) {
 					}
 					}
 				}
 				}
 			}
 			}
-			push_font(fc);
+			push_font(fc, fnt_size);
 			pos = brk_end + 1;
 			pos = brk_end + 1;
 			tag_stack.push_front("font");
 			tag_stack.push_front("font");
 
 
@@ -4929,7 +4990,7 @@ void RichTextLabel::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("add_image", "image", "width", "height", "color", "inline_align"), &RichTextLabel::add_image, DEFVAL(0), DEFVAL(0), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(INLINE_ALIGNMENT_CENTER));
 	ClassDB::bind_method(D_METHOD("add_image", "image", "width", "height", "color", "inline_align"), &RichTextLabel::add_image, DEFVAL(0), DEFVAL(0), DEFVAL(Color(1.0, 1.0, 1.0)), DEFVAL(INLINE_ALIGNMENT_CENTER));
 	ClassDB::bind_method(D_METHOD("newline"), &RichTextLabel::add_newline);
 	ClassDB::bind_method(D_METHOD("newline"), &RichTextLabel::add_newline);
 	ClassDB::bind_method(D_METHOD("remove_line", "line"), &RichTextLabel::remove_line);
 	ClassDB::bind_method(D_METHOD("remove_line", "line"), &RichTextLabel::remove_line);
-	ClassDB::bind_method(D_METHOD("push_font", "font"), &RichTextLabel::push_font);
+	ClassDB::bind_method(D_METHOD("push_font", "font", "font_size"), &RichTextLabel::push_font);
 	ClassDB::bind_method(D_METHOD("push_font_size", "font_size"), &RichTextLabel::push_font_size);
 	ClassDB::bind_method(D_METHOD("push_font_size", "font_size"), &RichTextLabel::push_font_size);
 	ClassDB::bind_method(D_METHOD("push_normal"), &RichTextLabel::push_normal);
 	ClassDB::bind_method(D_METHOD("push_normal"), &RichTextLabel::push_normal);
 	ClassDB::bind_method(D_METHOD("push_bold"), &RichTextLabel::push_bold);
 	ClassDB::bind_method(D_METHOD("push_bold"), &RichTextLabel::push_bold);

+ 4 - 3
scene/gui/rich_text_label.h

@@ -178,6 +178,7 @@ private:
 
 
 	struct ItemFont : public Item {
 	struct ItemFont : public Item {
 		Ref<Font> font;
 		Ref<Font> font;
+		int font_size = 0;
 		ItemFont() { type = ITEM_FONT; }
 		ItemFont() { type = ITEM_FONT; }
 	};
 	};
 
 
@@ -462,8 +463,8 @@ private:
 	Item *_find_indentable(Item *p_item);
 	Item *_find_indentable(Item *p_item);
 	Item *_get_item_at_pos(Item *p_item_from, Item *p_item_to, int p_position);
 	Item *_get_item_at_pos(Item *p_item_from, Item *p_item_to, int p_position);
 	void _find_frame(Item *p_item, ItemFrame **r_frame, int *r_line);
 	void _find_frame(Item *p_item, ItemFrame **r_frame, int *r_line);
-	int _find_font_size(Item *p_item);
-	Ref<Font> _find_font(Item *p_item);
+	ItemFontSize *_find_font_size(Item *p_item);
+	ItemFont *_find_font(Item *p_item);
 	int _find_outline_size(Item *p_item, int p_default);
 	int _find_outline_size(Item *p_item, int p_default);
 	ItemList *_find_list_item(Item *p_item);
 	ItemList *_find_list_item(Item *p_item);
 	ItemDropcap *_find_dc_item(Item *p_item);
 	ItemDropcap *_find_dc_item(Item *p_item);
@@ -518,7 +519,7 @@ public:
 	void add_newline();
 	void add_newline();
 	bool remove_line(const int p_line);
 	bool remove_line(const int p_line);
 	void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0));
 	void push_dropcap(const String &p_string, const Ref<Font> &p_font, int p_size, const Rect2 &p_dropcap_margins = Rect2(), const Color &p_color = Color(1, 1, 1), int p_ol_size = 0, const Color &p_ol_color = Color(0, 0, 0, 0));
-	void push_font(const Ref<Font> &p_font);
+	void push_font(const Ref<Font> &p_font, int p_size = 0);
 	void push_font_size(int p_font_size);
 	void push_font_size(int p_font_size);
 	void push_outline_size(int p_font_size);
 	void push_outline_size(int p_font_size);
 	void push_normal();
 	void push_normal();