mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Added ImFontAtlas::GlyphRangesBuilder helper + doc
This commit is contained in:
		@@ -24,6 +24,7 @@
 | 
				
			|||||||
   // Usage, e.g.
 | 
					   // Usage, e.g.
 | 
				
			||||||
   ImGui::Text("%s Search", ICON_FA_SEARCH);
 | 
					   ImGui::Text("%s Search", ICON_FA_SEARCH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---------------------------------
 | 
					---------------------------------
 | 
				
			||||||
 FONTS LOADING INSTRUCTIONS
 | 
					 FONTS LOADING INSTRUCTIONS
 | 
				
			||||||
---------------------------------
 | 
					---------------------------------
 | 
				
			||||||
@@ -84,11 +85,27 @@
 | 
				
			|||||||
   font->DisplayOffset.y += 1;   // Render 1 pixel down
 | 
					   font->DisplayOffset.y += 1;   // Render 1 pixel down
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					---------------------------------
 | 
				
			||||||
 | 
					 BUILDING CUSTOM GLYPH RANGES
 | 
				
			||||||
 | 
					---------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 You can use the ImFontAtlas::GlyphRangesBuilder helper to create glyph ranges based on text input.
 | 
				
			||||||
 | 
					 For exemple: for a game where your script is known, if you can feed your entire script to it and only build the characters the game needs. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ImVector<ImWchar> ranges;
 | 
				
			||||||
 | 
					   ImFontAtlas::GlyphRangesBuilder builder;
 | 
				
			||||||
 | 
					   builder.AddText("Hello world");                        // Add a string (here "Hello world" contains 7 unique characters)
 | 
				
			||||||
 | 
					   builder.AddChar(0x7262);                               // Add a specific character
 | 
				
			||||||
 | 
					   builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
 | 
				
			||||||
 | 
					   builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)
 | 
				
			||||||
 | 
					   io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---------------------------------
 | 
					---------------------------------
 | 
				
			||||||
 REMAPPING CODEPOINTS
 | 
					 REMAPPING CODEPOINTS
 | 
				
			||||||
