Browse Source

[Complex Text Layouts] Add BiDi and font features demo.

bruvzg 4 years ago
parent
commit
9a2889b35b
33 changed files with 1493 additions and 179 deletions
  1. 94 0
      gui/bidi_and_font_features/LICENSE.LinLibertine.txt
  2. 92 0
      gui/bidi_and_font_features/LICENSE.Noto.txt
  3. 13 0
      gui/bidi_and_font_features/README.md
  4. 33 0
      gui/bidi_and_font_features/bidi.gd
  5. 627 0
      gui/bidi_and_font_features/bidi.tscn
  6. 15 0
      gui/bidi_and_font_features/custom_st_parser.gd
  7. BIN
      gui/bidi_and_font_features/fonts/LinLibertine_R.otf
  8. 28 0
      gui/bidi_and_font_features/fonts/LinLibertine_R.otf.import
  9. BIN
      gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf
  10. 28 0
      gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf.import
  11. BIN
      gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf
  12. 28 0
      gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf.import
  13. BIN
      gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf
  14. 28 0
      gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf.import
  15. BIN
      gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf
  16. 28 0
      gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf.import
  17. BIN
      gui/bidi_and_font_features/icon.png
  18. 35 0
      gui/bidi_and_font_features/icon.png.import
  19. 6 0
      gui/bidi_and_font_features/lib_font.tres
  20. 12 0
      gui/bidi_and_font_features/noto_font.tres
  21. 15 0
      gui/bidi_and_font_features/project.godot
  22. BIN
      gui/bidi_and_font_features/screenshots/bidi.png
  23. 35 0
      gui/bidi_and_font_features/screenshots/bidi.png.import
  24. BIN
      gui/bidi_and_font_features/screenshots/font_features.png
  25. 35 0
      gui/bidi_and_font_features/screenshots/font_features.png.import
  26. BIN
      gui/bidi_and_font_features/screenshots/line_break_and_fill.png
  27. 35 0
      gui/bidi_and_font_features/screenshots/line_break_and_fill.png.import
  28. 28 0
      gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf.import
  29. 28 0
      gui/ui_mirroring/fonts/NotoSans-Bold.ttf.import
  30. 3 2
      gui/ui_mirroring/icon.png.import
  31. 35 0
      gui/ui_mirroring/screenshots/ui_mirroring_ar.png.import
  32. 35 0
      gui/ui_mirroring/screenshots/ui_mirroring_en.png.import
  33. 177 177
      gui/ui_mirroring/ui_mirroring.tscn

+ 94 - 0
gui/bidi_and_font_features/LICENSE.LinLibertine.txt

@@ -0,0 +1,94 @@
+Copyright (c) 2003–2012, Philipp H. Poll (www.linuxlibertine.org | gillian at linuxlibertine.org),
+with Reserved Font Name "Linux Libertine" and "Biolinum".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

+ 92 - 0
gui/bidi_and_font_features/LICENSE.Noto.txt

@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

+ 13 - 0
gui/bidi_and_font_features/README.md

@@ -0,0 +1,13 @@
+BiDI and Font Features Demo
+
+A demo showing BiDi text and BiDi overrides, line breaking and justification, and OpenType font features.
+
+Language: GDScript
+
+Renderer: Vulkan
+
+## Screenshots
+
+![Screenshot](screenshots/bidi.png)
+![Screenshot](screenshots/line_break_and_fill.png)
+![Screenshot](screenshots/font_features.png)

+ 33 - 0
gui/bidi_and_font_features/bidi.gd

