Browse Source

[CTL] Add missing font outline drawing routines and theme constants.

bruvzg 4 years ago
parent
commit
d78336c65e

+ 2 - 2
doc/classes/Button.xml

@@ -128,7 +128,7 @@
 			Text [Color] used when the [Button] is being hovered and pressed.
 			Text [Color] used when the [Button] is being hovered and pressed.
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
-			Text outline [Color] of the [Button].
+			The tint of text outline of the [Button].
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the [Button] is being pressed.
 			Text [Color] used when the [Button] is being pressed.
@@ -161,7 +161,7 @@
 			Default [StyleBox] for the [Button].
 			Default [StyleBox] for the [Button].
 		</theme_item>
 		</theme_item>
 		<theme_item name="outline_size" type="int" default="0">
 		<theme_item name="outline_size" type="int" default="0">
-			Size of the [Button]'s text outline.
+			The size of the text outline.
 		</theme_item>
 		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			[StyleBox] used when the [Button] is being pressed.
 			[StyleBox] used when the [Button] is being pressed.

+ 6 - 0
doc/classes/CheckBox.xml

@@ -45,6 +45,9 @@
 		<theme_item name="font_hover_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_hover_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			The [CheckBox] text's font color when it's hovered and pressed.
 			The [CheckBox] text's font color when it's hovered and pressed.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [CheckBox].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			The [CheckBox] text's font color when it's pressed.
 			The [CheckBox] text's font color when it's pressed.
 		</theme_item>
 		</theme_item>
@@ -63,6 +66,9 @@
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 			The [StyleBox] to display as a background.
 			The [StyleBox] to display as a background.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			The [StyleBox] to display as a background when the [CheckBox] is pressed.
 			The [StyleBox] to display as a background when the [CheckBox] is pressed.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/CheckButton.xml

@@ -42,6 +42,9 @@
 		<theme_item name="font_hover_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_hover_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			The [CheckButton] text's font color when it's hovered and pressed.
 			The [CheckButton] text's font color when it's hovered and pressed.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [CheckButton].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			The [CheckButton] text's font color when it's pressed.
 			The [CheckButton] text's font color when it's pressed.
 		</theme_item>
 		</theme_item>
@@ -84,6 +87,9 @@
 		<theme_item name="on_mirrored" type="Texture2D">
 		<theme_item name="on_mirrored" type="Texture2D">
 			The icon to display when the [CheckButton] is checked (for right-to-left layouts).
 			The icon to display when the [CheckButton] is checked (for right-to-left layouts).
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			The [StyleBox] to display as a background when the [CheckButton] is pressed.
 			The [StyleBox] to display as a background when the [CheckButton] is pressed.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/CodeEdit.xml

@@ -179,6 +179,9 @@
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [CodeEdit].
+		</theme_item>
 		<theme_item name="font_readonly_color" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )">
 		<theme_item name="font_readonly_color" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )">
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
@@ -194,6 +197,9 @@
 		</theme_item>
 		</theme_item>
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="read_only" type="StyleBox">
 		<theme_item name="read_only" type="StyleBox">
 		</theme_item>
 		</theme_item>
 		<theme_item name="safe_line_number_color" type="Color" default="Color( 0.67, 0.78, 0.67, 0.6 )">
 		<theme_item name="safe_line_number_color" type="Color" default="Color( 0.67, 0.78, 0.67, 0.6 )">

+ 6 - 0
doc/classes/ColorPickerButton.xml

@@ -79,6 +79,9 @@
 		<theme_item name="font_hover_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_hover_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the [ColorPickerButton] is being hovered.
 			Text [Color] used when the [ColorPickerButton] is being hovered.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [ColorPickerButton].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 0.8, 0.8, 0.8, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 0.8, 0.8, 0.8, 1 )">
 			Text [Color] used when the [ColorPickerButton] is being pressed.
 			Text [Color] used when the [ColorPickerButton] is being pressed.
 		</theme_item>
 		</theme_item>
@@ -94,6 +97,9 @@
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 			Default [StyleBox] for the [ColorPickerButton].
 			Default [StyleBox] for the [ColorPickerButton].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			[StyleBox] used when the [ColorPickerButton] is being pressed.
 			[StyleBox] used when the [ColorPickerButton] is being pressed.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/ItemList.xml

@@ -615,6 +615,9 @@
 		<theme_item name="font_color" type="Color" default="Color( 0.63, 0.63, 0.63, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.63, 0.63, 0.63, 1 )">
 			Default text [Color] of the item.
 			Default text [Color] of the item.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the item.
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the item is selected.
 			Text [Color] used when the item is selected.
 		</theme_item>
 		</theme_item>
@@ -633,6 +636,9 @@
 		<theme_item name="line_separation" type="int" default="2">
 		<theme_item name="line_separation" type="int" default="2">
 			The vertical spacing between each line of text.
 			The vertical spacing between each line of text.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the item text outline.
+		</theme_item>
 		<theme_item name="selected" type="StyleBox">
 		<theme_item name="selected" type="StyleBox">
 			[StyleBox] for the selected items, used when the [ItemList] is not being focused.
 			[StyleBox] for the selected items, used when the [ItemList] is not being focused.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/LineEdit.xml

@@ -380,6 +380,9 @@
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 			Default font color.
 			Default font color.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [LineEdit].
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 			Font color for selected text (inside the selection rectangle).
 			Font color for selected text (inside the selection rectangle).
 		</theme_item>
 		</theme_item>
@@ -395,6 +398,9 @@
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 			Default background for the [LineEdit].
 			Default background for the [LineEdit].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="read_only" type="StyleBox">
 		<theme_item name="read_only" type="StyleBox">
 			Background used when [LineEdit] is in read-only mode ([member editable] is set to [code]false[/code]).
 			Background used when [LineEdit] is in read-only mode ([member editable] is set to [code]false[/code]).
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/LinkButton.xml

@@ -84,12 +84,18 @@
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			Text [Color] used when the [LinkButton] is being hovered.
 			Text [Color] used when the [LinkButton] is being hovered.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [LinkButton].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the [LinkButton] is being pressed.
 			Text [Color] used when the [LinkButton] is being pressed.
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_size" type="int">
 		<theme_item name="font_size" type="int">
 			Font size of the [LinkButton]'s text.
 			Font size of the [LinkButton]'s text.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="underline_spacing" type="int" default="2">
 		<theme_item name="underline_spacing" type="int" default="2">
 			The vertical space between the baseline of text and the underline.
 			The vertical space between the baseline of text and the underline.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/MenuButton.xml

@@ -65,6 +65,9 @@
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			Text [Color] used when the [MenuButton] is being hovered.
 			Text [Color] used when the [MenuButton] is being hovered.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [MenuButton].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the [MenuButton] is being pressed.
 			Text [Color] used when the [MenuButton] is being pressed.
 		</theme_item>
 		</theme_item>
@@ -80,6 +83,9 @@
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 			Default [StyleBox] for the [MenuButton].
 			Default [StyleBox] for the [MenuButton].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			[StyleBox] used when the [MenuButton] is being pressed.
 			[StyleBox] used when the [MenuButton] is being pressed.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/OptionButton.xml

@@ -259,6 +259,9 @@
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			Text [Color] used when the [OptionButton] is being hovered.
 			Text [Color] used when the [OptionButton] is being hovered.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [OptionButton].
+		</theme_item>
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_pressed_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the [OptionButton] is being pressed.
 			Text [Color] used when the [OptionButton] is being pressed.
 		</theme_item>
 		</theme_item>
@@ -280,6 +283,9 @@
 		<theme_item name="normal_mirrored" type="StyleBox">
 		<theme_item name="normal_mirrored" type="StyleBox">
 			Default [StyleBox] for the [OptionButton] (for right-to-left layouts).
 			Default [StyleBox] for the [OptionButton] (for right-to-left layouts).
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="pressed" type="StyleBox">
 		<theme_item name="pressed" type="StyleBox">
 			[StyleBox] used when the [OptionButton] is being pressed (for left-to-right layouts).
 			[StyleBox] used when the [OptionButton] is being pressed (for left-to-right layouts).
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/PopupMenu.xml

@@ -729,6 +729,9 @@
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		<theme_item name="font_hover_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 			[Color] used for the hovered text.
 			[Color] used for the hovered text.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the menu item.
+		</theme_item>
 		<theme_item name="font_separator_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		<theme_item name="font_separator_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 			[Color] used for labeled separators' text. See [method add_separator].
 			[Color] used for labeled separators' text. See [method add_separator].
 		</theme_item>
 		</theme_item>
@@ -747,6 +750,9 @@
 		<theme_item name="labeled_separator_right" type="StyleBox">
 		<theme_item name="labeled_separator_right" type="StyleBox">
 			[StyleBox] for the right side of labeled separator. See [method add_separator].
 			[StyleBox] for the right side of labeled separator. See [method add_separator].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the item text outline.
+		</theme_item>
 		<theme_item name="panel" type="StyleBox">
 		<theme_item name="panel" type="StyleBox">
 			Default [StyleBox] of the [PopupMenu] items.
 			Default [StyleBox] of the [PopupMenu] items.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/ProgressBar.xml

@@ -32,11 +32,17 @@
 		<theme_item name="font_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			The color of the text.
 			The color of the text.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [ProgressBar].
