2
0

editor_fonts.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*************************************************************************/
  2. /* editor_fonts.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "editor_fonts.h"
  31. #include "builtin_fonts.gen.h"
  32. #include "core/os/dir_access.h"
  33. #include "editor_scale.h"
  34. #include "editor_settings.h"
  35. #include "scene/resources/default_theme/default_theme.h"
  36. #include "scene/resources/font.h"
  37. #define MAKE_FALLBACKS(m_name) \
  38. m_name->add_data(FontArabic); \
  39. m_name->add_data(FontBengali); \
  40. m_name->add_data(FontGeorgian); \
  41. m_name->add_data(FontMalayalam); \
  42. m_name->add_data(FontOriya); \
  43. m_name->add_data(FontSinhala); \
  44. m_name->add_data(FontTamil); \
  45. m_name->add_data(FontTelugu); \
  46. m_name->add_data(FontHebrew); \
  47. m_name->add_data(FontThai); \
  48. m_name->add_data(FontHindi); \
  49. m_name->add_data(FontJapanese); \
  50. m_name->add_data(FontFallback);
  51. // the custom spacings might only work with Noto Sans
  52. #define MAKE_DEFAULT_FONT(m_name) \
  53. Ref<Font> m_name; \
  54. m_name.instance(); \
  55. if (CustomFont.is_valid()) { \
  56. m_name->add_data(CustomFont); \
  57. m_name->add_data(DefaultFont); \
  58. } else { \
  59. m_name->add_data(DefaultFont); \
  60. } \
  61. m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
  62. m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
  63. MAKE_FALLBACKS(m_name);
  64. #define MAKE_BOLD_FONT(m_name) \
  65. Ref<Font> m_name; \
  66. m_name.instance(); \
  67. if (CustomFontBold.is_valid()) { \
  68. m_name->add_data(CustomFontBold); \
  69. m_name->add_data(DefaultFontBold); \
  70. } else { \
  71. m_name->add_data(DefaultFontBold); \
  72. } \
  73. m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
  74. m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
  75. MAKE_FALLBACKS(m_name);
  76. #define MAKE_SOURCE_FONT(m_name) \
  77. Ref<Font> m_name; \
  78. m_name.instance(); \
  79. if (CustomFontSource.is_valid()) { \
  80. m_name->add_data(CustomFontSource); \
  81. m_name->add_data(dfmono); \
  82. } else { \
  83. m_name->add_data(dfmono); \
  84. } \
  85. m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
  86. m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
  87. MAKE_FALLBACKS(m_name);
  88. void editor_register_fonts(Ref<Theme> p_theme) {
  89. DirAccess *dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
  90. /* Custom font */
  91. bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased");
  92. int font_hinting_setting = (int)EditorSettings::get_singleton()->get("interface/editor/font_hinting");
  93. TextServer::Hinting font_hinting;
  94. switch (font_hinting_setting) {
  95. case 0:
  96. // The "Auto" setting uses the setting that best matches the OS' font rendering:
  97. // - macOS doesn't use font hinting.
  98. // - Windows uses ClearType, which is in between "Light" and "Normal" hinting.
  99. // - Linux has configurable font hinting, but most distributions including Ubuntu default to "Light".
  100. #ifdef OSX_ENABLED
  101. font_hinting = TextServer::HINTING_NONE;
  102. #else
  103. font_hinting = TextServer::HINTING_LIGHT;
  104. #endif
  105. break;
  106. case 1:
  107. font_hinting = TextServer::HINTING_NONE;
  108. break;
  109. case 2:
  110. font_hinting = TextServer::HINTING_LIGHT;
  111. break;
  112. default:
  113. font_hinting = TextServer::HINTING_NORMAL;
  114. break;
  115. }
  116. int default_font_size = int(EDITOR_GET("interface/editor/main_font_size")) * EDSCALE;
  117. String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font");
  118. Ref<FontData> CustomFont;
  119. if (custom_font_path.length() > 0 && dir->file_exists(custom_font_path)) {
  120. CustomFont.instance();
  121. CustomFont->load_resource(custom_font_path, default_font_size);
  122. CustomFont->set_antialiased(font_antialiased);
  123. CustomFont->set_hinting(font_hinting);
  124. CustomFont->set_force_autohinter(true); //just looks better..i think?
  125. } else {
  126. EditorSettings::get_singleton()->set_manually("interface/editor/main_font", "");
  127. }
  128. /* Custom Bold font */
  129. String custom_font_path_bold = EditorSettings::get_singleton()->get("interface/editor/main_font_bold");
  130. Ref<FontData> CustomFontBold;
  131. if (custom_font_path_bold.length() > 0 && dir->file_exists(custom_font_path_bold)) {
  132. CustomFontBold.instance();
  133. CustomFontBold->load_resource(custom_font_path_bold, default_font_size);
  134. CustomFontBold->set_antialiased(font_antialiased);
  135. CustomFontBold->set_hinting(font_hinting);
  136. CustomFontBold->set_force_autohinter(true); //just looks better..i think?
  137. } else {
  138. EditorSettings::get_singleton()->set_manually("interface/editor/main_font_bold", "");
  139. }
  140. /* Custom source code font */
  141. String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font");
  142. Ref<FontData> CustomFontSource;
  143. if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) {
  144. CustomFontSource.instance();
  145. CustomFontSource->load_resource(custom_font_path_source, default_font_size);
  146. CustomFontSource->set_antialiased(font_antialiased);
  147. CustomFontSource->set_hinting(font_hinting);
  148. Vector<String> subtag = String(EditorSettings::get_singleton()->get("interface/editor/code_font_custom_variations")).split(",");
  149. for (int i = 0; i < subtag.size(); i++) {
  150. Vector<String> subtag_a = subtag[i].split("=");
  151. if (subtag_a.size() == 2) {
  152. CustomFontSource->set_variation(subtag_a[0], subtag_a[1].to_float());
  153. }
  154. }
  155. } else {
  156. EditorSettings::get_singleton()->set_manually("interface/editor/code_font", "");
  157. }
  158. memdelete(dir);
  159. /* Droid Sans */
  160. Ref<FontData> DefaultFont;
  161. DefaultFont.instance();
  162. DefaultFont->load_memory(_font_NotoSansUI_Regular, _font_NotoSansUI_Regular_size, "ttf", default_font_size);
  163. DefaultFont->set_antialiased(font_antialiased);
  164. DefaultFont->set_hinting(font_hinting);
  165. DefaultFont->set_force_autohinter(true); //just looks better..i think?
  166. Ref<FontData> DefaultFontBold;
  167. DefaultFontBold.instance();
  168. DefaultFontBold->load_memory(_font_NotoSansUI_Bold, _font_NotoSansUI_Bold_size, "ttf", default_font_size);
  169. DefaultFontBold->set_antialiased(font_antialiased);
  170. DefaultFontBold->set_hinting(font_hinting);
  171. DefaultFontBold->set_force_autohinter(true); // just looks better..i think?
  172. Ref<FontData> FontFallback;
  173. FontFallback.instance();
  174. FontFallback->load_memory(_font_DroidSansFallback, _font_DroidSansFallback_size, "ttf", default_font_size);
  175. FontFallback->set_antialiased(font_antialiased);
  176. FontFallback->set_hinting(font_hinting);
  177. FontFallback->set_force_autohinter(true); //just looks better..i think?
  178. Ref<FontData> FontJapanese;
  179. FontJapanese.instance();
  180. FontJapanese->load_memory(_font_DroidSansJapanese, _font_DroidSansJapanese_size, "ttf", default_font_size);
  181. FontJapanese->set_antialiased(font_antialiased);
  182. FontJapanese->set_hinting(font_hinting);
  183. FontJapanese->set_force_autohinter(true); //just looks better..i think?
  184. Ref<FontData> FontArabic;
  185. FontArabic.instance();
  186. FontArabic->load_memory(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size, "ttf", default_font_size);
  187. FontArabic->set_antialiased(font_antialiased);
  188. FontArabic->set_hinting(font_hinting);
  189. FontArabic->set_force_autohinter(true); //just looks better..i think?
  190. Ref<FontData> FontBengali;
  191. FontBengali.instance();
  192. FontBengali->load_memory(_font_NotoSansBengali_Regular, _font_NotoSansBengali_Regular_size, "ttf", default_font_size);
  193. FontBengali->set_antialiased(font_antialiased);
  194. FontBengali->set_hinting(font_hinting);
  195. FontBengali->set_force_autohinter(true); //just looks better..i think?
  196. Ref<FontData> FontGeorgian;
  197. FontGeorgian.instance();
  198. FontGeorgian->load_memory(_font_NotoSansGeorgian_Regular, _font_NotoSansGeorgian_Regular_size, "ttf", default_font_size);
  199. FontGeorgian->set_antialiased(font_antialiased);
  200. FontGeorgian->set_hinting(font_hinting);
  201. FontGeorgian->set_force_autohinter(true); //just looks better..i think?
  202. Ref<FontData> FontHebrew;
  203. FontHebrew.instance();
  204. FontHebrew->load_memory(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size, "ttf", default_font_size);
  205. FontHebrew->set_antialiased(font_antialiased);
  206. FontHebrew->set_hinting(font_hinting);
  207. FontHebrew->set_force_autohinter(true); //just looks better..i think?
  208. Ref<FontData> FontMalayalam;
  209. FontMalayalam.instance();
  210. FontMalayalam->load_memory(_font_NotoSansMalayalamUI_Regular, _font_NotoSansMalayalamUI_Regular_size, "ttf", default_font_size);
  211. FontMalayalam->set_antialiased(font_antialiased);
  212. FontMalayalam->set_hinting(font_hinting);
  213. FontMalayalam->set_force_autohinter(true); //just looks better..i think?
  214. Ref<FontData> FontOriya;
  215. FontOriya.instance();
  216. FontOriya->load_memory(_font_NotoSansOriyaUI_Regular, _font_NotoSansOriyaUI_Regular_size, "ttf", default_font_size);
  217. FontOriya->set_antialiased(font_antialiased);
  218. FontOriya->set_hinting(font_hinting);
  219. FontOriya->set_force_autohinter(true); //just looks better..i think?
  220. Ref<FontData> FontSinhala;
  221. FontSinhala.instance();
  222. FontSinhala->load_memory(_font_NotoSansSinhalaUI_Regular, _font_NotoSansSinhalaUI_Regular_size, "ttf", default_font_size);
  223. FontSinhala->set_antialiased(font_antialiased);
  224. FontSinhala->set_hinting(font_hinting);
  225. FontSinhala->set_force_autohinter(true); //just looks better..i think?
  226. Ref<FontData> FontTamil;
  227. FontTamil.instance();
  228. FontTamil->load_memory(_font_NotoSansTamilUI_Regular, _font_NotoSansTamilUI_Regular_size, "ttf", default_font_size);
  229. FontTamil->set_antialiased(font_antialiased);
  230. FontTamil->set_hinting(font_hinting);
  231. FontTamil->set_force_autohinter(true); //just looks better..i think?
  232. Ref<FontData> FontTelugu;
  233. FontTelugu.instance();
  234. FontTelugu->load_memory(_font_NotoSansTeluguUI_Regular, _font_NotoSansTeluguUI_Regular_size, "ttf", default_font_size);
  235. FontTelugu->set_antialiased(font_antialiased);
  236. FontTelugu->set_hinting(font_hinting);
  237. FontTelugu->set_force_autohinter(true); //just looks better..i think?
  238. Ref<FontData> FontThai;
  239. FontThai.instance();
  240. FontThai->load_memory(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size, "ttf", default_font_size);
  241. FontThai->set_antialiased(font_antialiased);
  242. FontThai->set_hinting(font_hinting);
  243. FontThai->set_force_autohinter(true); //just looks better..i think?
  244. Ref<FontData> FontHindi;
  245. FontHindi.instance();
  246. FontHindi->load_memory(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size, "ttf", default_font_size);
  247. FontHindi->set_antialiased(font_antialiased);
  248. FontHindi->set_hinting(font_hinting);
  249. FontHindi->set_force_autohinter(true); //just looks better..i think?
  250. /* Hack */
  251. Ref<FontData> dfmono;
  252. dfmono.instance();
  253. dfmono->load_memory(_font_Hack_Regular, _font_Hack_Regular_size, "ttf", default_font_size);
  254. dfmono->set_antialiased(font_antialiased);
  255. dfmono->set_hinting(font_hinting);
  256. Vector<String> subtag = String(EditorSettings::get_singleton()->get("interface/editor/code_font_custom_variations")).split(",");
  257. Dictionary ftrs;
  258. for (int i = 0; i < subtag.size(); i++) {
  259. Vector<String> subtag_a = subtag[i].split("=");
  260. if (subtag_a.size() == 2) {
  261. dfmono->set_variation(subtag_a[0], subtag_a[1].to_float());
  262. }
  263. }
  264. // Default font
  265. MAKE_DEFAULT_FONT(df);
  266. p_theme->set_default_theme_font(df); // Default theme font
  267. p_theme->set_default_theme_font_size(default_font_size);
  268. p_theme->set_font_size("main_size", "EditorFonts", default_font_size);
  269. p_theme->set_font("main", "EditorFonts", df);
  270. // Bold font
  271. MAKE_BOLD_FONT(df_bold);
  272. p_theme->set_font_size("bold_size", "EditorFonts", default_font_size);
  273. p_theme->set_font("bold", "EditorFonts", df_bold);
  274. // Title font
  275. p_theme->set_font_size("title_size", "EditorFonts", default_font_size + 2 * EDSCALE);
  276. p_theme->set_font("title", "EditorFonts", df_bold);
  277. // Documentation fonts
  278. MAKE_SOURCE_FONT(df_code);
  279. p_theme->set_font_size("doc_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
  280. p_theme->set_font("doc", "EditorFonts", df);
  281. p_theme->set_font_size("doc_bold_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
  282. p_theme->set_font("doc_bold", "EditorFonts", df_bold);
  283. p_theme->set_font_size("doc_title_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE);
  284. p_theme->set_font("doc_title", "EditorFonts", df_bold);
  285. p_theme->set_font_size("doc_source_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE);
  286. p_theme->set_font("doc_source", "EditorFonts", df_code);
  287. p_theme->set_font_size("doc_keyboard_size", "EditorFonts", (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE);
  288. p_theme->set_font("doc_keyboard", "EditorFonts", df_code);
  289. // Ruler font
  290. p_theme->set_font_size("rulers_size", "EditorFonts", 8 * EDSCALE);
  291. p_theme->set_font("rulers", "EditorFonts", df);
  292. // Rotation widget font
  293. p_theme->set_font_size("rotation_control_size", "EditorFonts", 14 * EDSCALE);
  294. p_theme->set_font("rotation_control", "EditorFonts", df);
  295. // Code font
  296. p_theme->set_font_size("source_size", "EditorFonts", int(EDITOR_GET("interface/editor/code_font_size")) * EDSCALE);
  297. p_theme->set_font("source", "EditorFonts", df_code);
  298. p_theme->set_font_size("expression_size", "EditorFonts", (int(EDITOR_GET("interface/editor/code_font_size")) - 1) * EDSCALE);
  299. p_theme->set_font("expression", "EditorFonts", df_code);
  300. p_theme->set_font_size("output_source_size", "EditorFonts", int(EDITOR_GET("run/output/font_size")) * EDSCALE);
  301. p_theme->set_font("output_source", "EditorFonts", df_code);
  302. p_theme->set_font_size("status_source_size", "EditorFonts", default_font_size);
  303. p_theme->set_font("status_source", "EditorFonts", df_code);
  304. }