---------------------------------
 | 
					---------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 All your strings needs to use UTF-8 encoding. Specifying literal in your source code using a local code page (such as CP-923 for Japanese CP-1251 for Cyrillic) will not work.
 | 
					 All your strings needs to use UTF-8 encoding. Specifying literal in your source code using a local code page (such as CP-923 for Japanese CP-1251 for Cyrillic) will NOT work!
 | 
				
			||||||
 In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
 | 
					 In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
 | 
				
			||||||
 You can also try to remap your local codepage characters to their Unicode codepoint using font->AddRemapChar(), but international users may have problems reading/editing your source code.
 | 
					 You can also try to remap your local codepage characters to their Unicode codepoint using font->AddRemapChar(), but international users may have problems reading/editing your source code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -169,6 +186,9 @@
 | 
				
			|||||||
 Inconsolata
 | 
					 Inconsolata
 | 
				
			||||||
   http://www.levien.com/type/myfonts/inconsolata.html
 | 
					   http://www.levien.com/type/myfonts/inconsolata.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Google Noto Fonts (worldwide languages)
 | 
				
			||||||
 | 
					   https://www.google.com/get/noto/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Adobe Source Code Pro: Monospaced font family for user interface and coding environments
 | 
					 Adobe Source Code Pro: Monospaced font family for user interface and coding environments
 | 
				
			||||||
   https://github.com/adobe-fonts/source-code-pro
 | 
					   https://github.com/adobe-fonts/source-code-pro
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -457,15 +457,25 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
 | 
					 Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
 | 
				
			||||||
 A: When loading a font, pass custom Unicode ranges to specify the glyphs to load. 
 | 
					 A: When loading a font, pass custom Unicode ranges to specify the glyphs to load. 
 | 
				
			||||||
    All your strings needs to use UTF-8 encoding. Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will not work.
 | 
					 | 
				
			||||||
    In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
 | 
					 | 
				
			||||||
    You can also try to remap your local codepage characters to their Unicode codepoint using font->AddRemapChar(), but international users may have problems reading/editing your source code.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());  // Load Japanese characters
 | 
					      // Add default Japanese ranges
 | 
				
			||||||
      io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
 | 
					      io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
 | 
				
			||||||
      io.ImeWindowHandle = MY_HWND;      // To input using Microsoft IME, give ImGui the hwnd of your application
 | 
					 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
    As for text input, depends on you passing the right character code to io.AddInputCharacter(). The example applications do that.
 | 
					      // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)
 | 
				
			||||||
 | 
					      ImVector<ImWchar> ranges;
 | 
				
			||||||
 | 
					      ImFontAtlas::GlyphRangesBuilder builder;
 | 
				
			||||||
 | 
					      builder.AddText("Hello world");                        // Add a string (here "Hello world" contains 7 unique characters)
 | 
				
			||||||
 | 
					      builder.AddChar(0x7262);                               // Add a specific character
 | 
				
			||||||
 | 
					      builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
 | 
				
			||||||
 | 
					      builder.BuildRanges(&ranges);                          // Build the final result (ordered ranges with all the unique characters submitted)
 | 
				
			||||||
 | 
					      io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8 by using the u8"hello" syntax. 
 | 
				
			||||||
 | 
					    Specifying literal in your source code using a local code page (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!
 | 
				
			||||||
 | 
					    Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Text input: it is up to your application to pass the right character code to io.AddInputCharacter(). The applications in examples/ are doing that.
 | 
				
			||||||
 | 
					    For languages using IME, on Windows you can copy the Hwnd of your application to io.ImeWindowHandle. The default implementation of io.ImeSetInputScreenPosFn() on Windows will set your IME position correctly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Q: How can I preserve my ImGui context across reloading a DLL? (loss of the global/static variables)
 | 
					 Q: How can I preserve my ImGui context across reloading a DLL? (loss of the global/static variables)
 | 
				
			||||||
 A: Create your own context 'ctx = CreateContext()' + 'SetCurrentContext(ctx)' and your own font atlas 'ctx->GetIO().Fonts = new ImFontAtlas()' so you don't rely on the default globals.
 | 
					 A: Create your own context 'ctx = CreateContext()' + 'SetCurrentContext(ctx)' and your own font atlas 'ctx->GetIO().Fonts = new ImFontAtlas()' so you don't rely on the default globals.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										15
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								imgui.h
									
									
									
									
									
								
							@@ -1350,7 +1350,7 @@ struct ImFontAtlas
 | 
				
			|||||||
    void                        SetTexID(ImTextureID id)  { TexID = id; }
 | 
					    void                        SetTexID(ImTextureID id)  { TexID = id; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
 | 
					    // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
 | 
				
			||||||
    // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create a UTF-8 string literally using the u8"Hello world" syntax. See FAQ for details.
 | 
					    // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
 | 
				
			||||||
    IMGUI_API const ImWchar*    GetGlyphRangesDefault();    // Basic Latin, Extended Latin
 | 
					    IMGUI_API const ImWchar*    GetGlyphRangesDefault();    // Basic Latin, Extended Latin
 | 
				
			||||||
    IMGUI_API const ImWchar*    GetGlyphRangesKorean();     // Default + Korean characters
 | 
					    IMGUI_API const ImWchar*    GetGlyphRangesKorean();     // Default + Korean characters
 | 
				
			||||||
    IMGUI_API const ImWchar*    GetGlyphRangesJapanese();   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
 | 
					    IMGUI_API const ImWchar*    GetGlyphRangesJapanese();   // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
 | 
				
			||||||
@@ -1358,6 +1358,19 @@ struct ImFontAtlas
 | 
				
			|||||||
    IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();   // Default + about 400 Cyrillic characters
 | 
					    IMGUI_API const ImWchar*    GetGlyphRangesCyrillic();   // Default + about 400 Cyrillic characters
 | 
				
			||||||
    IMGUI_API const ImWchar*    GetGlyphRangesThai();       // Default + Thai characters
 | 
					    IMGUI_API const ImWchar*    GetGlyphRangesThai();       // Default + Thai characters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Helpers to build glyph ranges from text data. Feed all your application strings/characters to it then call BuildRanges().
 | 
				
			||||||
 | 
					    struct GlyphRangesBuilder
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ImVector<unsigned char> UsedChars;  // Store 1-bit per Unicode code point (0=unused, 1=used)
 | 
				
			||||||
 | 
					        GlyphRangesBuilder()                { UsedChars.resize(0x10000 / 8); memset(UsedChars.Data, 0, 0x10000 / 8); }
 | 
				
			||||||
 | 
					        bool           GetBit(int n)        { return (UsedChars[n >> 3] & (1 << (n & 7))) != 0; }
 | 
				
			||||||
 | 
					        void           SetBit(int n)        { UsedChars[n >> 3] |= 1 << (n & 7); }  // Set bit 'c' in the array
 | 
				
			||||||
 | 
					        void           AddChar(ImWchar c)   { SetBit(c); }                          // Add character
 | 
				
			||||||
 | 
					        IMGUI_API void AddText(const char* text, const char* text_end = NULL);      // Add string (each character of the UTF-8 string are added)
 | 
				
			||||||
 | 
					        IMGUI_API void AddRanges(const ImWchar* ranges);                            // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault) to force add all of ASCII/Latin+Ext
 | 
				
			||||||
 | 
					        IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges);                  // Output new ranges
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Members
 | 
					    // Members
 | 
				
			||||||
    // (Access texture data via GetTexData*() calls which will setup a default font for you.)
 | 
					    // (Access texture data via GetTexData*() calls which will setup a default font for you.)
 | 
				
			||||||
    ImTextureID                 TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
 | 
					    ImTextureID                 TexID;              // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1694,6 +1694,44 @@ const ImWchar*  ImFontAtlas::GetGlyphRangesThai()
 | 
				
			|||||||
    return &ranges[0];
 | 
					    return &ranges[0];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// ImFontAtlas::GlyphRangesBuilder
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ImFontAtlas::GlyphRangesBuilder::AddText(const char* text, const char* text_end)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    while (text_end ? (text < text_end) : *text)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        unsigned int c = 0;
 | 
				
			||||||
 | 
					        int c_len = ImTextCharFromUtf8(&c, text, text_end);
 | 
				
			||||||
 | 
					        text += c_len;
 | 
				
			||||||
 | 
					        if (c_len == 0)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        if (c < 0x10000)
 | 
				
			||||||
 | 
					            AddChar((ImWchar)c);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ImFontAtlas::GlyphRangesBuilder::AddRanges(const ImWchar* ranges)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for (; ranges[0]; ranges += 2)
 | 
				
			||||||
 | 
					        for (ImWchar c = ranges[0]; c <= ranges[1]; c++)
 | 
				
			||||||
 | 
					            AddChar(c);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ImFontAtlas::GlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for (int n = 0; n < 0x10000; n++)
 | 
				
			||||||
 | 
					        if (GetBit(n))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            out_ranges->push_back((ImWchar)n);
 | 
				
			||||||
 | 
					            while (n < 0x10000 && GetBit(n + 1))
 | 
				
			||||||
 | 
					                n++;
 | 
				
			||||||
 | 
					            out_ranges->push_back((ImWchar)n);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    out_ranges->push_back(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//-----------------------------------------------------------------------------
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
// ImFont
 | 
					// ImFont
 | 
				
			||||||
//-----------------------------------------------------------------------------
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user