+		</theme_item>
 		<theme_item name="font_shadow_color" type="Color" default="Color( 0, 0, 0, 1 )">
 		<theme_item name="font_shadow_color" type="Color" default="Color( 0, 0, 0, 1 )">
 			The color of the text's shadow.
 			The color of the text's shadow.
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_size" type="int">
 		<theme_item name="font_size" type="int">
 			Font size used to draw the fill percentage if [member percent_visible] is [code]true[/code].
 			Font size used to draw the fill percentage if [member percent_visible] is [code]true[/code].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 	</theme_items>
 	</theme_items>
 </class>
 </class>

+ 6 - 0
doc/classes/RichTextLabel.xml

@@ -597,6 +597,9 @@
 		<theme_item name="focus" type="StyleBox">
 		<theme_item name="focus" type="StyleBox">
 			The background The background used when the [RichTextLabel] is focused.
 			The background The background used when the [RichTextLabel] is focused.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The default tint of text outline.
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 			The color of selected text, used when [member selection_enabled] is [code]true[/code].
 			The color of selected text, used when [member selection_enabled] is [code]true[/code].
 		</theme_item>
 		</theme_item>
@@ -627,6 +630,9 @@
 		<theme_item name="normal_font_size" type="int">
 		<theme_item name="normal_font_size" type="int">
 			The default text font size.
 			The default text font size.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="selection_color" type="Color" default="Color( 0.1, 0.1, 1, 0.8 )">
 		<theme_item name="selection_color" type="Color" default="Color( 0.1, 0.1, 1, 0.8 )">
 			The color of the selection box.
 			The color of the selection box.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/TabContainer.xml

@@ -201,6 +201,9 @@
 		<theme_item name="font_disabled_color" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )">
 		<theme_item name="font_disabled_color" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )">
 			Font color of disabled tabs.
 			Font color of disabled tabs.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the tab name.
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			Font color of the currently selected tab.
 			Font color of the currently selected tab.
 		</theme_item>
 		</theme_item>
@@ -225,6 +228,9 @@
 		<theme_item name="menu_highlight" type="Texture2D">
 		<theme_item name="menu_highlight" type="Texture2D">
 			The icon for the menu button (see [method set_popup]) when it's being hovered with the cursor.
 			The icon for the menu button (see [method set_popup]) when it's being hovered with the cursor.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the tab text outline.
+		</theme_item>
 		<theme_item name="panel" type="StyleBox">
 		<theme_item name="panel" type="StyleBox">
 			The style for the background fill.
 			The style for the background fill.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/Tabs.xml

@@ -362,6 +362,9 @@
 		<theme_item name="font_disabled_color" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )">
 		<theme_item name="font_disabled_color" type="Color" default="Color( 0.9, 0.9, 0.9, 0.2 )">
 			Font color of disabled tabs.
 			Font color of disabled tabs.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the tab name.
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
 			Font color of the currently selected tab.
 			Font color of the currently selected tab.
 		</theme_item>
 		</theme_item>
@@ -380,6 +383,9 @@
 		<theme_item name="increment_highlight" type="Texture2D">
 		<theme_item name="increment_highlight" type="Texture2D">
 			Icon for the right arrow button that appears when there are too many tabs to fit in the container width. Used when the button is being hovered with the cursor.
 			Icon for the right arrow button that appears when there are too many tabs to fit in the container width. Used when the button is being hovered with the cursor.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the tab text outline.
+		</theme_item>
 		<theme_item name="panel" type="StyleBox">
 		<theme_item name="panel" type="StyleBox">
 		</theme_item>
 		</theme_item>
 		<theme_item name="tab_disabled" type="StyleBox">
 		<theme_item name="tab_disabled" type="StyleBox">

+ 6 - 0
doc/classes/TextEdit.xml

@@ -954,6 +954,9 @@
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
 			Sets the font [Color].
 			Sets the font [Color].
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the [TextEdit].
+		</theme_item>
 		<theme_item name="font_readonly_color" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )">
 		<theme_item name="font_readonly_color" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )">
 		</theme_item>
 		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 0, 0, 0, 1 )">
@@ -971,6 +974,9 @@
 		<theme_item name="normal" type="StyleBox">
 		<theme_item name="normal" type="StyleBox">
 			Sets the [StyleBox] of this [TextEdit].
 			Sets the [StyleBox] of this [TextEdit].
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="read_only" type="StyleBox">
 		<theme_item name="read_only" type="StyleBox">
 			Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled.
 			Sets the [StyleBox] of this [TextEdit] when [member readonly] is enabled.
 		</theme_item>
 		</theme_item>

+ 6 - 0
doc/classes/Tree.xml

@@ -524,6 +524,9 @@
 		<theme_item name="font_color" type="Color" default="Color( 0.69, 0.69, 0.69, 1 )">
 		<theme_item name="font_color" type="Color" default="Color( 0.69, 0.69, 0.69, 1 )">
 			Default text [Color] of the item.
 			Default text [Color] of the item.
 		</theme_item>
 		</theme_item>
+		<theme_item name="font_outline_color" type="Color" default="Color( 1, 1, 1, 1 )">
+			The tint of text outline of the item.
+		</theme_item>
 		<theme_item name="font_selected_color" type="Color" default="Color( 1, 1, 1, 1 )">
 		<theme_item name="font_selected_color" type="Color" default="Color( 1, 1, 1, 1 )">
 			Text [Color] used when the item is selected.
 			Text [Color] used when the item is selected.
 		</theme_item>
 		</theme_item>
@@ -539,6 +542,9 @@
 		<theme_item name="item_margin" type="int" default="12">
 		<theme_item name="item_margin" type="int" default="12">
 			The horizontal margin at the start of an item. This is used when folding is enabled for the item.
 			The horizontal margin at the start of an item. This is used when folding is enabled for the item.
 		</theme_item>
 		</theme_item>
+		<theme_item name="outline_size" type="int" default="0">
+			The size of the text outline.
+		</theme_item>
 		<theme_item name="relationship_line_color" type="Color" default="Color( 0.27, 0.27, 0.27, 1 )">
 		<theme_item name="relationship_line_color" type="Color" default="Color( 0.27, 0.27, 0.27, 1 )">
 			[Color] of the relationship lines.
 			[Color] of the relationship lines.
 		</theme_item>
 		</theme_item>

+ 9 - 0
doc/classes/Window.xml

@@ -474,8 +474,17 @@
 		</theme_item>
 		</theme_item>
 		<theme_item name="title_font" type="Font">
 		<theme_item name="title_font" type="Font">
 		</theme_item>
 		</theme_item>
+		<theme_item name="title_font_size" type="int">
+			The size of the title font.
+		</theme_item>
 		<theme_item name="title_height" type="int" default="20">
 		<theme_item name="title_height" type="int" default="20">
 		</theme_item>
 		</theme_item>
+		<theme_item name="title_outline_modulate" type="Color" default="Color( 1, 1, 1, 1 )">
+			The color of the title outline.
+		</theme_item>
+		<theme_item name="title_outline_size" type="int" default="0">
+			The size of the title outline.
+		</theme_item>
 		<theme_item name="window_panel" type="StyleBox">
 		<theme_item name="window_panel" type="StyleBox">
 		</theme_item>
 		</theme_item>
 	</theme_items>
 	</theme_items>

+ 11 - 0
scene/gui/item_list.cpp

@@ -883,6 +883,8 @@ void ItemList::_notification(int p_what) {
 		int vseparation = get_theme_constant("vseparation");
 		int vseparation = get_theme_constant("vseparation");
 		int icon_margin = get_theme_constant("icon_margin");
 		int icon_margin = get_theme_constant("icon_margin");
 		int line_separation = get_theme_constant("line_separation");
 		int line_separation = get_theme_constant("line_separation");
+		Color font_outline_color = get_theme_color("font_outline_color");
+		int outline_size = get_theme_constant("outline_size");
 
 
 		Ref<StyleBox> sbsel = has_focus() ? get_theme_stylebox("selected_focus") : get_theme_stylebox("selected");
 		Ref<StyleBox> sbsel = has_focus() ? get_theme_stylebox("selected_focus") : get_theme_stylebox("selected");
 		Ref<StyleBox> cursor = has_focus() ? get_theme_stylebox("cursor") : get_theme_stylebox("cursor_unfocused");
 		Ref<StyleBox> cursor = has_focus() ? get_theme_stylebox("cursor") : get_theme_stylebox("cursor_unfocused");
@@ -1204,6 +1206,10 @@ void ItemList::_notification(int p_what) {
 					items.write[i].text_buf->set_width(max_len);
 					items.write[i].text_buf->set_width(max_len);
 					items.write[i].text_buf->set_align(HALIGN_CENTER);
 					items.write[i].text_buf->set_align(HALIGN_CENTER);
 
 
+					if (outline_size > 0 && font_outline_color.a > 0) {
+						items[i].text_buf->draw_outline(get_canvas_item(), text_ofs, outline_size, font_outline_color);
+					}
+
 					items[i].text_buf->draw(get_canvas_item(), text_ofs, modulate);
 					items[i].text_buf->draw(get_canvas_item(), text_ofs, modulate);
 				} else {
 				} else {
 					if (fixed_column_width > 0) {
 					if (fixed_column_width > 0) {
@@ -1230,6 +1236,11 @@ void ItemList::_notification(int p_what) {
 					} else {
 					} else {
 						items.write[i].text_buf->set_align(HALIGN_LEFT);
 						items.write[i].text_buf->set_align(HALIGN_LEFT);
 					}
 					}
+
+					if (outline_size > 0 && font_outline_color.a > 0) {
+						items[i].text_buf->draw_outline(get_canvas_item(), text_ofs, outline_size, font_outline_color);
+					}
+
 					items[i].text_buf->draw(get_canvas_item(), text_ofs, modulate);
 					items[i].text_buf->draw(get_canvas_item(), text_ofs, modulate);
 				}
 				}
 			}
 			}