@@ -0,0 +1,33 @@
+extends Control
+
+func _ready():
+	var tree = $"TabContainer/Text direction/Tree"
+	var root = tree.create_item()
+	tree.set_hide_root(true)
+	var first = tree.create_item(root)
+	first.set_text(0, "רֵאשִׁית")
+	var second = tree.create_item(first)
+	second.set_text(0, "שֵׁנִי")
+	var third = tree.create_item(second)
+	third.set_text(0, "שְׁלִישִׁי")
+	var fourth = tree.create_item(third)
+	fourth.set_text(0, "fourth")
+
+func _on_Tree_item_selected():
+	var tree = $"TabContainer/Text direction/Tree"
+	var path = ""
+	var item = tree.get_selected()
+	while item != null:
+		path = item.get_text(0) + "/" + path
+		item = item.get_parent()
+	$"TabContainer/Text direction/LineEditST".text = path
+	$"TabContainer/Text direction/LineEditNoST".text = path
+
+func _on_LineEditCustomSTDst_text_changed(new_text):
+	$"TabContainer/Text direction/LineEditCustomSTSource".text = new_text
+
+func _on_LineEditCustomSTSource_text_changed(new_text):
+	$"TabContainer/Text direction/LineEditCustomSTDst".text = new_text
+
+func _on_LineEditCustomSTDst_tree_entered():
+	$"TabContainer/Text direction/LineEditCustomSTDst".text = $"TabContainer/Text direction/LineEditCustomSTSource".text # Refresh text to apply custom script once it's loaded.

+ 627 - 0
gui/bidi_and_font_features/bidi.tscn

