1 module dlangui.platforms.common.startup; 2 3 import dlangui.core.config; 4 import dlangui.core.events; 5 import dlangui.widgets.styles; 6 import dlangui.graphics.fonts; 7 import dlangui.graphics.resources; 8 import dlangui.widgets.widget; 9 import std.utf : toUTF32; 10 11 private immutable dstring DLANGUI_VERSION_VALUE = toUTF32(import("DLANGUI_VERSION")); 12 extern(C) @property dstring DLANGUI_VERSION() { 13 return DLANGUI_VERSION_VALUE; 14 } 15 16 static if (BACKEND_GUI) { 17 import dlangui.graphics.ftfonts; 18 19 version (Windows) { 20 21 /// initialize font manager - default implementation 22 /// On win32 - first it tries to init freetype, and falls back to win32 fonts. 23 /// On linux/mac - tries to init freetype with some hardcoded font paths 24 extern(C) bool initFontManager() { 25 import core.sys.windows.windows; 26 import std.utf; 27 import dlangui.platforms.windows.win32fonts; 28 try { 29 /// testing freetype font manager 30 static if (ENABLE_FREETYPE) { 31 Log.v("Trying to init FreeType font manager"); 32 33 import dlangui.graphics.ftfonts; 34 // trying to create font manager 35 Log.v("Creating FreeTypeFontManager"); 36 FreeTypeFontManager ftfontMan = new FreeTypeFontManager(); 37 38 import core.sys.windows.shlobj; 39 string fontsPath = "c:\\Windows\\Fonts\\"; 40 static if (true) { // SHGetFolderPathW not found in shell32.lib 41 WCHAR[MAX_PATH] szPath; 42 static if (false) { 43 const CSIDL_FLAG_NO_ALIAS = 0x1000; 44 const CSIDL_FLAG_DONT_UNEXPAND = 0x2000; 45 if(SUCCEEDED(SHGetFolderPathW(NULL, 46 CSIDL_FONTS|CSIDL_FLAG_NO_ALIAS|CSIDL_FLAG_DONT_UNEXPAND, 47 NULL, 48 0, 49 szPath.ptr))) 50 { 51 fontsPath = toUTF8(fromWStringz(szPath)); 52 } 53 } else { 54 if (GetWindowsDirectory(szPath.ptr, MAX_PATH - 1)) { 55 fontsPath = toUTF8(fromWStringz(szPath)); 56 Log.i("Windows directory: ", fontsPath); 57 fontsPath ~= "\\Fonts\\"; 58 Log.i("Fonts directory: ", fontsPath); 59 } 60 } 61 } 62 Log.v("Registering fonts"); 63 // arial 64 ftfontMan.registerFont(fontsPath ~ "arial.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Normal); 65 ftfontMan.registerFont(fontsPath ~ "arialbd.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Bold); 66 ftfontMan.registerFont(fontsPath ~ "arialbi.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Bold); 67 ftfontMan.registerFont(fontsPath ~ "ariali.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Normal); 68 // arial unicode ms 69 ftfontMan.registerFont(fontsPath ~ "arialni.ttf", FontFamily.SansSerif, "Arial Unicode MS", false, FontWeight.Normal); 70 // arial narrow 71 ftfontMan.registerFont(fontsPath ~ "arialn.ttf", FontFamily.SansSerif, "Arial Narrow", false, FontWeight.Normal); 72 ftfontMan.registerFont(fontsPath ~ "arialnb.ttf", FontFamily.SansSerif, "Arial Narrow", false, FontWeight.Bold); 73 ftfontMan.registerFont(fontsPath ~ "arialnbi.ttf", FontFamily.SansSerif, "Arial Narrow", true, FontWeight.Bold); 74 ftfontMan.registerFont(fontsPath ~ "arialni.ttf", FontFamily.SansSerif, "Arial Narrow", true, FontWeight.Normal); 75 // calibri 76 ftfontMan.registerFont(fontsPath ~ "calibri.ttf", FontFamily.SansSerif, "Calibri", false, FontWeight.Normal); 77 ftfontMan.registerFont(fontsPath ~ "calibrib.ttf", FontFamily.SansSerif, "Calibri", false, FontWeight.Bold); 78 ftfontMan.registerFont(fontsPath ~ "calibriz.ttf", FontFamily.SansSerif, "Calibri", true, FontWeight.Bold); 79 ftfontMan.registerFont(fontsPath ~ "calibrii.ttf", FontFamily.SansSerif, "Calibri", true, FontWeight.Normal); 80 // cambria 81 ftfontMan.registerFont(fontsPath ~ "cambria.ttc", FontFamily.SansSerif, "Cambria", false, FontWeight.Normal); 82 ftfontMan.registerFont(fontsPath ~ "cambriab.ttf", FontFamily.SansSerif, "Cambria", false, FontWeight.Bold); 83 ftfontMan.registerFont(fontsPath ~ "cambriaz.ttf", FontFamily.SansSerif, "Cambria", true, FontWeight.Bold); 84 ftfontMan.registerFont(fontsPath ~ "cambriai.ttf", FontFamily.SansSerif, "Cambria", true, FontWeight.Normal); 85 // candara 86 ftfontMan.registerFont(fontsPath ~ "Candara.ttf", FontFamily.SansSerif, "Candara", false, FontWeight.Normal); 87 ftfontMan.registerFont(fontsPath ~ "Candarab.ttf", FontFamily.SansSerif, "Candara", false, FontWeight.Bold); 88 ftfontMan.registerFont(fontsPath ~ "Candaraz.ttf", FontFamily.SansSerif, "Candara", true, FontWeight.Bold); 89 ftfontMan.registerFont(fontsPath ~ "Candarai.ttf", FontFamily.SansSerif, "Candara", true, FontWeight.Normal); 90 // century 91 ftfontMan.registerFont(fontsPath ~ "CENTURY.TTF", FontFamily.Serif, "Century", false, FontWeight.Normal); 92 // comic sans ms 93 ftfontMan.registerFont(fontsPath ~ "comic.ttf", FontFamily.Serif, "Comic Sans MS", false, FontWeight.Normal); 94 ftfontMan.registerFont(fontsPath ~ "comicbd.ttf", FontFamily.Serif, "Comic Sans MS", false, FontWeight.Bold); 95 // constantia 96 ftfontMan.registerFont(fontsPath ~ "constan.ttf", FontFamily.Serif, "Constantia", false, FontWeight.Normal); 97 ftfontMan.registerFont(fontsPath ~ "constanb.ttf", FontFamily.Serif, "Constantia", false, FontWeight.Bold); 98 ftfontMan.registerFont(fontsPath ~ "constanz.ttf", FontFamily.Serif, "Constantia", true, FontWeight.Bold); 99 ftfontMan.registerFont(fontsPath ~ "constani.ttf", FontFamily.Serif, "Constantia", true, FontWeight.Normal); 100 // corbel 101 ftfontMan.registerFont(fontsPath ~ "corbel.ttf", FontFamily.SansSerif, "Corbel", false, FontWeight.Normal); 102 ftfontMan.registerFont(fontsPath ~ "corbelb.ttf", FontFamily.SansSerif, "Corbel", false, FontWeight.Bold); 103 ftfontMan.registerFont(fontsPath ~ "corbelz.ttf", FontFamily.SansSerif, "Corbel", true, FontWeight.Bold); 104 ftfontMan.registerFont(fontsPath ~ "corbeli.ttf", FontFamily.SansSerif, "Corbel", true, FontWeight.Normal); 105 // courier new 106 ftfontMan.registerFont(fontsPath ~ "cour.ttf", FontFamily.MonoSpace, "Courier New", false, FontWeight.Normal); 107 ftfontMan.registerFont(fontsPath ~ "courbd.ttf", FontFamily.MonoSpace, "Courier New", false, FontWeight.Bold); 108 ftfontMan.registerFont(fontsPath ~ "courbi.ttf", FontFamily.MonoSpace, "Courier New", true, FontWeight.Bold); 109 ftfontMan.registerFont(fontsPath ~ "couri.ttf", FontFamily.MonoSpace, "Courier New", true, FontWeight.Normal); 110 // franklin gothic book 111 ftfontMan.registerFont(fontsPath ~ "frank.ttf", FontFamily.SansSerif, "Franklin Gothic Book", false, FontWeight.Normal); 112 // times new roman 113 ftfontMan.registerFont(fontsPath ~ "times.ttf", FontFamily.Serif, "Times New Roman", false, FontWeight.Normal); 114 ftfontMan.registerFont(fontsPath ~ "timesbd.ttf", FontFamily.Serif, "Times New Roman", false, FontWeight.Bold); 115 ftfontMan.registerFont(fontsPath ~ "timesbi.ttf", FontFamily.Serif, "Times New Roman", true, FontWeight.Bold); 116 ftfontMan.registerFont(fontsPath ~ "timesi.ttf", FontFamily.Serif, "Times New Roman", true, FontWeight.Normal); 117 // consolas 118 ftfontMan.registerFont(fontsPath ~ "consola.ttf", FontFamily.MonoSpace, "Consolas", false, FontWeight.Normal); 119 ftfontMan.registerFont(fontsPath ~ "consolab.ttf", FontFamily.MonoSpace, "Consolas", false, FontWeight.Bold); 120 ftfontMan.registerFont(fontsPath ~ "consolai.ttf", FontFamily.MonoSpace, "Consolas", true, FontWeight.Normal); 121 ftfontMan.registerFont(fontsPath ~ "consolaz.ttf", FontFamily.MonoSpace, "Consolas", true, FontWeight.Bold); 122 // garamond 123 ftfontMan.registerFont(fontsPath ~ "GARA.TTF", FontFamily.Serif, "Garamond", false, FontWeight.Normal); 124 ftfontMan.registerFont(fontsPath ~ "GARABD.TTF", FontFamily.Serif, "Garamond", false, FontWeight.Bold); 125 ftfontMan.registerFont(fontsPath ~ "GARAIT.TTF", FontFamily.Serif, "Garamond", true, FontWeight.Normal); 126 // georgia 127 ftfontMan.registerFont(fontsPath ~ "georgia.ttf", FontFamily.SansSerif, "Georgia", false, FontWeight.Normal); 128 ftfontMan.registerFont(fontsPath ~ "georgiab.ttf", FontFamily.SansSerif, "Georgia", false, FontWeight.Bold); 129 ftfontMan.registerFont(fontsPath ~ "georgiaz.ttf", FontFamily.SansSerif, "Georgia", true, FontWeight.Bold); 130 ftfontMan.registerFont(fontsPath ~ "georgiai.ttf", FontFamily.SansSerif, "Georgia", true, FontWeight.Normal); 131 // KaiTi 132 ftfontMan.registerFont(fontsPath ~ "kaiu.ttf", FontFamily.SansSerif, "KaiTi", false, FontWeight.Normal); 133 // Lucida Console 134 ftfontMan.registerFont(fontsPath ~ "lucon.ttf", FontFamily.MonoSpace, "Lucida Console", false, FontWeight.Normal); 135 // malgun gothic 136 ftfontMan.registerFont(fontsPath ~ "malgun.ttf", FontFamily.Serif, "Malgun Gothic", false, FontWeight.Normal); 137 ftfontMan.registerFont(fontsPath ~ "malgunbd.ttf", FontFamily.Serif, "Malgun Gothic", false, FontWeight.Bold); 138 // meiryo 139 ftfontMan.registerFont(fontsPath ~ "meiryo.ttc", FontFamily.Serif, "Meiryo", false, FontWeight.Normal); 140 ftfontMan.registerFont(fontsPath ~ "meiryob.ttc", FontFamily.Serif, "Meiryo", false, FontWeight.Bold); 141 // ms mhei 142 ftfontMan.registerFont(fontsPath ~ "MSMHei.ttf", FontFamily.Serif, "Microsoft MHei", false, FontWeight.Normal); 143 ftfontMan.registerFont(fontsPath ~ "MSMHei-Bold.ttf", FontFamily.Serif, "Microsoft MHei", false, FontWeight.Bold); 144 // ms neo gothic 145 ftfontMan.registerFont(fontsPath ~ "MSNeoGothic.ttf", FontFamily.Serif, "Microsoft NeoGothic", false, FontWeight.Normal); 146 ftfontMan.registerFont(fontsPath ~ "MSNeoGothic-Bold.ttf", FontFamily.Serif, "Microsoft NeoGothic", false, FontWeight.Bold); 147 // palatino linotype 148 ftfontMan.registerFont(fontsPath ~ "pala.ttf", FontFamily.Serif, "Palatino Linotype", false, FontWeight.Normal); 149 ftfontMan.registerFont(fontsPath ~ "palab.ttf", FontFamily.Serif, "Palatino Linotype", false, FontWeight.Bold); 150 ftfontMan.registerFont(fontsPath ~ "palabi.ttf", FontFamily.Serif, "Palatino Linotype", true, FontWeight.Bold); 151 ftfontMan.registerFont(fontsPath ~ "palai.ttf", FontFamily.Serif, "Palatino Linotype", true, FontWeight.Normal); 152 // segoeui 153 ftfontMan.registerFont(fontsPath ~ "segoeui.ttf", FontFamily.SansSerif, "Segoe UI", false, FontWeight.Normal); 154 ftfontMan.registerFont(fontsPath ~ "segoeuib.ttf", FontFamily.SansSerif, "Segoe UI", false, FontWeight.Bold); 155 ftfontMan.registerFont(fontsPath ~ "segoeuiz.ttf", FontFamily.SansSerif, "Segoe UI", true, FontWeight.Bold); 156 ftfontMan.registerFont(fontsPath ~ "segoeuii.ttf", FontFamily.SansSerif, "Segoe UI", true, FontWeight.Normal); 157 // SimSun 158 ftfontMan.registerFont(fontsPath ~ "simsun.ttc", FontFamily.SansSerif, "SimSun", false, FontWeight.Normal); 159 ftfontMan.registerFont(fontsPath ~ "simsunb.ttf", FontFamily.SansSerif, "SimSun", false, FontWeight.Bold); 160 // tahoma 161 ftfontMan.registerFont(fontsPath ~ "tahoma.ttf", FontFamily.SansSerif, "Tahoma", false, FontWeight.Normal); 162 ftfontMan.registerFont(fontsPath ~ "tahomabd.ttf", FontFamily.SansSerif, "Tahoma", false, FontWeight.Bold); 163 // trebuchet ms 164 ftfontMan.registerFont(fontsPath ~ "trebuc.ttf", FontFamily.SansSerif, "Trebuchet MS", false, FontWeight.Normal); 165 ftfontMan.registerFont(fontsPath ~ "trebucbd.ttf", FontFamily.SansSerif, "Trebuchet MS", false, FontWeight.Bold); 166 ftfontMan.registerFont(fontsPath ~ "trebucbi.ttf", FontFamily.SansSerif, "Trebuchet MS", true, FontWeight.Bold); 167 ftfontMan.registerFont(fontsPath ~ "trebucit.ttf", FontFamily.SansSerif, "Trebuchet MS", true, FontWeight.Normal); 168 // verdana 169 ftfontMan.registerFont(fontsPath ~ "verdana.ttf", FontFamily.SansSerif, "Verdana", false, FontWeight.Normal); 170 ftfontMan.registerFont(fontsPath ~ "verdanab.ttf", FontFamily.SansSerif, "Verdana", false, FontWeight.Bold); 171 ftfontMan.registerFont(fontsPath ~ "verdanai.ttf", FontFamily.SansSerif, "Verdana", true, FontWeight.Normal); 172 ftfontMan.registerFont(fontsPath ~ "verdanaz.ttf", FontFamily.SansSerif, "Verdana", true, FontWeight.Bold); 173 if (ftfontMan.registeredFontCount()) { 174 FontManager.instance = ftfontMan; 175 } else { 176 Log.w("No fonts registered in FreeType font manager. Disabling FreeType."); 177 destroy(ftfontMan); 178 } 179 } 180 } catch (Exception e) { 181 Log.e("Cannot create FreeTypeFontManager - falling back to win32"); 182 } 183 184 // use Win32 font manager 185 if (FontManager.instance is null) { 186 FontManager.instance = new Win32FontManager(); 187 } 188 return true; 189 } 190 191 } else { 192 import dlangui.graphics.ftfonts; 193 bool registerFonts(FreeTypeFontManager ft, string path) { 194 import std.file; 195 if (!exists(path) || !isDir(path)) 196 return false; 197 ft.registerFont(path ~ "DejaVuSans.ttf", FontFamily.SansSerif, "DejaVuSans", false, FontWeight.Normal); 198 ft.registerFont(path ~ "DejaVuSans-Bold.ttf", FontFamily.SansSerif, "DejaVuSans", false, FontWeight.Bold); 199 ft.registerFont(path ~ "DejaVuSans-Oblique.ttf", FontFamily.SansSerif, "DejaVuSans", true, FontWeight.Normal); 200 ft.registerFont(path ~ "DejaVuSans-BoldOblique.ttf", FontFamily.SansSerif, "DejaVuSans", true, FontWeight.Bold); 201 ft.registerFont(path ~ "DejaVuSansMono.ttf", FontFamily.MonoSpace, "DejaVuSansMono", false, FontWeight.Normal); 202 ft.registerFont(path ~ "DejaVuSansMono-Bold.ttf", FontFamily.MonoSpace, "DejaVuSansMono", false, FontWeight.Bold); 203 ft.registerFont(path ~ "DejaVuSansMono-Oblique.ttf", FontFamily.MonoSpace, "DejaVuSansMono", true, FontWeight.Normal); 204 ft.registerFont(path ~ "DejaVuSansMono-BoldOblique.ttf", FontFamily.MonoSpace, "DejaVuSansMono", true, FontWeight.Bold); 205 return true; 206 } 207 208 string[] findFontsInDirectory(string dir) { 209 import dlangui.core.files; 210 import std.file : DirEntry; 211 DirEntry[] entries; 212 try { 213 entries = listDirectory(dir, AttrFilter.files, ["*.ttf"]); 214 } catch(Exception e) { 215 return null; 216 } 217 218 string[] res; 219 foreach(entry; entries) { 220 res ~= entry.name; 221 } 222 return res; 223 } 224 225 void registerFontsFromDirectory(FreeTypeFontManager ft, string dir) { 226 string[] fontFiles = findFontsInDirectory(dir); 227 Log.d("Fonts in ", dir, " : ", fontFiles); 228 foreach(file; fontFiles) 229 ft.registerFont(file); 230 } 231 232 /// initialize font manager - default implementation 233 /// On win32 - first it tries to init freetype, and falls back to win32 fonts. 234 /// On linux/mac - tries to init freetype with some hardcoded font paths 235 extern(C) bool initFontManager() { 236 FreeTypeFontManager ft = new FreeTypeFontManager(); 237 238 if (!registerFontConfigFonts(ft)) { 239 // TODO: use FontConfig 240 Log.w("No fonts found using FontConfig. Trying hardcoded paths."); 241 version (Android) { 242 ft.registerFontsFromDirectory("/system/fonts"); 243 } else { 244 ft.registerFonts("/usr/share/fonts/truetype/dejavu/"); 245 ft.registerFonts("/usr/share/fonts/TTF/"); 246 ft.registerFonts("/usr/share/fonts/dejavu/"); 247 ft.registerFonts("/usr/share/fonts/truetype/ttf-dejavu/"); // let it compile on Debian Wheezy 248 } 249 version(OSX) { 250 ft.registerFont("/Library/Fonts/Arial.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Normal, true); 251 ft.registerFont("/Library/Fonts/Arial Bold.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Bold, true); 252 ft.registerFont("/Library/Fonts/Arial Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Normal, true); 253 ft.registerFont("/Library/Fonts/Arial Bold Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Bold, true); 254 ft.registerFont("/Library/Fonts/Arial.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Normal, true); 255 ft.registerFont("/Library/Fonts/Arial Bold.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Bold, true); 256 ft.registerFont("/Library/Fonts/Arial Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Normal, true); 257 ft.registerFont("/Library/Fonts/Arial Bold Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Bold, true); 258 ft.registerFont("/Library/Fonts/Arial Narrow.ttf", FontFamily.SansSerif, "Arial Narrow", false, FontWeight.Normal, true); 259 ft.registerFont("/Library/Fonts/Arial Narrow Bold.ttf", FontFamily.SansSerif, "Arial Narrow", false, FontWeight.Bold, true); 260 ft.registerFont("/Library/Fonts/Arial Narrow Italic.ttf", FontFamily.SansSerif, "Arial Narrow", true, FontWeight.Normal, true); 261 ft.registerFont("/Library/Fonts/Arial Narrow Bold Italic.ttf", FontFamily.SansSerif, "Arial Narrow", true, FontWeight.Bold, true); 262 ft.registerFont("/Library/Fonts/Courier New.ttf", FontFamily.MonoSpace, "Courier New", false, FontWeight.Normal, true); 263 ft.registerFont("/Library/Fonts/Courier New Bold.ttf", FontFamily.MonoSpace, "Courier New", false, FontWeight.Bold, true); 264 ft.registerFont("/Library/Fonts/Courier New Italic.ttf", FontFamily.MonoSpace, "Courier New", true, FontWeight.Normal, true); 265 ft.registerFont("/Library/Fonts/Courier New Bold Italic.ttf", FontFamily.MonoSpace, "Courier New", true, FontWeight.Bold, true); 266 ft.registerFont("/Library/Fonts/Georgia.ttf", FontFamily.Serif, "Georgia", false, FontWeight.Normal, true); 267 ft.registerFont("/Library/Fonts/Georgia Bold.ttf", FontFamily.Serif, "Georgia", false, FontWeight.Bold, true); 268 ft.registerFont("/Library/Fonts/Georgia Italic.ttf", FontFamily.Serif, "Georgia", true, FontWeight.Normal, true); 269 ft.registerFont("/Library/Fonts/Georgia Bold Italic.ttf", FontFamily.Serif, "Georgia", true, FontWeight.Bold, true); 270 ft.registerFont("/Library/Fonts/Comic Sans MS.ttf", FontFamily.SansSerif, "Comic Sans", false, FontWeight.Normal, true); 271 ft.registerFont("/Library/Fonts/Comic Sans MS Bold.ttf", FontFamily.SansSerif, "Comic Sans", false, FontWeight.Bold, true); 272 ft.registerFont("/Library/Fonts/Tahoma.ttf", FontFamily.SansSerif, "Tahoma", false, FontWeight.Normal, true); 273 ft.registerFont("/Library/Fonts/Tahoma Bold.ttf", FontFamily.SansSerif, "Tahoma", false, FontWeight.Bold, true); 274 275 ft.registerFont("/Library/Fonts/Microsoft/Arial.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Normal, true); 276 ft.registerFont("/Library/Fonts/Microsoft/Arial Bold.ttf", FontFamily.SansSerif, "Arial", false, FontWeight.Bold, true); 277 ft.registerFont("/Library/Fonts/Microsoft/Arial Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Normal, true); 278 ft.registerFont("/Library/Fonts/Microsoft/Arial Bold Italic.ttf", FontFamily.SansSerif, "Arial", true, FontWeight.Bold, true); 279 ft.registerFont("/Library/Fonts/Microsoft/Calibri.ttf", FontFamily.SansSerif, "Calibri", false, FontWeight.Normal, true); 280 ft.registerFont("/Library/Fonts/Microsoft/Calibri Bold.ttf", FontFamily.SansSerif, "Calibri", false, FontWeight.Bold, true); 281 ft.registerFont("/Library/Fonts/Microsoft/Calibri Italic.ttf", FontFamily.SansSerif, "Calibri", true, FontWeight.Normal, true); 282 ft.registerFont("/Library/Fonts/Microsoft/Calibri Bold Italic.ttf", FontFamily.SansSerif, "Calibri", true, FontWeight.Bold, true); 283 ft.registerFont("/Library/Fonts/Microsoft/Times New Roman.ttf", FontFamily.Serif, "Times New Roman", false, FontWeight.Normal, true); 284 ft.registerFont("/Library/Fonts/Microsoft/Times New Roman Bold.ttf", FontFamily.Serif, "Times New Roman", false, FontWeight.Bold, true); 285 ft.registerFont("/Library/Fonts/Microsoft/Times New Roman Italic.ttf", FontFamily.Serif, "Times New Roman", true, FontWeight.Normal, true); 286 ft.registerFont("/Library/Fonts/Microsoft/Times New Roman Bold Italic.ttf", FontFamily.Serif, "Times New Roman", true, FontWeight.Bold, true); 287 ft.registerFont("/Library/Fonts/Microsoft/Verdana.ttf", FontFamily.SansSerif, "Verdana", false, FontWeight.Normal, true); 288 ft.registerFont("/Library/Fonts/Microsoft/Verdana Bold.ttf", FontFamily.SansSerif, "Verdana", false, FontWeight.Bold, true); 289 ft.registerFont("/Library/Fonts/Microsoft/Verdana Italic.ttf", FontFamily.SansSerif, "Verdana", true, FontWeight.Normal, true); 290 ft.registerFont("/Library/Fonts/Microsoft/Verdana Bold Italic.ttf", FontFamily.SansSerif, "Verdana", true, FontWeight.Bold, true); 291 292 ft.registerFont("/Library/Fonts/Microsoft/Consolas.ttf", FontFamily.MonoSpace, "Consolas", false, FontWeight.Normal, true); 293 ft.registerFont("/Library/Fonts/Microsoft/Consolas Bold.ttf", FontFamily.MonoSpace, "Consolas", false, FontWeight.Bold, true); 294 ft.registerFont("/Library/Fonts/Microsoft/Consolas Italic.ttf", FontFamily.MonoSpace, "Consolas", true, FontWeight.Normal, true); 295 ft.registerFont("/Library/Fonts/Microsoft/Consolas Bold Italic.ttf", FontFamily.MonoSpace, "Consolas", true, FontWeight.Bold, true); 296 297 ft.registerFont("/System/Library/Fonts/Menlo.ttc", FontFamily.MonoSpace, "Menlo", false, FontWeight.Normal, true); 298 } 299 } 300 301 if (!ft.registeredFontCount) 302 return false; 303 304 FontManager.instance = ft; 305 return true; 306 } 307 } 308 } 309 310 /// initialize logging (for win32 - to file ui.log, for other platforms - stderr; log level is TRACE for debug builds, and WARN for release builds) 311 extern (C) void initLogs() { 312 static if (BACKEND_CONSOLE) { 313 static import std.stdio; 314 debug { 315 Log.setFileLogger(new std.stdio.File("ui.log", "w")); 316 Log.i("Debug build. Logging to file ui.log"); 317 Log.setLogLevel(LogLevel.Trace); 318 } else { 319 // no logging unless version ForceLogs is set 320 version(ForceLogs) { 321 Log.setFileLogger(new std.stdio.File("ui.log", "w")); 322 Log.i("Logging to file ui.log"); 323 //Log.setLogLevel(LogLevel.Trace); 324 } 325 } 326 } else { 327 static import std.stdio; 328 version (Windows) { 329 debug { 330 Log.setFileLogger(new std.stdio.File("ui.log", "w")); 331 } else { 332 // no logging unless version ForceLogs is set 333 version(ForceLogs) { 334 Log.setFileLogger(new std.stdio.File("ui.log", "w")); 335 Log.i("Logging to file ui.log"); 336 } 337 } 338 } else version(Android) { 339 Log.setLogTag("dlangui"); 340 Log.setLogLevel(LogLevel.Trace); 341 } else { 342 Log.setStderrLogger(); 343 } 344 debug { 345 Log.setLogLevel(LogLevel.Trace); 346 } else { 347 version(ForceLogs) { 348 Log.setLogLevel(LogLevel.Trace); 349 Log.i("Log level: trace"); 350 } else { 351 Log.setLogLevel(LogLevel.Warn); 352 Log.i("Log level: warn"); 353 } 354 } 355 } 356 Log.i("Logger is initialized"); 357 } 358 359 /// call this on application initialization 360 extern (C) void initResourceManagers() { 361 Log.d("initResourceManagers()"); 362 import dlangui.graphics.fonts; 363 _gamma65 = new glyph_gamma_table!65(1.0); 364 _gamma256 = new glyph_gamma_table!256(1.0); 365 static if (ENABLE_FREETYPE) { 366 import dlangui.graphics.ftfonts; 367 STD_FONT_FACES = [ 368 "Arial": 12, 369 "Times New Roman": 12, 370 "Courier New": 10, 371 "DejaVu Serif": 10, 372 "DejaVu Sans": 10, 373 "DejaVu Sans Mono": 10, 374 "Liberation Serif": 11, 375 "Liberation Sans": 11, 376 "Liberation Mono": 11, 377 "Verdana": 10, 378 "Menlo": 13, 379 "Consolas": 12, 380 "DejaVuSansMono": 10, 381 "Lucida Sans Typewriter": 10, 382 "Lucida Console": 12, 383 "FreeMono": 8, 384 "FreeSans": 8, 385 "FreeSerif": 8, 386 ]; 387 } 388 static if (ENABLE_OPENGL) { 389 import dlangui.graphics.gldrawbuf; 390 initGLCaches(); 391 } 392 import dlangui.graphics.resources; 393 embedStandardDlangUIResources(); 394 static if (BACKEND_GUI) { 395 _imageCache = new ImageCache(); 396 } 397 _drawableCache = new DrawableCache(); 398 static if (BACKEND_GUI) { 399 version (Windows) { 400 import dlangui.platforms.windows.win32fonts; 401 initWin32FontsTables(); 402 } 403 } 404 405 Log.d("Calling initSharedResourceManagers()"); 406 initSharedResourceManagers(); 407 408 Log.d("Calling initStandardEditorActions()"); 409 import dlangui.widgets.editors; 410 initStandardEditorActions(); 411 412 Log.d("Calling registerStandardWidgets()"); 413 registerStandardWidgets(); 414 415 416 Log.d("initResourceManagers() -- finished"); 417 } 418 419 420 421 /// call this from shared static this() 422 extern (C) void initSharedResourceManagers() { 423 //Log.d("initSharedResourceManagers()"); 424 //import dlangui.core.i18n; 425 //if (!i18n) { 426 // Log.d("Creating i18n object"); 427 // i18n = new shared UIStringTranslator(); 428 //} 429 } 430 431 shared static this() { 432 //initSharedResourceManagers(); 433 } 434 435 /// register standard widgets to use in DML 436 extern(C) void registerStandardWidgets(); 437 438 /// call this when all resources are supposed to be freed to report counts of non-freed resources by type 439 extern (C) void releaseResourcesOnAppExit() { 440 441 // 442 debug setAppShuttingDownFlag(); 443 444 debug { 445 if (Widget.instanceCount() > 0) { 446 Log.e("Non-zero Widget instance count when exiting: ", Widget.instanceCount); 447 } 448 } 449 450 currentTheme = null; 451 drawableCache = null; 452 static if (BACKEND_GUI) { 453 imageCache = null; 454 } 455 FontManager.instance = null; 456 static if (ENABLE_OPENGL) { 457 import dlangui.graphics.gldrawbuf; 458 destroyGLCaches(); 459 } 460 461 debug { 462 if (DrawBuf.instanceCount > 0) { 463 Log.e("Non-zero DrawBuf instance count when exiting: ", DrawBuf.instanceCount); 464 } 465 if (Style.instanceCount > 0) { 466 Log.e("Non-zero Style instance count when exiting: ", Style.instanceCount); 467 } 468 if (ImageDrawable.instanceCount > 0) { 469 Log.e("Non-zero ImageDrawable instance count when exiting: ", ImageDrawable.instanceCount); 470 } 471 if (Drawable.instanceCount > 0) { 472 Log.e("Non-zero Drawable instance count when exiting: ", Drawable.instanceCount); 473 } 474 static if (ENABLE_FREETYPE) { 475 import dlangui.graphics.ftfonts; 476 if (FreeTypeFontFile.instanceCount > 0) { 477 Log.e("Non-zero FreeTypeFontFile instance count when exiting: ", FreeTypeFontFile.instanceCount); 478 } 479 if (FreeTypeFont.instanceCount > 0) { 480 Log.e("Non-zero FreeTypeFont instance count when exiting: ", FreeTypeFont.instanceCount); 481 } 482 } 483 } 484 } 485 486 version(unittest) { 487 version (Windows) { 488 mixin APP_ENTRY_POINT; 489 490 /// entry point for dlangui based application 491 extern (C) int UIAppMain(string[] args) { 492 // just to enable running unit tests 493 import core.runtime; 494 import std.stdio; 495 if (!runModuleUnitTests()) { 496 writeln("Error occured in unit tests. Press enter."); 497 readln(); 498 return 1; 499 } 500 return 0; 501 } 502 } 503 } 504 505