+ 18 - 0
scene/gui/line_edit.cpp

@@ -835,6 +835,24 @@ void LineEdit::_notification(int p_what) {
 
 
 			// Draw text.
 			// Draw text.
 			ofs.y += TS->shaped_text_get_ascent(text_rid);
 			ofs.y += TS->shaped_text_get_ascent(text_rid);
+			Color font_outline_color = get_theme_color("font_outline_color");
+			int outline_size = get_theme_constant("outline_size");
+			if (outline_size > 0 && font_outline_color.a > 0) {
+				Vector2 oofs = ofs;
+				for (int i = 0; i < gl_size; i++) {
+					for (int j = 0; j < glyphs[i].repeat; j++) {
+						if (ceil(oofs.x) >= x_ofs && (oofs.x + glyphs[i].advance) <= ofs_max) {
+							if (glyphs[i].font_rid != RID()) {
+								TS->font_draw_glyph_outline(glyphs[i].font_rid, ci, glyphs[i].font_size, outline_size, oofs + Vector2(glyphs[i].x_off, glyphs[i].y_off), glyphs[i].index, font_outline_color);
+							}
+						}
+						oofs.x += glyphs[i].advance;
+					}
+					if (oofs.x >= ofs_max) {
+						break;
+					}
+				}
+			}
 			for (int i = 0; i < gl_size; i++) {
 			for (int i = 0; i < gl_size; i++) {
 				bool selected = selection.enabled && glyphs[i].start >= selection.begin && glyphs[i].end <= selection.end;
 				bool selected = selection.enabled && glyphs[i].start >= selection.begin && glyphs[i].end <= selection.end;
 				for (int j = 0; j < glyphs[i].repeat; j++) {
 				for (int j = 0; j < glyphs[i].repeat; j++) {

+ 8 - 0
scene/gui/link_button.cpp

@@ -191,9 +191,17 @@ void LinkButton::_notification(int p_what) {
 
 
 			int width = text_buf->get_line_width();
 			int width = text_buf->get_line_width();
 
 
+			Color font_outline_color = get_theme_color("font_outline_color");
+			int outline_size = get_theme_constant("outline_size");
 			if (is_layout_rtl()) {
 			if (is_layout_rtl()) {
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					text_buf->draw_outline(get_canvas_item(), Vector2(size.width - width, 0), outline_size, font_outline_color);
+				}
 				text_buf->draw(get_canvas_item(), Vector2(size.width - width, 0), color);
 				text_buf->draw(get_canvas_item(), Vector2(size.width - width, 0), color);
 			} else {
 			} else {
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					text_buf->draw_outline(get_canvas_item(), Vector2(0, 0), outline_size, font_outline_color);
+				}
 				text_buf->draw(get_canvas_item(), Vector2(0, 0), color);
 				text_buf->draw(get_canvas_item(), Vector2(0, 0), color);
 			}
 			}
 
 

+ 22 - 4
scene/gui/popup_menu.cpp

@@ -572,17 +572,31 @@ void PopupMenu::_draw_items() {
 		}
 		}
 
 
 		// Text
 		// Text
+		Color font_outline_color = get_theme_color("font_outline_color");
+		int outline_size = get_theme_constant("outline_size");
 		if (items[i].separator) {
 		if (items[i].separator) {
 			if (text != String()) {
 			if (text != String()) {
 				int center = (display_width - items[i].text_buf->get_size().width) / 2;
 				int center = (display_width - items[i].text_buf->get_size().width) / 2;
-				items[i].text_buf->draw(ci, Point2(center, item_ofs.y + Math::floor((h - items[i].text_buf->get_size().y) / 2.0)), font_separator_color);
+				Vector2 text_pos = Point2(center, item_ofs.y + Math::floor((h - items[i].text_buf->get_size().y) / 2.0));
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					items[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+				}
+				items[i].text_buf->draw(ci, text_pos, font_separator_color);
 			}
 			}
 		} else {
 		} else {
 			item_ofs.x += icon_ofs + check_ofs;
 			item_ofs.x += icon_ofs + check_ofs;
 			if (rtl) {
 			if (rtl) {
-				items[i].text_buf->draw(ci, Size2(control->get_size().width - items[i].text_buf->get_size().width - item_ofs.x, item_ofs.y) + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0)), items[i].disabled ? font_disabled_color : (i == mouse_over ? font_hover_color : font_color));
+				Vector2 text_pos = Size2(control->get_size().width - items[i].text_buf->get_size().width - item_ofs.x, item_ofs.y) + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0));
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					items[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+				}
+				items[i].text_buf->draw(ci, text_pos, items[i].disabled ? font_disabled_color : (i == mouse_over ? font_hover_color : font_color));
 			} else {
 			} else {
-				items[i].text_buf->draw(ci, item_ofs + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0)), items[i].disabled ? font_disabled_color : (i == mouse_over ? font_hover_color : font_color));
+				Vector2 text_pos = item_ofs + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0));
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					items[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+				}
+				items[i].text_buf->draw(ci, text_pos, items[i].disabled ? font_disabled_color : (i == mouse_over ? font_hover_color : font_color));
 			}
 			}
 		}
 		}
 
 
@@ -593,7 +607,11 @@ void PopupMenu::_draw_items() {
 			} else {
 			} else {
 				item_ofs.x = display_width - style->get_margin(SIDE_RIGHT) - items[i].accel_text_buf->get_size().x;
 				item_ofs.x = display_width - style->get_margin(SIDE_RIGHT) - items[i].accel_text_buf->get_size().x;
 			}
 			}
-			items[i].accel_text_buf->draw(ci, item_ofs + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0)), i == mouse_over ? font_hover_color : font_accelerator_color);
+			Vector2 text_pos = item_ofs + Point2(0, Math::floor((h - items[i].text_buf->get_size().y) / 2.0));
+			if (outline_size > 0 && font_outline_color.a > 0) {
+				items[i].accel_text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+			}
+			items[i].accel_text_buf->draw(ci, text_pos, i == mouse_over ? font_hover_color : font_accelerator_color);
 		}
 		}
 
 
 		// Cache the item vertical offset from the first item and the height
 		// Cache the item vertical offset from the first item and the height

+ 7 - 1
scene/gui/progress_bar.cpp

@@ -74,7 +74,13 @@ void ProgressBar::_notification(int p_what) {
 		if (percent_visible) {
 		if (percent_visible) {
 			String txt = TS->format_number(itos(int(get_as_ratio() * 100))) + TS->percent_sign();
 			String txt = TS->format_number(itos(int(get_as_ratio() * 100))) + TS->percent_sign();
 			TextLine tl = TextLine(txt, font, font_size);
 			TextLine tl = TextLine(txt, font, font_size);
-			tl.draw(get_canvas_item(), (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round(), font_color);
+			Vector2 text_pos = (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round();
+			Color font_outline_color = get_theme_color("font_outline_color");
+			int outline_size = get_theme_constant("outline_size");
+			if (outline_size > 0 && font_outline_color.a > 0) {
+				tl.draw_outline(get_canvas_item(), text_pos, outline_size, font_outline_color);
+			}
+			tl.draw(get_canvas_item(), text_pos, font_color);
 		}
 		}
 	}
 	}
 }
 }

+ 5 - 5
scene/gui/rich_text_label.cpp