@@ -0,0 +1,627 @@
+[gd_scene load_steps=5 format=3 uid="uid://doa7j7q1j4p4e"]
+
+[ext_resource type="Font" path="res://noto_font.tres" id="1"]
+[ext_resource type="Script" path="res://bidi.gd" id="2"]
+[ext_resource type="Script" path="res://custom_st_parser.gd" id="3"]
+[ext_resource type="Font" path="res://lib_font.tres" id="4"]
+
+[node name="Control" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( "2" )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TabContainer" type="TabContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Line breaking and justification" type="Panel" parent="TabContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelBrkInfo" type="Label" parent="TabContainer/Line breaking and justification"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 830.0
+offset_bottom = 52.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "1. Line breaking and space justification."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelTHNoBreak" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 69.5027
+offset_right = 988.0
+offset_bottom = 92.5027
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไทซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท"
+autowrap_mode = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelTHBreak" type="Label" parent="TabContainer/Line breaking and justification"]
+offset_left = 30.0
+offset_top = 100.0
+offset_right = 333.0
+offset_bottom = 200.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไทซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท"
+align = 3
+autowrap_mode = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelJstInfo" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 213.5
+offset_right = 830.0
+offset_bottom = 236.5
+theme_override_colors/font_color = Color(0.420413, 0.832031, 0.504023, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "2. Kashida justification."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelARNoJst2" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 248.5
+offset_right = 830.0
+offset_bottom = 271.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "آنچ اندر وهم ناید آن شوم"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelARJst" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 273.5
+offset_right = 255.0
+offset_bottom = 296.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "آنچ اندر وهم ناید آن شوم"
+align = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Text direction" type="Panel" parent="TabContainer"]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelDirInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 830.0
+offset_bottom = 50.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "1. Base text direction. (Left-to-right, Auto, Right-to-left)"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditL1" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 60.0
+offset_right = 260.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+text_direction = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditA1" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 270.0
+offset_top = 60.0
+offset_right = 500.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditR1" type="LineEdit" parent="TabContainer/Text direction"]
+modulate = Color(0.847059, 0.54902, 0.54902, 1)
+offset_left = 510.0
+offset_top = 60.0
+offset_right = 740.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+text_direction = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditL2" type="LineEdit" parent="TabContainer/Text direction"]
+modulate = Color(0.847059, 0.54902, 0.54902, 1)
+offset_left = 30.0
+offset_top = 99.5
+offset_right = 260.0
+offset_bottom = 129.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+text_direction = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditA2" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 270.0
+offset_top = 100.0
+offset_right = 500.0
+offset_bottom = 130.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditR2" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 510.0
+offset_top = 100.0
+offset_right = 740.0
+offset_bottom = 130.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+text_direction = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelSTInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 150.0
+offset_right = 830.0
+offset_bottom = 170.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "2. BiDi override for structured text (select item in the list to test)."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Tree" type="Tree" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 180.0
+offset_right = 430.0
+offset_bottom = 340.0
+theme_override_fonts/title_button_font = ExtResource( "1" )
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelNoST" type="Label" parent="TabContainer/Text direction"]
+offset_left = 460.0
+offset_top = 195.0
+offset_right = 560.0
+offset_bottom = 215.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Default BiDi:"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelST" type="Label" parent="TabContainer/Text direction"]
+offset_left = 460.0
+offset_top = 238.5
+offset_right = 560.0
+offset_bottom = 258.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "\"File\" override:"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditNoST" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 582.0
+offset_top = 188.0
+offset_right = 882.0
+offset_bottom = 218.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditST" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 582.0
+offset_top = 236.0
+offset_right = 882.0
+offset_bottom = 266.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelSTCustomInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 358.0
+offset_right = 830.0
+offset_bottom = 381.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "3. Custom BiDi override script (split by \":\" and reverse the order, see \"cutom_st_parser.gd\"):"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditCustomSTSource" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 396.0
+offset_right = 330.0
+offset_bottom = 426.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "first:second:third"
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditCustomSTDst" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 342.0
+offset_top = 396.0
+offset_right = 642.0
+offset_bottom = 426.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "first:second:third"
+context_menu_enabled = false
+structured_text_bidi_override = 6
+structured_text_bidi_override_options = []
+script = ExtResource( "3" )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Font features" type="Panel" parent="TabContainer"]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelDisplay1" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 330.0
+offset_bottom = 70.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo1" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 30.0
+offset_right = 746.0
+offset_bottom = 70.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "default, no features"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay2" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 69.5
+offset_right = 330.0
+offset_bottom = 109.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/standard_ligatures = null
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo2" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 70.0
+offset_right = 746.0
+offset_bottom = 110.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "standard_ligatures=0 (disabled)"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay3" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 109.5
+offset_right = 330.0
+offset_bottom = 149.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/small_capitals = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo3" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 110.0
+offset_right = 746.0
+offset_bottom = 150.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "small_capitals=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay4" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 150.5
+offset_right = 331.0
+offset_bottom = 190.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/slashed_zero = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo4" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 150.0
+offset_right = 746.0
+offset_bottom = 190.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "slashed_zero=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay5" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 190.5
+offset_right = 331.0
+offset_bottom = 230.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/fractions = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo5" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 190.0
+offset_right = 918.609
+offset_bottom = 230.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "fractions"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay6" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 230.5
+offset_right = 331.0
+offset_bottom = 270.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/oldstyle_figures = 1.0
+opentype_features/stylistic_alternates = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo6" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 230.0
+offset_right = 918.609
+offset_bottom = 270.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "oldstyle_figures=1, stylistic_alternates=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RichTextLabel" type="RichTextLabel" parent="TabContainer/Font features"]
+offset_left = 33.0
+offset_top = 287.0
+offset_right = 965.0
+offset_bottom = 383.0
+theme_override_fonts/normal_font = ExtResource( "4" )
+text = "
+Que fin 1/3 0 Que fin 1/3 0 Que fin 1/3 0
+"
+bbcode_enabled = true
+custom_effects = []
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RichTextLabel2" type="RichTextLabel" parent="TabContainer/Font features"]
+anchor_left = -0.000334372
+anchor_right = -0.000334372
+offset_left = 33.3397
+offset_top = 407.0
+offset_right = 992.34
+offset_bottom = 490.0
+theme_override_fonts/normal_font = ExtResource( "4" )
+text = "[font_size=24]
+Que fin 1/3 0 [opentype_features=liga=0]Que fin 1/3 0[/opentype_features] [opentype_features=frac=1,zero]Que fin 1/3 0[/opentype_features]
+[/font_size]"
+custom_effects = []
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="item_selected" from="TabContainer/Text direction/Tree" to="." method="_on_Tree_item_selected"]
+[connection signal="text_changed" from="TabContainer/Text direction/LineEditCustomSTSource" to="." method="_on_LineEditCustomSTSource_text_changed"]
+[connection signal="text_changed" from="TabContainer/Text direction/LineEditCustomSTDst" to="." method="_on_LineEditCustomSTDst_text_changed"]
+[connection signal="tree_entered" from="TabContainer/Text direction/LineEditCustomSTDst" to="." method="_on_LineEditCustomSTDst_tree_entered"]

