1 /* 2 Copyright © 2020, Inochi2D Project 3 Distributed under the 2-Clause BSD License, see LICENSE file. 4 5 Authors: Luna Nielsen 6 */ 7 module creator.core.font; 8 import creator.core; 9 import bindbc.imgui; 10 import core.stdc.stdlib : malloc; 11 import core.stdc.string : memcpy; 12 import std.string; 13 import std.array; 14 15 private { 16 17 18 // ImFont* loadFont(ImFontAtlas* atlas, string name, ubyte[] data, uint size = 14, ImWchar* range = null, bool merge = false) { 19 20 // ubyte* c_data = cast(ubyte*)igMemAlloc(data.length); 21 // memcpy(c_data, data.ptr, data.length); 22 23 // if (range is null) { 24 // range = ImFontAtlas_GetGlyphRangesJapanese(atlas); 25 // } 26 // ImFontConfig* cfg = ImFontConfig_ImFontConfig(); 27 // cfg.MergeMode = merge; 28 29 // // Add name 30 // const char* c_name = cast(char*)igMemAlloc(name.length); 31 // memcpy(cast(void*)c_name, name.ptr, name.length); 32 // cfg.Name[0..name.length] = c_name[0..name.length]; 33 34 // // Load Font 35 // ImFont* font = ImFontAtlas_AddFontDefault(atlas, cfg); //ImFontAtlas_AddFontFromMemoryTTF(atlas, c_data, size, size, cfg, range); 36 37 // return font; 38 // } 39 } 40 41 private { 42 ImFontAtlas* atlas; 43 44 FontEntry[] families; 45 void _incInitFontList() { 46 string fontsPath = incGetAppFontsPath(); 47 // TODO: load fonts 48 } 49 50 void _incAddFontData(string name, ref ubyte[] data, float size = 14, const ImWchar* ranges = null, ImVec2 offset = ImVec2(0f, 0f)) { 51 auto cfg = ImFontConfig_ImFontConfig(); 52 cfg.FontDataOwnedByAtlas = false; 53 cfg.MergeMode = atlas.Fonts.empty() ? false : true; 54 cfg.GlyphOffset = offset; 55 56 char[40] nameDat; 57 nameDat[0..name.length] = name[0..name.length]; 58 cfg.Name = nameDat; 59 ImFontAtlas_AddFontFromMemoryTTF(atlas, cast(void*)data.ptr, cast(int)data.length, size, cfg, ranges); 60 } 61 62 ubyte[] KOSUGI_MARU = cast(ubyte[])import("KosugiMaru-Regular.ttf"); 63 ubyte[] ICONS = cast(ubyte[])import("MaterialIcons.ttf"); 64 } 65 66 /** 67 A font entry in the fonts list 68 */ 69 struct FontEntry { 70 /** 71 Family name of the font 72 */ 73 string name; 74 75 /** 76 Main language of the font 77 */ 78 string lang; 79 80 /** 81 The file of the font 82 */ 83 string file; 84 } 85 86 /** 87 Initializes fonts 88 */ 89 void incInitFonts() { 90 _incInitFontList(); 91 atlas = igGetIO().Fonts; 92 _incAddFontData("APP\0", KOSUGI_MARU, 28, ImFontAtlas_GetGlyphRangesJapanese(atlas)); 93 _incAddFontData("Icons\0", ICONS, 32, [cast(ImWchar)0xE000, cast(ImWchar)0xF23B].ptr, ImVec2(0, 4)); 94 ImFontAtlas_Build(atlas); 95 incSetUIScale(incGetUIScale()); 96 } 97 98 /** 99 Sets the UI scale for fonts 100 */ 101 void incSetUIScale(float scale) { 102 incSettingsSet("UIScale", scale); 103 igGetIO().FontGlobalScale = incGetUIScaleFont(); 104 } 105 106 /** 107 Get the UI scale in terms of font size 108 */ 109 float incGetUIScaleFont() { 110 return incGetUIScale()/2; 111 } 112 113 /** 114 Returns the UI Scale 115 */ 116 float incGetUIScale() { 117 return incSettingsGet!float("UIScale", 1.0); 118 } 119 120 /** 121 Gets the UI scale in text form 122 */ 123 string incGetUIScaleText() { 124 import std.format : format; 125 return "%s%%".format(cast(int)(incGetUIScale()*100)); 126 } 127 128 /** 129 Begins a section where text is double size 130 */ 131 void incFontsBeginLarge() { 132 igGetIO().FontGlobalScale = incGetUIScaleFont()*2; 133 } 134 135 /** 136 Ends a section where text is double size 137 */ 138 void incFontsEndLarge() { 139 igGetIO().FontGlobalScale = incGetUIScaleFont(); 140 } 141 142 /** 143 Returns a list of fonts 144 */ 145 FontEntry[] incFontsGet() { 146 return families; 147 } 148 149 // void incFontSet(string file) { 150 151 // }