@@ -819,8 +819,8 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
 		// Draw oulines and shadow.
 		// Draw oulines and shadow.
 		for (int i = 0; i < gl_size; i++) {
 		for (int i = 0; i < gl_size; i++) {
 			Item *it = _get_item_at_pos(it_from, it_to, glyphs[i].start);
 			Item *it = _get_item_at_pos(it_from, it_to, glyphs[i].start);
-			int size = _find_outline_size(it);
-			Color font_color = _find_outline_color(it, Color(0, 0, 0, 0));
+			int size = _find_outline_size(it, p_outline_size);
+			Color font_color = _find_outline_color(it, p_outline_color);
 			if (size <= 0) {
 			if (size <= 0) {
 				gloff.x += glyphs[i].advance;
 				gloff.x += glyphs[i].advance;
 				continue;
 				continue;
@@ -1398,7 +1398,7 @@ void RichTextLabel::_notification(int p_what) {
 			}
 			}
 			Ref<Font> base_font = get_theme_font("normal_font");
 			Ref<Font> base_font = get_theme_font("normal_font");
 			Color base_color = get_theme_color("default_color");
 			Color base_color = get_theme_color("default_color");
-			Color outline_color = get_theme_color("outline_color");
+			Color outline_color = get_theme_color("font_outline_color");
 			int outline_size = get_theme_constant("outline_size");
 			int outline_size = get_theme_constant("outline_size");
 			Color font_shadow_color = get_theme_color("font_shadow_color");
 			Color font_shadow_color = get_theme_color("font_shadow_color");
 			bool use_outline = get_theme_constant("shadow_as_outline");
 			bool use_outline = get_theme_constant("shadow_as_outline");
@@ -1753,7 +1753,7 @@ int RichTextLabel::_find_font_size(Item *p_item) {
 	return -1;
 	return -1;
 }
 }
 
 
-int RichTextLabel::_find_outline_size(Item *p_item) {
+int RichTextLabel::_find_outline_size(Item *p_item, int p_default) {
 	Item *sizeitem = p_item;
 	Item *sizeitem = p_item;
 
 
 	while (sizeitem) {
 	while (sizeitem) {
@@ -1765,7 +1765,7 @@ int RichTextLabel::_find_outline_size(Item *p_item) {
 		sizeitem = sizeitem->parent;
 		sizeitem = sizeitem->parent;
 	}
 	}
 
 
-	return 0;
+	return p_default;
 }
 }
 
 
 Dictionary RichTextLabel::_find_font_features(Item *p_item) {
 Dictionary RichTextLabel::_find_font_features(Item *p_item) {

+ 1 - 1
scene/gui/rich_text_label.h

@@ -405,7 +405,7 @@ private:
 	Ref<Font> _find_font(Item *p_item);
 	Ref<Font> _find_font(Item *p_item);
 	int _find_font_size(Item *p_item);
 	int _find_font_size(Item *p_item);
 	Dictionary _find_font_features(Item *p_item);
 	Dictionary _find_font_features(Item *p_item);
-	int _find_outline_size(Item *p_item);
+	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);
 	int _find_list(Item *p_item, Vector<int> &r_index, Vector<ItemList *> &r_list);
 	int _find_list(Item *p_item, Vector<int> &r_index, Vector<ItemList *> &r_list);

+ 5 - 0
scene/gui/tab_container.cpp

@@ -535,6 +535,8 @@ void TabContainer::_draw_tab(Ref<StyleBox> &p_tab_style, Color &p_font_color, in
 	Vector<Control *> tabs = _get_tabs();
 	Vector<Control *> tabs = _get_tabs();
 	RID canvas = get_canvas_item();
 	RID canvas = get_canvas_item();
 	Ref<Font> font = get_theme_font("font");
 	Ref<Font> font = get_theme_font("font");
+	Color font_outline_color = get_theme_color("font_outline_color");
+	int outline_size = get_theme_constant("outline_size");
 	int icon_text_distance = get_theme_constant("icon_separation");
 	int icon_text_distance = get_theme_constant("icon_separation");
 	int tab_width = _get_tab_width(p_index);
 	int tab_width = _get_tab_width(p_index);
 	int header_height = _get_top_margin();
 	int header_height = _get_top_margin();
@@ -565,6 +567,9 @@ void TabContainer::_draw_tab(Ref<StyleBox> &p_tab_style, Color &p_font_color, in
 
 
 	// Draw the tab text.
 	// Draw the tab text.
 	Point2i text_pos(x_content, y_center - text_buf[p_index]->get_size().y / 2);
 	Point2i text_pos(x_content, y_center - text_buf[p_index]->get_size().y / 2);
+	if (outline_size > 0 && font_outline_color.a > 0) {
+		text_buf[p_index]->draw_outline(canvas, text_pos, outline_size, font_outline_color);
+	}
 	text_buf[p_index]->draw(canvas, text_pos, p_font_color);
 	text_buf[p_index]->draw(canvas, text_pos, p_font_color);
 }
 }
 
 

+ 13 - 2
scene/gui/tabs.cpp

@@ -275,6 +275,9 @@ void Tabs::_notification(int p_what) {
 			Color font_unselected_color = get_theme_color("font_unselected_color");
 			Color font_unselected_color = get_theme_color("font_unselected_color");
 			Color font_disabled_color = get_theme_color("font_disabled_color");
 			Color font_disabled_color = get_theme_color("font_disabled_color");
 			Ref<Texture2D> close = get_theme_icon("close");
 			Ref<Texture2D> close = get_theme_icon("close");
+			Color font_outline_color = get_theme_color("font_outline_color");
+			int outline_size = get_theme_constant("outline_size");
+
 			Vector2 size = get_size();
 			Vector2 size = get_size();
 			bool rtl = is_layout_rtl();
 			bool rtl = is_layout_rtl();
 
 
@@ -357,9 +360,17 @@ void Tabs::_notification(int p_what) {
 				}
 				}
 
 
 				if (rtl) {
 				if (rtl) {
-					tabs[i].text_buf->draw(ci, Point2i(size.width - w - tabs[i].text_buf->get_size().x, sb->get_margin(SIDE_TOP) + ((sb_rect.size.y - sb_ms.y) - tabs[i].text_buf->get_size().y) / 2), col);
+					Vector2 text_pos = Point2i(size.width - w - tabs[i].text_buf->get_size().x, sb->get_margin(SIDE_TOP) + ((sb_rect.size.y - sb_ms.y) - tabs[i].text_buf->get_size().y) / 2);
+					if (outline_size > 0 && font_outline_color.a > 0) {
+						tabs[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+					}
+					tabs[i].text_buf->draw(ci, text_pos, col);
 				} else {
 				} else {
-					tabs[i].text_buf->draw(ci, Point2i(w, sb->get_margin(SIDE_TOP) + ((sb_rect.size.y - sb_ms.y) - tabs[i].text_buf->get_size().y) / 2), col);
+					Vector2 text_pos = Point2i(w, sb->get_margin(SIDE_TOP) + ((sb_rect.size.y - sb_ms.y) - tabs[i].text_buf->get_size().y) / 2);
+					if (outline_size > 0 && font_outline_color.a > 0) {
+						tabs[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+					}
+					tabs[i].text_buf->draw(ci, text_pos, col);
 				}
 				}
 
 
 				w += tabs[i].size_text;
 				w += tabs[i].size_text;

+ 24 - 0
scene/gui/text_edit.cpp

@@ -1117,6 +1117,9 @@ void TextEdit::_notification(int p_what) {
 									tl->add_string(text, cache.font, cache.font_size);
 									tl->add_string(text, cache.font, cache.font_size);
 
 
 									int yofs = ofs_y + (row_height - tl->get_size().y) / 2;
 									int yofs = ofs_y + (row_height - tl->get_size().y) / 2;
+									if (cache.outline_size > 0 && cache.outline_color.a > 0) {
+										tl->draw_outline(ci, Point2(gutter_offset + ofs_x, yofs), cache.outline_size, cache.outline_color);
+									}
 									tl->draw(ci, Point2(gutter_offset + ofs_x, yofs), get_line_gutter_item_color(line, g));
 									tl->draw(ci, Point2(gutter_offset + ofs_x, yofs), get_line_gutter_item_color(line, g));
 								} break;
 								} break;
 								case GUTTER_TPYE_ICON: {
 								case GUTTER_TPYE_ICON: {
@@ -1273,6 +1276,22 @@ void TextEdit::_notification(int p_what) {
 
 
 					ofs_y += ldata->get_line_ascent(line_wrap_index);
 					ofs_y += ldata->get_line_ascent(line_wrap_index);
 					int char_ofs = 0;
 					int char_ofs = 0;
+					if (cache.outline_size > 0 && cache.outline_color.a > 0) {
+						for (int j = 0; j < gl_size; j++) {
+							for (int k = 0; k < glyphs[j].repeat; k++) {
+								if ((char_ofs + char_margin) >= xmargin_beg && (char_ofs + glyphs[j].advance + char_margin) <= xmargin_end) {
+									if (glyphs[j].font_rid != RID()) {
+										TS->font_draw_glyph_outline(glyphs[j].font_rid, ci, glyphs[j].font_size, cache.outline_size, Vector2(char_margin + char_ofs + ofs_x + glyphs[j].x_off, ofs_y + glyphs[j].y_off), glyphs[j].index, cache.outline_color);
+									}
+								}
+								char_ofs += glyphs[j].advance;
+							}
+							if ((char_ofs + char_margin) >= xmargin_end) {
+								break;
+							}
+						}
+						char_ofs = 0;
+					}
 					for (int j = 0; j < gl_size; j++) {
 					for (int j = 0; j < gl_size; j++) {
 						if (color_map.has(glyphs[j].start)) {
 						if (color_map.has(glyphs[j].start)) {
 							current_color = color_map[glyphs[j].start].get("color");
 							current_color = color_map[glyphs[j].start].get("color");
@@ -1601,6 +1620,9 @@ void TextEdit::_notification(int p_what) {
 						}
 						}
 						tl->set_align(HALIGN_LEFT);
 						tl->set_align(HALIGN_LEFT);
 					}
 					}
+					if (cache.outline_size > 0 && cache.outline_color.a > 0) {
+						tl->draw_outline(ci, title_pos, cache.outline_size, cache.outline_color);
+					}
 					tl->draw(ci, title_pos, completion_options[l].font_color);
 					tl->draw(ci, title_pos, completion_options[l].font_color);
 				}
 				}
 
 
@@ -4944,6 +4966,8 @@ void TextEdit::_update_caches() {
 	cache.completion_font_color = get_theme_color("completion_font_color");
 	cache.completion_font_color = get_theme_color("completion_font_color");
 	cache.font = get_theme_font("font");
 	cache.font = get_theme_font("font");
 	cache.font_size = get_theme_font_size("font_size");
 	cache.font_size = get_theme_font_size("font_size");
+	cache.outline_color = get_theme_color("font_outline_color");
+	cache.outline_size = get_theme_constant("outline_size");
 	cache.caret_color = get_theme_color("caret_color");
 	cache.caret_color = get_theme_color("caret_color");
 	cache.caret_background_color = get_theme_color("caret_background_color");
 	cache.caret_background_color = get_theme_color("caret_background_color");
 	cache.font_color = get_theme_color("font_color");
 	cache.font_color = get_theme_color("font_color");

+ 2 - 0
scene/gui/text_edit.h

@@ -451,6 +451,8 @@ protected:
 		Ref<StyleBox> style_readonly;
 		Ref<StyleBox> style_readonly;
 		Ref<Font> font;
 		Ref<Font> font;
 		int font_size = 16;
 		int font_size = 16;
+		int outline_size = 0;
+		Color outline_color;
 		Color completion_background_color;
 		Color completion_background_color;
 		Color completion_selected_color;
 		Color completion_selected_color;
 		Color completion_existing_color;
 		Color completion_existing_color;

+ 33 - 6
scene/gui/tree.cpp

@@ -1118,7 +1118,7 @@ int Tree::get_item_height(TreeItem *p_item) const {
 	return height;
 	return height;
 }
 }
 
 
-void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color) {
+void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color, int p_ol_size, const Color &p_ol_color) {
 	ERR_FAIL_COND(cache.font.is_null());
 	ERR_FAIL_COND(cache.font.is_null());
 
 
 	Rect2i rect = p_rect;
 	Rect2i rect = p_rect;
@@ -1160,6 +1160,9 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co
 		Point2 draw_pos = rect.position;
 		Point2 draw_pos = rect.position;
 		draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
 		draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
 		p_cell.text_buf->set_width(MAX(0, rect.size.width));
 		p_cell.text_buf->set_width(MAX(0, rect.size.width));
+		if (p_ol_size > 0 && p_ol_color.a > 0) {
+			p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color);
+		}
 		p_cell.text_buf->draw(ci, draw_pos, p_color);
 		p_cell.text_buf->draw(ci, draw_pos, p_color);
 		rect.position.x += ts.width + cache.hseparation;
 		rect.position.x += ts.width + cache.hseparation;
 		rect.size.x -= ts.width + cache.hseparation;
 		rect.size.x -= ts.width + cache.hseparation;
@@ -1182,6 +1185,9 @@ void Tree::draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Co
 		Point2 draw_pos = rect.position;
 		Point2 draw_pos = rect.position;
 		draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
 		draw_pos.y += Math::floor((rect.size.y - p_cell.text_buf->get_size().y) / 2.0);
 		p_cell.text_buf->set_width(MAX(0, rect.size.width));
 		p_cell.text_buf->set_width(MAX(0, rect.size.width));
+		if (p_ol_size > 0 && p_ol_color.a > 0) {
+			p_cell.text_buf->draw_outline(ci, draw_pos, p_ol_size, p_ol_color);
+		}
 		p_cell.text_buf->draw(ci, draw_pos, p_color);
 		p_cell.text_buf->draw(ci, draw_pos, p_color);
 	}
 	}
 }
 }
@@ -1434,6 +1440,8 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 			}
 			}
 
 
 			Color col = p_item->cells[i].custom_color ? p_item->cells[i].color : get_theme_color(p_item->cells[i].selected ? "font_selected_color" : "font_color");
 			Color col = p_item->cells[i].custom_color ? p_item->cells[i].color : get_theme_color(p_item->cells[i].selected ? "font_selected_color" : "font_color");