+ 15 - 0
gui/bidi_and_font_features/custom_st_parser.gd

@@ -0,0 +1,15 @@
+extends LineEdit
+
+func _structured_text_parser(args, text):
+	var output = []
+	var tags = text.split(":")
+	var prev = 0
+	var count = int(tags.size())
+	output.clear()
+	for i in range(count):
+		var range1 = Vector2i(prev, prev + tags[i].length())
+		var range2 = Vector2i(prev + tags[i].length(), prev + tags[i].length() + 1)
+		output.push_front(range1)
+		output.push_front(range2)
+		prev = prev + tags[i].length() + 1
+	return output

BIN
gui/bidi_and_font_features/fonts/LinLibertine_R.otf


+ 28 - 0
gui/bidi_and_font_features/fonts/LinLibertine_R.otf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://bic5b75wmaxwj"
+path="res://.godot/imported/LinLibertine_R.otf-0d33583986cf94e9ad55cc89a5951934.fontdata"
+
+[deps]
+
+source_file="res://fonts/LinLibertine_R.otf"
+dest_files=["res://.godot/imported/LinLibertine_R.otf-0d33583986cf94e9ad55cc89a5951934.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

BIN
gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://61ui1kmi5tt7"
+path="res://.godot/imported/NotoNaskhArabicUI_Regular.ttf-71ae3841953d426d66ee60d00f69e0e0.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoNaskhArabicUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoNaskhArabicUI_Regular.ttf-71ae3841953d426d66ee60d00f69e0e0.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

BIN
gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://cwer1pi5ka4io"
+path="res://.godot/imported/NotoSansHebrew_Regular.ttf-9d09161984e30bb05b9445728c29a2a8.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansHebrew_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansHebrew_Regular.ttf-9d09161984e30bb05b9445728c29a2a8.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

BIN
gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://dcyy0x2u3jocr"
+path="res://.godot/imported/NotoSansThaiUI_Regular.ttf-a2b65614687aa5ce07b4d39f23198f14.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansThaiUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansThaiUI_Regular.ttf-a2b65614687aa5ce07b4d39f23198f14.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

BIN
gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://ba53h385o6ips"
+path="res://.godot/imported/NotoSansUI_Regular.ttf-e126ff40055cb76ad9714327677638b8.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansUI_Regular.ttf-e126ff40055cb76ad9714327677638b8.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

BIN
gui/bidi_and_font_features/icon.png


+ 35 - 0
gui/bidi_and_font_features/icon.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://g6u3g3bv5nva"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 6 - 0
gui/bidi_and_font_features/lib_font.tres

@@ -0,0 +1,6 @@
+[gd_resource type="Font" load_steps=2 format=2]
+
+[ext_resource path="res://fonts/LinLibertine_R.otf" type="FontData" id=1]
+
+[resource]
+data/0 = ExtResource( 1 )

+ 12 - 0
gui/bidi_and_font_features/noto_font.tres

@@ -0,0 +1,12 @@
+[gd_resource type="Font" load_steps=5 format=2]
+
+[ext_resource path="res://fonts/NotoSansThaiUI_Regular.ttf" type="FontData" id=1]
+[ext_resource path="res://fonts/NotoNaskhArabicUI_Regular.ttf" type="FontData" id=2]
+[ext_resource path="res://fonts/NotoSansHebrew_Regular.ttf" type="FontData" id=3]
+[ext_resource path="res://fonts/NotoSansUI_Regular.ttf" type="FontData" id=4]
+
+[resource]
+data/0 = ExtResource( 1 )
+data/1 = ExtResource( 2 )
+data/2 = ExtResource( 3 )
+data/3 = ExtResource( 4 )

+ 15 - 0
gui/bidi_and_font_features/project.godot

@@ -0,0 +1,15 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=4
+
+[application]
+
+config/name="BiDi and font features demo."
+run/main_scene="res://bidi.tscn"
+config/icon="res://icon.png"

BIN
gui/bidi_and_font_features/screenshots/bidi.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/bidi.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://e0kr85p63y1e"
+path="res://.godot/imported/bidi.png-b063a53994859c3e43f1022e88c1162c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/bidi.png"
+dest_files=["res://.godot/imported/bidi.png-b063a53994859c3e43f1022e88c1162c.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

BIN
gui/bidi_and_font_features/screenshots/font_features.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/font_features.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://c1acx0yclosw3"
+path="res://.godot/imported/font_features.png-0a9509f2c2c735752a635f0a4ca36458.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/font_features.png"
+dest_files=["res://.godot/imported/font_features.png-0a9509f2c2c735752a635f0a4ca36458.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

BIN
gui/bidi_and_font_features/screenshots/line_break_and_fill.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/line_break_and_fill.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://buudvan2lbkg8"
+path="res://.godot/imported/line_break_and_fill.png-7f47b8c4f43550cfc850eae46ff42cd7.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/line_break_and_fill.png"
+dest_files=["res://.godot/imported/line_break_and_fill.png-7f47b8c4f43550cfc850eae46ff42cd7.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 28 - 0
gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://cppw66bb3hcnx"
+path="res://.godot/imported/NotoNaskhArabic-Bold.ttf-b67ac52f5189efb58090e60209f82666.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoNaskhArabic-Bold.ttf"
+dest_files=["res://.godot/imported/NotoNaskhArabic-Bold.ttf-b67ac52f5189efb58090e60209f82666.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

+ 28 - 0
gui/ui_mirroring/fonts/NotoSans-Bold.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://gfhw2u2k16h"
+path="res://.godot/imported/NotoSans-Bold.ttf-8ff3d9f1cfda88e84d6afd9724b2bba7.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSans-Bold.ttf"
+dest_files=["res://.godot/imported/NotoSans-Bold.ttf-8ff3d9f1cfda88e84d6afd9724b2bba7.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

+ 3 - 2
gui/ui_mirroring/icon.png.import

@@ -2,6 +2,7 @@
 
 importer="texture"
 type="StreamTexture2D"
+uid="uid://bn78a6fg2lrwg"
 path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
 metadata={
 "vram_texture": false
@@ -10,7 +11,7 @@ metadata={
 [deps]
 
 source_file="res://icon.png"
-dest_files=[ "res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ]
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"]
 
 [params]
 
@@ -27,7 +28,7 @@ roughness/mode=0
 roughness/src_normal=""
 process/fix_alpha_border=true
 process/premult_alpha=false
-process/invert_color=false
+process/normal_map_invert_y=false
 process/HDR_as_SRGB=false
 process/size_limit=0
 detect_3d/compress_to=1

+ 35 - 0
gui/ui_mirroring/screenshots/ui_mirroring_ar.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://bk7vjwlmxebjj"
+path="res://.godot/imported/ui_mirroring_ar.png-0ac3776471fa54847d7107e345a38530.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/ui_mirroring_ar.png"
+dest_files=["res://.godot/imported/ui_mirroring_ar.png-0ac3776471fa54847d7107e345a38530.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 35 - 0
gui/ui_mirroring/screenshots/ui_mirroring_en.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://kmiwt21qccaq"
+path="res://.godot/imported/ui_mirroring_en.png-2424f2dd8e09af8f321757ff70ce6185.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/ui_mirroring_en.png"
+dest_files=["res://.godot/imported/ui_mirroring_en.png-2424f2dd8e09af8f321757ff70ce6185.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 177 - 177
gui/ui_mirroring/ui_mirroring.tscn

@@ -1,8 +1,8 @@
-[gd_scene load_steps=3 format=2]
+[gd_scene load_steps=3 format=3 uid="uid://c20r173idr1eu"]
 
-[ext_resource path="res://noto_font.tres" type="Font" id=1]
+[ext_resource type="Font" path="res://noto_font.tres" id="1"]
 
-[sub_resource type="GDScript" id=1]
+[sub_resource type="GDScript" id="1"]
 script/source = "extends Control
 
 func _ready():
@@ -19,19 +19,19 @@ func _on_Button_pressed():
 [node name="Control" type="Control"]
 anchor_right = 1.0
 anchor_bottom = 1.0
-script = SubResource( 1 )
+script = SubResource( "1" )
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="PanelLTR" type="Panel" parent="."]
-self_modulate = Color( 0.494118, 1, 0.737255, 1 )
+self_modulate = Color(0.494118, 1, 0.737255, 1)
 anchor_top = 1.0
 anchor_bottom = 1.0
-margin_left = 35.0
-margin_top = -200.0
-margin_right = 275.0
-margin_bottom = -50.0
+offset_left = 35.0
+offset_top = -200.0
+offset_right = 275.0
+offset_bottom = -50.0
 layout_direction = 2
 script = null
 __meta__ = {
@@ -39,8 +39,8 @@ __meta__ = {
 }
 
 [node name="GridContainer" type="GridContainer" parent="PanelLTR"]
-margin_right = 40.0
-margin_bottom = 40.0
+offset_right = 40.0
+offset_bottom = 40.0
 columns = 3
 script = null
 __meta__ = {
@@ -48,132 +48,131 @@ __meta__ = {
 }
 
 [node name="ButtonNW" type="Button" parent="PanelLTR/GridContainer"]
-margin_right = 77.3438
-margin_bottom = 23.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_right = 77.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "NorthWest"
 script = null
 
 [node name="ButtonN" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 81.0
-margin_right = 128.719
-margin_bottom = 23.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 81.0
+offset_right = 128.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "North"
 script = null
 
 [node name="ButtonNE" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 132.0
-margin_right = 204.859
-margin_bottom = 23.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 132.0
+offset_right = 204.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "NorthEast"
 script = null
 
 [node name="ButtonW" type="Button" parent="PanelLTR/GridContainer"]
-margin_top = 27.0
-margin_right = 77.0
-margin_bottom = 50.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_top = 31.0
+offset_right = 77.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "West"
 script = null
 
 [node name="ButtonCenter" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 81.0
-margin_top = 27.0
-margin_right = 128.0
-margin_bottom = 50.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 81.0
+offset_top = 31.0
+offset_right = 128.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "*"
 script = null
 
 [node name="ButtonE" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 132.0
-margin_top = 27.0
-margin_right = 204.0
-margin_bottom = 50.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 132.0
+offset_top = 31.0
+offset_right = 204.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Еast"
 script = null
 
 [node name="ButtonSW" type="Button" parent="PanelLTR/GridContainer"]
-margin_top = 54.0
-margin_right = 77.0
-margin_bottom = 77.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_top = 62.0
+offset_right = 77.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "SouthWest"
 script = null
 
 [node name="ButtonS" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 81.0
-margin_top = 54.0
-margin_right = 128.016
-margin_bottom = 77.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 81.0
+offset_top = 62.0
+offset_right = 128.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "South"
 script = null
 
 [node name="ButtonSE" type="Button" parent="PanelLTR/GridContainer"]
-margin_left = 132.0
-margin_top = 54.0
-margin_right = 204.156
-margin_bottom = 77.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 132.0
+offset_top = 62.0
+offset_right = 204.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "SouthEast"
 script = null
 
 [node name="PanelLocale" type="Panel" parent="PanelLTR"]
-self_modulate = Color( 0.819608, 0.254902, 0.254902, 1 )
-margin_left = 20.0
-margin_top = 90.0
-margin_right = 170.0
-margin_bottom = 130.0
+self_modulate = Color(0.819608, 0.254902, 0.254902, 1)
+offset_left = 20.0
+offset_top = 90.0
+offset_right = 170.0
+offset_bottom = 130.0
 layout_direction = 1
 script = null
 
 [node name="HBoxContainer" type="HBoxContainer" parent="PanelLTR/PanelLocale"]
-margin_right = 107.0
-margin_bottom = 34.0005
+offset_right = 107.0
+offset_bottom = 34.0005
 script = null
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="ButtonPrev" type="Button" parent="PanelLTR/PanelLocale/HBoxContainer"]
-margin_left = -0.34375
-margin_right = 63.0
-margin_bottom = 34.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_right = 64.0
+offset_bottom = 34.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Previous"
 script = null
 
 [node name="ButtonNext" type="Button" parent="PanelLTR/PanelLocale/HBoxContainer"]
-margin_left = 66.2656
-margin_right = 107.0
-margin_bottom = 34.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 68.0
+offset_right = 109.0
+offset_bottom = 34.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Next"
 script = null
 
 [node name="PanelRTL" type="Panel" parent="."]
-self_modulate = Color( 0.0705882, 0.235294, 1, 1 )
+self_modulate = Color(0.0705882, 0.235294, 1, 1)
 anchor_top = 1.0
 anchor_bottom = 1.0
-margin_left = 33.9999
-margin_top = -200.0
-margin_right = 284.0
-margin_bottom = -50.0
+offset_left = 33.9999
+offset_top = -200.0
+offset_right = 284.0
+offset_bottom = -50.0
 layout_direction = 3
 script = null
 __meta__ = {
@@ -181,8 +180,8 @@ __meta__ = {
 }
 
 [node name="GridContainer" type="GridContainer" parent="PanelRTL"]
-margin_right = 40.0
-margin_bottom = 40.0
+offset_right = 40.0
+offset_bottom = 40.0
 columns = 3
 script = null
 __meta__ = {
@@ -190,97 +189,96 @@ __meta__ = {
 }
 
 [node name="ButtonNW" type="Button" parent="PanelRTL/GridContainer"]
-margin_right = 80.0
-margin_bottom = 27.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_right = 81.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الشمال الشرقي"
 script = null
 
 [node name="ButtonN" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 84.0
-margin_right = 128.0
-margin_bottom = 27.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 85.0
+offset_right = 131.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الشمال"
 script = null
 
 [node name="ButtonNE" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 132.0
-margin_right = 218.0
-margin_bottom = 27.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 135.0
+offset_right = 214.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الشمال الغربي"
 script = null
 
 [node name="ButtonW" type="Button" parent="PanelRTL/GridContainer"]
-margin_top = 31.0
-margin_right = 80.0
-margin_bottom = 58.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_top = 31.0
+offset_right = 81.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الشرق"
 script = null
 
 [node name="ButtonCenter" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 84.0
-margin_top = 31.0
-margin_right = 128.0
-margin_bottom = 58.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 85.0
+offset_top = 31.0
+offset_right = 131.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "*"
 script = null
 
 [node name="ButtonE" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 132.0
-margin_top = 31.0
-margin_right = 218.0
-margin_bottom = 58.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 135.0
+offset_top = 31.0
+offset_right = 214.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الغرب"
 script = null
 
 [node name="ButtonSW" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = -0.59375
-margin_top = 62.0
-margin_right = 80.0
-margin_bottom = 89.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_top = 62.0
+offset_right = 81.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الجنوب الشرقي"
 script = null
 
 [node name="ButtonS" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 83.0469
-margin_top = 62.0
-margin_right = 128.0
-margin_bottom = 89.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 85.0
+offset_top = 62.0
+offset_right = 131.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "الجنوب"
 script = null
 
 [node name="ButtonSE" type="Button" parent="PanelRTL/GridContainer"]
-margin_left = 131.734
-margin_top = 62.0
-margin_right = 218.0
-margin_bottom = 89.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 135.0
+offset_top = 62.0
+offset_right = 214.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = " 	الجنوب الغربي"
 script = null
 
 [node name="ButtonSwapLocale" type="Button" parent="."]
-margin_left = 670.0
-margin_top = 25.0
-margin_right = 820.0
-margin_bottom = 65.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 670.0
+offset_top = 25.0
+offset_right = 820.0
+offset_bottom = 65.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Swap locale"
 script = null
 __meta__ = {
@@ -291,87 +289,89 @@ __meta__ = {
 anchor_left = 1.0
 anchor_right = 1.0
 anchor_bottom = 1.0
-margin_left = -20.0
+offset_left = -20.0
 script = null
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="HBoxContainer" type="HBoxContainer" parent="."]
-margin_left = 20.0
-margin_top = 20.0
-margin_right = 140.0
-margin_bottom = 60.0
+offset_left = 20.0
+offset_top = 20.0
+offset_right = 140.0
+offset_bottom = 60.0
 script = null
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="ButtonBack" type="Button" parent="HBoxContainer"]
-margin_left = -0.921875
-margin_right = 40.0
-margin_bottom = 40.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_right = 40.0
+offset_bottom = 40.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Back"
 script = null
 
 [node name="ButtonFwd" type="Button" parent="HBoxContainer"]
-margin_left = 43.2188
-margin_right = 105.0
-margin_bottom = 40.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 44.0
+offset_right = 105.0
+offset_bottom = 40.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Forward"
 script = null
 
 [node name="Label" type="Label" parent="."]
-margin_left = 670.0
-margin_top = 70.0
-margin_right = 820.0
-margin_bottom = 100.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 670.0
+offset_top = 70.0
+offset_right = 820.0
+offset_bottom = 100.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 align = 1
+structured_text_bidi_override_options = []
 script = null
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="LabelInfo" type="Label" parent="."]
-margin_left = 100.0
-margin_top = 100.0
-margin_right = 550.0
-margin_bottom = 300.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 100.0
+offset_top = 100.0
+offset_right = 550.0
+offset_bottom = 300.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Click \"Swap Locale\" button to swap locale between \"en  and \"ar\".
 
 Green tinted controls - LTR layout direction.
 Blue tinted controls - RTL layout direction.
 Red tinted controls - Layout direction from locale.
 Gray (default) controls - Inherited layout direction."
+structured_text_bidi_override_options = []
 script = null
 __meta__ = {
 "_edit_use_anchors_": false
 }
 
 [node name="OptionButton" type="OptionButton" parent="."]
-margin_left = 129.0
-margin_top = 240.0
-margin_right = 264.0
-margin_bottom = 260.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 129.0
+offset_top = 240.0
+offset_right = 264.0
+offset_bottom = 260.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+items = []
 script = null
 
 [node name="CheckBox" type="CheckBox" parent="."]
-margin_left = 124.0
-margin_top = 265.0
-margin_right = 184.0
-margin_bottom = 290.0
-custom_fonts/font = ExtResource( 1 )
-custom_font_sizes/font_size = 12
+offset_left = 124.0
+offset_top = 265.0
+offset_right = 184.0
+offset_bottom = 290.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
 text = "Test"
 script = null
 __meta__ = {