+			Color font_outline_color = get_theme_color("font_outline_color");
+			int outline_size = get_theme_constant("outline_size");
 			Color icon_col = p_item->cells[i].icon_color;
 			Color icon_col = p_item->cells[i].icon_color;
 
 
 			if (p_item->cells[i].dirty) {
 			if (p_item->cells[i].dirty) {
@@ -1450,7 +1458,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 
 
 			switch (p_item->cells[i].mode) {
 			switch (p_item->cells[i].mode) {
 				case TreeItem::CELL_MODE_STRING: {
 				case TreeItem::CELL_MODE_STRING: {
-					draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col);
+					draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col, outline_size, font_outline_color);
 				} break;
 				} break;
 				case TreeItem::CELL_MODE_CHECK: {
 				case TreeItem::CELL_MODE_CHECK: {
 					Ref<Texture2D> checked = cache.checked;
 					Ref<Texture2D> checked = cache.checked;
@@ -1471,7 +1479,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 					item_rect.size.x -= check_w;
 					item_rect.size.x -= check_w;
 					item_rect.position.x += check_w;
 					item_rect.position.x += check_w;
 
 
-					draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col);
+					draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col, outline_size, font_outline_color);
 
 
 				} break;
 				} break;
 				case TreeItem::CELL_MODE_RANGE: {
 				case TreeItem::CELL_MODE_RANGE: {
@@ -1485,8 +1493,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 
 
 						p_item->cells.write[i].text_buf->set_width(cell_width);
 						p_item->cells.write[i].text_buf->set_width(cell_width);
 						if (rtl) {
 						if (rtl) {
+							if (outline_size > 0 && font_outline_color.a > 0) {
+								p_item->cells[i].text_buf->draw_outline(ci, text_pos + Vector2(cell_width - text_width, 0), outline_size, font_outline_color);
+							}
 							p_item->cells[i].text_buf->draw(ci, text_pos + Vector2(cell_width - text_width, 0), col);
 							p_item->cells[i].text_buf->draw(ci, text_pos + Vector2(cell_width - text_width, 0), col);
 						} else {
 						} else {
+							if (outline_size > 0 && font_outline_color.a > 0) {
+								p_item->cells[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+							}
 							p_item->cells[i].text_buf->draw(ci, text_pos, col);
 							p_item->cells[i].text_buf->draw(ci, text_pos, col);
 						}
 						}
 
 
@@ -1501,8 +1515,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 						int cell_width = item_rect.size.x - updown->get_width();
 						int cell_width = item_rect.size.x - updown->get_width();
 
 
 						if (rtl) {
 						if (rtl) {
+							if (outline_size > 0 && font_outline_color.a > 0) {
+								p_item->cells[i].text_buf->draw_outline(ci, text_pos + Vector2(cell_width - text_width, 0), outline_size, font_outline_color);
+							}
 							p_item->cells[i].text_buf->draw(ci, text_pos + Vector2(cell_width - text_width, 0), col);
 							p_item->cells[i].text_buf->draw(ci, text_pos + Vector2(cell_width - text_width, 0), col);
 						} else {
 						} else {
+							if (outline_size > 0 && font_outline_color.a > 0) {
+								p_item->cells[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+							}
 							p_item->cells[i].text_buf->draw(ci, text_pos, col);
 							p_item->cells[i].text_buf->draw(ci, text_pos, col);
 						}
 						}
 
 
@@ -1543,7 +1563,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 					}
 					}
 
 
 					if (!p_item->cells[i].editable) {
 					if (!p_item->cells[i].editable) {
-						draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col);
+						draw_item_rect(p_item->cells.write[i], item_rect, col, icon_col, outline_size, font_outline_color);
 						break;
 						break;
 					}
 					}
 
 
@@ -1571,7 +1591,7 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2
 						ir.position += cache.custom_button->get_offset();
 						ir.position += cache.custom_button->get_offset();
 					}
 					}
 
 
-					draw_item_rect(p_item->cells.write[i], ir, col, icon_col);
+					draw_item_rect(p_item->cells.write[i], ir, col, icon_col, outline_size, font_outline_color);
 
 
 					downarrow->draw(ci, arrow_pos);
 					downarrow->draw(ci, arrow_pos);
 
 
@@ -3143,6 +3163,8 @@ void Tree::_notification(int p_what) {
 
 
 		Ref<StyleBox> bg = cache.bg;
 		Ref<StyleBox> bg = cache.bg;
 		Ref<StyleBox> bg_focus = get_theme_stylebox("bg_focus");
 		Ref<StyleBox> bg_focus = get_theme_stylebox("bg_focus");
+		Color font_outline_color = get_theme_color("font_outline_color");
+		int outline_size = get_theme_constant("outline_size");
 
 
 		Point2 draw_ofs;
 		Point2 draw_ofs;
 		draw_ofs += bg->get_offset();
 		draw_ofs += bg->get_offset();
@@ -3179,7 +3201,12 @@ void Tree::_notification(int p_what) {
 				//text
 				//text
 				int clip_w = tbrect.size.width - sb->get_minimum_size().width;
 				int clip_w = tbrect.size.width - sb->get_minimum_size().width;
 				columns.write[i].text_buf->set_width(clip_w);
 				columns.write[i].text_buf->set_width(clip_w);
-				columns[i].text_buf->draw(ci, tbrect.position + Point2i(sb->get_offset().x + (tbrect.size.width - columns[i].text_buf->get_size().x) / 2, (tbrect.size.height - columns[i].text_buf->get_size().y) / 2), cache.title_button_color);
+
+				Vector2 text_pos = tbrect.position + Point2i(sb->get_offset().x + (tbrect.size.width - columns[i].text_buf->get_size().x) / 2, (tbrect.size.height - columns[i].text_buf->get_size().y) / 2);
+				if (outline_size > 0 && font_outline_color.a > 0) {
+					columns[i].text_buf->draw_outline(ci, text_pos, outline_size, font_outline_color);
+				}
+				columns[i].text_buf->draw(ci, text_pos, cache.title_button_color);
 			}
 			}
 		}
 		}
 	}
 	}

+ 1 - 1
scene/gui/tree.h

@@ -385,7 +385,7 @@ private:
 	void update_item_cell(TreeItem *p_item, int p_col);
 	void update_item_cell(TreeItem *p_item, int p_col);
 	void update_item_cache(TreeItem *p_item);
 	void update_item_cache(TreeItem *p_item);
 	//void draw_item_text(String p_text,const Ref<Texture2D>& p_icon,int p_icon_max_w,bool p_tool,Rect2i p_rect,const Color& p_color);
 	//void draw_item_text(String p_text,const Ref<Texture2D>& p_icon,int p_icon_max_w,bool p_tool,Rect2i p_rect,const Color& p_color);
-	void draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color);
+	void draw_item_rect(TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color, int p_ol_size, const Color &p_ol_color);
 	int draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 &p_draw_size, TreeItem *p_item);
 	int draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 &p_draw_size, TreeItem *p_item);
 	void select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev = nullptr, bool *r_in_range = nullptr, bool p_force_deselect = false);
 	void select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev = nullptr, bool *r_in_range = nullptr, bool p_force_deselect = false);
 	int propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool p_doubleclick, TreeItem *p_item, int p_button, const Ref<InputEventWithModifiers> &p_mod);
 	int propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool p_doubleclick, TreeItem *p_item, int p_button, const Ref<InputEventWithModifiers> &p_mod);

+ 5 - 0
scene/main/viewport.cpp

@@ -278,6 +278,11 @@ void Viewport::_sub_window_update(Window *p_window) {
 		int x = (r.size.width - title_text.get_size().x) / 2;
 		int x = (r.size.width - title_text.get_size().x) / 2;
 		int y = (-title_height - title_text.get_size().y) / 2;
 		int y = (-title_height - title_text.get_size().y) / 2;
 
 
+		Color font_outline_color = p_window->get_theme_color("title_outline_modulate");
+		int outline_size = p_window->get_theme_constant("title_outline_size");
+		if (outline_size > 0 && font_outline_color.a > 0) {
+			title_text.draw_outline(sw.canvas_item, r.position + Point2(x, y), outline_size, font_outline_color);
+		}
 		title_text.draw(sw.canvas_item, r.position + Point2(x, y), title_color);
 		title_text.draw(sw.canvas_item, r.position + Point2(x, y), title_color);
 
 
 		bool hl = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside;
 		bool hl = gui.subwindow_focused == sw.window && gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE && gui.subwindow_drag_close_inside;

+ 50 - 2
scene/resources/default_theme/default_theme.cpp

@@ -210,7 +210,9 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_color", "LinkButton", control_font_color);
 	theme->set_color("font_color", "LinkButton", control_font_color);
 	theme->set_color("font_pressed_color", "LinkButton", control_font_pressed_color);
 	theme->set_color("font_pressed_color", "LinkButton", control_font_pressed_color);
 	theme->set_color("font_hover_color", "LinkButton", control_font_hover_color);
 	theme->set_color("font_hover_color", "LinkButton", control_font_hover_color);
+	theme->set_color("font_outline_color", "LinkButton", Color(1, 1, 1));
 
 
+	theme->set_constant("outline_size", "LinkButton", 0);
 	theme->set_constant("underline_spacing", "LinkButton", 2 * scale);
 	theme->set_constant("underline_spacing", "LinkButton", 2 * scale);
 
 
 	// ColorPickerButton
 	// ColorPickerButton
@@ -228,8 +230,10 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_pressed_color", "ColorPickerButton", Color(0.8, 0.8, 0.8, 1));
 	theme->set_color("font_pressed_color", "ColorPickerButton", Color(0.8, 0.8, 0.8, 1));
 	theme->set_color("font_hover_color", "ColorPickerButton", Color(1, 1, 1, 1));
 	theme->set_color("font_hover_color", "ColorPickerButton", Color(1, 1, 1, 1));
 	theme->set_color("font_disabled_color", "ColorPickerButton", Color(0.9, 0.9, 0.9, 0.3));
 	theme->set_color("font_disabled_color", "ColorPickerButton", Color(0.9, 0.9, 0.9, 0.3));
+	theme->set_color("font_outline_color", "ColorPickerButton", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "ColorPickerButton", 2 * scale);
 	theme->set_constant("hseparation", "ColorPickerButton", 2 * scale);
+	theme->set_constant("outline_size", "ColorPickerButton", 0);
 
 
 	// OptionButton
 	// OptionButton
 
 
@@ -265,9 +269,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_pressed_color", "OptionButton", control_font_pressed_color);
 	theme->set_color("font_pressed_color", "OptionButton", control_font_pressed_color);
 	theme->set_color("font_hover_color", "OptionButton", control_font_hover_color);
 	theme->set_color("font_hover_color", "OptionButton", control_font_hover_color);
 	theme->set_color("font_disabled_color", "OptionButton", control_font_disabled_color);
 	theme->set_color("font_disabled_color", "OptionButton", control_font_disabled_color);
+	theme->set_color("font_outline_color", "OptionButton", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "OptionButton", 2 * scale);
 	theme->set_constant("hseparation", "OptionButton", 2 * scale);
 	theme->set_constant("arrow_margin", "OptionButton", 2 * scale);
 	theme->set_constant("arrow_margin", "OptionButton", 2 * scale);
+	theme->set_constant("outline_size", "OptionButton", 0);
 
 
 	// MenuButton
 	// MenuButton
 
 
@@ -284,8 +290,10 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_pressed_color", "MenuButton", control_font_pressed_color);
 	theme->set_color("font_pressed_color", "MenuButton", control_font_pressed_color);
 	theme->set_color("font_hover_color", "MenuButton", control_font_hover_color);
 	theme->set_color("font_hover_color", "MenuButton", control_font_hover_color);
 	theme->set_color("font_disabled_color", "MenuButton", Color(1, 1, 1, 0.3));
 	theme->set_color("font_disabled_color", "MenuButton", Color(1, 1, 1, 0.3));
+	theme->set_color("font_outline_color", "MenuButton", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "MenuButton", 3 * scale);
 	theme->set_constant("hseparation", "MenuButton", 3 * scale);
+	theme->set_constant("outline_size", "MenuButton", 0);
 
 
 	// CheckBox
 	// CheckBox
 
 
@@ -320,9 +328,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_hover_color", "CheckBox", control_font_hover_color);
 	theme->set_color("font_hover_color", "CheckBox", control_font_hover_color);
 	theme->set_color("font_hover_pressed_color", "CheckBox", control_font_pressed_color);
 	theme->set_color("font_hover_pressed_color", "CheckBox", control_font_pressed_color);
 	theme->set_color("font_disabled_color", "CheckBox", control_font_disabled_color);
 	theme->set_color("font_disabled_color", "CheckBox", control_font_disabled_color);
+	theme->set_color("font_outline_color", "CheckBox", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "CheckBox", 4 * scale);
 	theme->set_constant("hseparation", "CheckBox", 4 * scale);
 	theme->set_constant("check_vadjust", "CheckBox", 0 * scale);
 	theme->set_constant("check_vadjust", "CheckBox", 0 * scale);
+	theme->set_constant("outline_size", "CheckBox", 0);
 
 
 	// CheckButton
 	// CheckButton
 
 
@@ -357,9 +367,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_hover_color", "CheckButton", control_font_hover_color);
 	theme->set_color("font_hover_color", "CheckButton", control_font_hover_color);
 	theme->set_color("font_hover_pressed_color", "CheckButton", control_font_pressed_color);
 	theme->set_color("font_hover_pressed_color", "CheckButton", control_font_pressed_color);
 	theme->set_color("font_disabled_color", "CheckButton", control_font_disabled_color);
 	theme->set_color("font_disabled_color", "CheckButton", control_font_disabled_color);
+	theme->set_color("font_outline_color", "CheckButton", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "CheckButton", 4 * scale);
 	theme->set_constant("hseparation", "CheckButton", 4 * scale);
 	theme->set_constant("check_vadjust", "CheckButton", 0 * scale);
 	theme->set_constant("check_vadjust", "CheckButton", 0 * scale);
+	theme->set_constant("outline_size", "CheckButton", 0);
 
 
 	// Label
 	// Label
 
 
@@ -373,7 +385,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_constant("shadow_offset_x", "Label", 1 * scale);
 	theme->set_constant("shadow_offset_x", "Label", 1 * scale);
 	theme->set_constant("shadow_offset_y", "Label", 1 * scale);
 	theme->set_constant("shadow_offset_y", "Label", 1 * scale);
-	theme->set_constant("outline_size", "Label", 0 * scale);
+	theme->set_constant("outline_size", "Label", 0);
 	theme->set_constant("shadow_outline_size", "Label", 1 * scale);
 	theme->set_constant("shadow_outline_size", "Label", 1 * scale);
 	theme->set_constant("line_spacing", "Label", 3 * scale);
 	theme->set_constant("line_spacing", "Label", 3 * scale);
 
 
@@ -389,12 +401,14 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_color", "LineEdit", control_font_color);
 	theme->set_color("font_color", "LineEdit", control_font_color);
 	theme->set_color("font_selected_color", "LineEdit", Color(0, 0, 0));
 	theme->set_color("font_selected_color", "LineEdit", Color(0, 0, 0));
 	theme->set_color("font_uneditable_color", "LineEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
 	theme->set_color("font_uneditable_color", "LineEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
+	theme->set_color("font_outline_color", "LineEdit", Color(1, 1, 1));
 	theme->set_color("cursor_color", "LineEdit", control_font_hover_color);
 	theme->set_color("cursor_color", "LineEdit", control_font_hover_color);
 	theme->set_color("selection_color", "LineEdit", control_selection_color);
 	theme->set_color("selection_color", "LineEdit", control_selection_color);
 	theme->set_color("clear_button_color", "LineEdit", control_font_color);
 	theme->set_color("clear_button_color", "LineEdit", control_font_color);
 	theme->set_color("clear_button_color_pressed", "LineEdit", control_font_pressed_color);
 	theme->set_color("clear_button_color_pressed", "LineEdit", control_font_pressed_color);
 
 
 	theme->set_constant("minimum_character_width", "LineEdit", 4);
 	theme->set_constant("minimum_character_width", "LineEdit", 4);
+	theme->set_constant("outline_size", "LineEdit", 0);
 
 
 	theme->set_icon("clear", "LineEdit", make_icon(line_edit_clear_png));
 	theme->set_icon("clear", "LineEdit", make_icon(line_edit_clear_png));
 
 
@@ -408,6 +422,9 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_color("font_color", "ProgressBar", control_font_hover_color);
 	theme->set_color("font_color", "ProgressBar", control_font_hover_color);
 	theme->set_color("font_shadow_color", "ProgressBar", Color(0, 0, 0));
 	theme->set_color("font_shadow_color", "ProgressBar", Color(0, 0, 0));
+	theme->set_color("font_outline_color", "ProgressBar", Color(1, 1, 1));
+
+	theme->set_constant("outline_size", "ProgressBar", 0);
 
 
 	// TextEdit
 	// TextEdit
 
 
@@ -431,6 +448,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_color", "TextEdit", control_font_color);
 	theme->set_color("font_color", "TextEdit", control_font_color);
 	theme->set_color("font_selected_color", "TextEdit", Color(0, 0, 0));
 	theme->set_color("font_selected_color", "TextEdit", Color(0, 0, 0));
 	theme->set_color("font_readonly_color", "TextEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
 	theme->set_color("font_readonly_color", "TextEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
+	theme->set_color("font_outline_color", "TextEdit", Color(1, 1, 1));
 	theme->set_color("selection_color", "TextEdit", control_selection_color);
 	theme->set_color("selection_color", "TextEdit", control_selection_color);
 	theme->set_color("mark_color", "TextEdit", Color(1.0, 0.4, 0.4, 0.4));
 	theme->set_color("mark_color", "TextEdit", Color(1.0, 0.4, 0.4, 0.4));
 	theme->set_color("code_folding_color", "TextEdit", Color(0.8, 0.8, 0.8, 0.8));
 	theme->set_color("code_folding_color", "TextEdit", Color(0.8, 0.8, 0.8, 0.8));
@@ -444,8 +462,10 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("completion_max_width", "TextEdit", 50);
 	theme->set_constant("completion_max_width", "TextEdit", 50);
 	theme->set_constant("completion_scroll_width", "TextEdit", 3);
 	theme->set_constant("completion_scroll_width", "TextEdit", 3);
 	theme->set_constant("line_spacing", "TextEdit", 4 * scale);
 	theme->set_constant("line_spacing", "TextEdit", 4 * scale);
+	theme->set_constant("outline_size", "TextEdit", 0);
 
 
 	// CodeEdit
 	// CodeEdit
+
 	theme->set_stylebox("normal", "CodeEdit", make_stylebox(tree_bg_png, 3, 3, 3, 3, 0, 0, 0, 0));
 	theme->set_stylebox("normal", "CodeEdit", make_stylebox(tree_bg_png, 3, 3, 3, 3, 0, 0, 0, 0));
 	theme->set_stylebox("focus", "CodeEdit", focus);
 	theme->set_stylebox("focus", "CodeEdit", focus);
 	theme->set_stylebox("read_only", "CodeEdit", make_stylebox(tree_bg_disabled_png, 4, 4, 4, 4, 0, 0, 0, 0));
 	theme->set_stylebox("read_only", "CodeEdit", make_stylebox(tree_bg_disabled_png, 4, 4, 4, 4, 0, 0, 0, 0));
@@ -471,6 +491,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_color", "CodeEdit", control_font_color);
 	theme->set_color("font_color", "CodeEdit", control_font_color);
 	theme->set_color("font_selected_color", "CodeEdit", Color(0, 0, 0));
 	theme->set_color("font_selected_color", "CodeEdit", Color(0, 0, 0));
 	theme->set_color("font_readonly_color", "CodeEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
 	theme->set_color("font_readonly_color", "CodeEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f));
+	theme->set_color("font_outline_color", "CodeEdit", Color(1, 1, 1));
 	theme->set_color("selection_color", "CodeEdit", control_selection_color);
 	theme->set_color("selection_color", "CodeEdit", control_selection_color);
 	theme->set_color("mark_color", "CodeEdit", Color(1.0, 0.4, 0.4, 0.4));
 	theme->set_color("mark_color", "CodeEdit", Color(1.0, 0.4, 0.4, 0.4));
 	theme->set_color("bookmark_color", "CodeEdit", Color(0.5, 0.64, 1, 0.8));
 	theme->set_color("bookmark_color", "CodeEdit", Color(0.5, 0.64, 1, 0.8));
@@ -489,6 +510,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("completion_max_width", "CodeEdit", 50);
 	theme->set_constant("completion_max_width", "CodeEdit", 50);
 	theme->set_constant("completion_scroll_width", "CodeEdit", 3);
 	theme->set_constant("completion_scroll_width", "CodeEdit", 3);
 	theme->set_constant("line_spacing", "CodeEdit", 4 * scale);
 	theme->set_constant("line_spacing", "CodeEdit", 4 * scale);
+	theme->set_constant("outline_size", "CodeEdit", 0);
 
 
 	Ref<Texture2D> empty_icon = memnew(ImageTexture);
 	Ref<Texture2D> empty_icon = memnew(ImageTexture);
 
 
@@ -544,7 +566,8 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_icon("updown", "SpinBox", make_icon(spinbox_updown_png));
 	theme->set_icon("updown", "SpinBox", make_icon(spinbox_updown_png));
 
 
-	//scroll container
+	// ScrollContainer
+
 	Ref<StyleBoxEmpty> empty;
 	Ref<StyleBoxEmpty> empty;
 	empty.instance();
 	empty.instance();
 	theme->set_stylebox("bg", "ScrollContainer", empty);
 	theme->set_stylebox("bg", "ScrollContainer", empty);
@@ -556,7 +579,12 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("scaleborder_size", "Window", 4 * scale);
 	theme->set_constant("scaleborder_size", "Window", 4 * scale);
 
 
 	theme->set_font("title_font", "Window", large_font);
 	theme->set_font("title_font", "Window", large_font);
+	theme->set_font_size("title_font_size", "Window", -1);
+
 	theme->set_color("title_color", "Window", Color(0, 0, 0));
 	theme->set_color("title_color", "Window", Color(0, 0, 0));
+	theme->set_color("title_outline_modulate", "Window", Color(1, 1, 1));
+
+	theme->set_constant("title_outline_size", "Window", 0);
 	theme->set_constant("title_height", "Window", 20 * scale);
 	theme->set_constant("title_height", "Window", 20 * scale);
 	theme->set_constant("resize_margin", "Window", 4 * scale);
 	theme->set_constant("resize_margin", "Window", 4 * scale);
 
 
@@ -611,9 +639,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_disabled_color", "PopupMenu", Color(0.4, 0.4, 0.4, 0.8));
 	theme->set_color("font_disabled_color", "PopupMenu", Color(0.4, 0.4, 0.4, 0.8));
 	theme->set_color("font_hover_color", "PopupMenu", control_font_color);
 	theme->set_color("font_hover_color", "PopupMenu", control_font_color);
 	theme->set_color("font_separator_color", "PopupMenu", control_font_color);
 	theme->set_color("font_separator_color", "PopupMenu", control_font_color);
+	theme->set_color("font_outline_color", "PopupMenu", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "PopupMenu", 4 * scale);
 	theme->set_constant("hseparation", "PopupMenu", 4 * scale);
 	theme->set_constant("vseparation", "PopupMenu", 4 * scale);
 	theme->set_constant("vseparation", "PopupMenu", 4 * scale);
+	theme->set_constant("outline_size", "PopupMenu", 0);
 
 
 	// GraphNode
 	// GraphNode
 
 
@@ -682,6 +712,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("title_button_color", "Tree", control_font_color);
 	theme->set_color("title_button_color", "Tree", control_font_color);
 	theme->set_color("font_color", "Tree", control_font_low_color);
 	theme->set_color("font_color", "Tree", control_font_low_color);
 	theme->set_color("font_selected_color", "Tree", control_font_pressed_color);
 	theme->set_color("font_selected_color", "Tree", control_font_pressed_color);
+	theme->set_color("font_outline_color", "Tree", Color(1, 1, 1));
 	theme->set_color("guide_color", "Tree", Color(0, 0, 0, 0.1));
 	theme->set_color("guide_color", "Tree", Color(0, 0, 0, 0.1));
 	theme->set_color("drop_position_color", "Tree", Color(1, 0.3, 0.2));
 	theme->set_color("drop_position_color", "Tree", Color(1, 0.3, 0.2));
 	theme->set_color("relationship_line_color", "Tree", Color(0.27, 0.27, 0.27));
 	theme->set_color("relationship_line_color", "Tree", Color(0.27, 0.27, 0.27));
@@ -695,8 +726,10 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("draw_guides", "Tree", 1);
 	theme->set_constant("draw_guides", "Tree", 1);
 	theme->set_constant("scroll_border", "Tree", 4);
 	theme->set_constant("scroll_border", "Tree", 4);
 	theme->set_constant("scroll_speed", "Tree", 12);
 	theme->set_constant("scroll_speed", "Tree", 12);
+	theme->set_constant("outline_size", "Tree", 0);
 
 
 	// ItemList
 	// ItemList
+
 	Ref<StyleBoxTexture> item_selected = make_stylebox(selection_png, 4, 4, 4, 4, 8, 2, 8, 2);
 	Ref<StyleBoxTexture> item_selected = make_stylebox(selection_png, 4, 4, 4, 4, 8, 2, 8, 2);
 	Ref<StyleBoxTexture> item_selected_oof = make_stylebox(selection_oof_png, 4, 4, 4, 4, 8, 2, 8, 2);
 	Ref<StyleBoxTexture> item_selected_oof = make_stylebox(selection_oof_png, 4, 4, 4, 4, 8, 2, 8, 2);
 
 
@@ -712,12 +745,15 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_color("font_color", "ItemList", control_font_lower_color);
 	theme->set_color("font_color", "ItemList", control_font_lower_color);
 	theme->set_color("font_selected_color", "ItemList", control_font_pressed_color);
 	theme->set_color("font_selected_color", "ItemList", control_font_pressed_color);
+	theme->set_color("font_outline_color", "ItemList", Color(1, 1, 1));
 	theme->set_color("guide_color", "ItemList", Color(0, 0, 0, 0.1));
 	theme->set_color("guide_color", "ItemList", Color(0, 0, 0, 0.1));
 	theme->set_stylebox("selected", "ItemList", item_selected_oof);
 	theme->set_stylebox("selected", "ItemList", item_selected_oof);
 	theme->set_stylebox("selected_focus", "ItemList", item_selected);
 	theme->set_stylebox("selected_focus", "ItemList", item_selected);
 	theme->set_stylebox("cursor", "ItemList", focus);
 	theme->set_stylebox("cursor", "ItemList", focus);
 	theme->set_stylebox("cursor_unfocused", "ItemList", focus);
 	theme->set_stylebox("cursor_unfocused", "ItemList", focus);
 
 
+	theme->set_constant("outline_size", "ItemList", 0);
+
 	// TabContainer
 	// TabContainer
 
 
 	Ref<StyleBoxTexture> tc_sb = sb_expand(make_stylebox(tab_container_bg_png, 4, 4, 4, 4, 4, 4, 4, 4), 3, 3, 3, 3);
 	Ref<StyleBoxTexture> tc_sb = sb_expand(make_stylebox(tab_container_bg_png, 4, 4, 4, 4, 4, 4, 4, 4), 3, 3, 3, 3);
@@ -743,9 +779,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_selected_color", "TabContainer", control_font_hover_color);
 	theme->set_color("font_selected_color", "TabContainer", control_font_hover_color);
 	theme->set_color("font_unselected_color", "TabContainer", control_font_low_color);
 	theme->set_color("font_unselected_color", "TabContainer", control_font_low_color);
 	theme->set_color("font_disabled_color", "TabContainer", control_font_disabled_color);
 	theme->set_color("font_disabled_color", "TabContainer", control_font_disabled_color);
+	theme->set_color("font_outline_color", "TabContainer", Color(1, 1, 1));
 
 
 	theme->set_constant("side_margin", "TabContainer", 8 * scale);
 	theme->set_constant("side_margin", "TabContainer", 8 * scale);
 	theme->set_constant("icon_separation", "TabContainer", 4 * scale);
 	theme->set_constant("icon_separation", "TabContainer", 4 * scale);
+	theme->set_constant("outline_size", "TabContainer", 0);
 
 
 	// Tabs
 	// Tabs
 
 
@@ -768,8 +806,10 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("font_selected_color", "Tabs", control_font_hover_color);
 	theme->set_color("font_selected_color", "Tabs", control_font_hover_color);
 	theme->set_color("font_unselected_color", "Tabs", control_font_low_color);
 	theme->set_color("font_unselected_color", "Tabs", control_font_low_color);
 	theme->set_color("font_disabled_color", "Tabs", control_font_disabled_color);
 	theme->set_color("font_disabled_color", "Tabs", control_font_disabled_color);
+	theme->set_color("font_outline_color", "Tabs", Color(1, 1, 1));
 
 
 	theme->set_constant("hseparation", "Tabs", 4 * scale);
 	theme->set_constant("hseparation", "Tabs", 4 * scale);
+	theme->set_constant("outline_size", "Tabs", 0);
 
 
 	// Separators
 	// Separators
 
 
@@ -827,9 +867,11 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_color("font_color", "TooltipLabel", Color(0, 0, 0));
 	theme->set_color("font_color", "TooltipLabel", Color(0, 0, 0));
 	theme->set_color("font_shadow_color", "TooltipLabel", Color(0, 0, 0, 0.1));
 	theme->set_color("font_shadow_color", "TooltipLabel", Color(0, 0, 0, 0.1));
+	theme->set_color("font_outline_color", "TooltipLabel", Color(1, 1, 1));
 
 
 	theme->set_constant("shadow_offset_x", "TooltipLabel", 1);
 	theme->set_constant("shadow_offset_x", "TooltipLabel", 1);
 	theme->set_constant("shadow_offset_y", "TooltipLabel", 1);
 	theme->set_constant("shadow_offset_y", "TooltipLabel", 1);
+	theme->set_constant("outline_size", "TooltipLabel", 0);
 
 
 	// RichTextLabel
 	// RichTextLabel
 
 
@@ -854,6 +896,8 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 
 
 	theme->set_color("font_shadow_color", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("font_shadow_color", "RichTextLabel", Color(0, 0, 0, 0));
 
 
+	theme->set_color("font_outline_color", "RichTextLabel", Color(1, 1, 1));
+
 	theme->set_constant("shadow_offset_x", "RichTextLabel", 1 * scale);
 	theme->set_constant("shadow_offset_x", "RichTextLabel", 1 * scale);
 	theme->set_constant("shadow_offset_y", "RichTextLabel", 1 * scale);
 	theme->set_constant("shadow_offset_y", "RichTextLabel", 1 * scale);
 	theme->set_constant("shadow_as_outline", "RichTextLabel", 0 * scale);
 	theme->set_constant("shadow_as_outline", "RichTextLabel", 0 * scale);
@@ -862,9 +906,12 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("table_hseparation", "RichTextLabel", 3 * scale);
 	theme->set_constant("table_hseparation", "RichTextLabel", 3 * scale);
 	theme->set_constant("table_vseparation", "RichTextLabel", 3 * scale);
 	theme->set_constant("table_vseparation", "RichTextLabel", 3 * scale);
 
 
+	theme->set_constant("outline_size", "RichTextLabel", 0);
+
 	theme->set_color("table_odd_row_bg", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("table_odd_row_bg", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("table_even_row_bg", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("table_even_row_bg", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("table_border", "RichTextLabel", Color(0, 0, 0, 0));
 	theme->set_color("table_border", "RichTextLabel", Color(0, 0, 0, 0));
+
 	// Containers
 	// Containers
 
 
 	theme->set_stylebox("bg", "VSplitContainer", make_stylebox(vsplit_bg_png, 1, 1, 1, 1));
 	theme->set_stylebox("bg", "VSplitContainer", make_stylebox(vsplit_bg_png, 1, 1, 1, 1));
@@ -904,6 +951,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_constant("bezier_len_neg", "GraphEdit", 160 * scale);
 	theme->set_constant("bezier_len_neg", "GraphEdit", 160 * scale);
 
 
 	// Visual Node Ports
 	// Visual Node Ports
+
 	theme->set_constant("port_grab_distance_horizontal", "GraphEdit", 48 * scale);
 	theme->set_constant("port_grab_distance_horizontal", "GraphEdit", 48 * scale);
 	theme->set_constant("port_grab_distance_vertical", "GraphEdit", 6 * scale);
 	theme->set_constant("port_grab_distance_vertical", "GraphEdit", 6 * scale);