imgui_freetype: Documentation, tweaks. (#618)
parent
e9a617b22a
commit
7b005bd7de
4 changed files with 140 additions and 15 deletions
@ -0,0 +1,126 @@ |
|||||||
|
# imgui_freetype |
||||||
|
|
||||||
|
This is an attempt to replace stb_truetype (the default imgui's font rasterizer) with FreeType. |
||||||
|
Currently not optimal and probably has some limitations or bugs. |
||||||
|
By [Vuhdo](https://github.com/Vuhdo) (Aleksei Skriabin). Improvements by @mikesart. Maintained by @ocornut. |
||||||
|
|
||||||
|
**Usage** |
||||||
|
1. Get latest FreeType binaries or build yourself. |
||||||
|
2. Add imgui_freetype.h/cpp alongside your imgui sources. |
||||||
|
3. Include imgui_freetype.h after imgui.h. |
||||||
|
4. Call ImGuiFreeType::BuildFontAtlas() *BEFORE* calling ImFontAtlas::GetTexDataAsRGBA32() or ImFontAtlas::Build() (so normal Build() won't be called): |
||||||
|
|
||||||
|
```cpp |
||||||
|
// See ImGuiFreeType::RasterizationFlags |
||||||
|
unsigned int flags = ImGuiFreeType::DisableHinting; |
||||||
|
ImGuiFreeType::BuildFontAtlas(io.Fonts, flags); |
||||||
|
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); |
||||||
|
``` |
||||||
|
|
||||||
|
**Test code Usage** |
||||||
|
```cpp |
||||||
|
#include "misc/freetype/imgui_freetype.h" |
||||||
|
#include "misc/freetype/imgui_freetype.cpp" |
||||||
|
|
||||||
|
// Load various small fonts |
||||||
|
ImGuiIO& io = ImGui::GetIO(); |
||||||
|
io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 13.0f); |
||||||
|
io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 13.0f); |
||||||
|
io.Fonts->AddFontDefault(); |
||||||
|
|
||||||
|
FreeTypeTest freetype_test; |
||||||
|
|
||||||
|
// Main Loop |
||||||
|
while (true) |
||||||
|
{ |
||||||
|
if (freetype_test.UpdateRebuild()) |
||||||
|
{ |
||||||
|
// REUPLOAD FONT TEXTURE TO GPU |
||||||
|
// e.g ImGui_ImplGlfwGL3_InvalidateDeviceObjects() + ImGui_ImplGlfwGL3_CreateDeviceObjects() |
||||||
|
} |
||||||
|
ImGui::NewFrame(); |
||||||
|
freetype_test.ShowFreetypeOptionsWindow(); |
||||||
|
... |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
**Test code** |
||||||
|
```cpp |
||||||
|
#include "misc/freetype/imgui_freetype.h" |
||||||
|
#include "misc/freetype/imgui_freetype.cpp" |
||||||
|
|
||||||
|
struct FreeTypeTest |
||||||
|
{ |
||||||
|
enum FontBuildMode |
||||||
|
{ |
||||||
|
FontBuildMode_FreeType, |
||||||
|
FontBuildMode_Stb, |
||||||
|
}; |
||||||
|
|
||||||
|
FontBuildMode BuildMode; |
||||||
|
bool WantRebuild; |
||||||
|
float FontsMultiply; |
||||||
|
unsigned int FontsFlags; |
||||||
|
|
||||||
|
FreeTypeTest() |
||||||
|
{ |
||||||
|
BuildMode = FontBuildMode_FreeType; |
||||||
|
WantRebuild = true; |
||||||
|
FontsMultiply = 1.0f; |
||||||
|
FontsFlags = 0; |
||||||
|
} |
||||||
|
|
||||||
|
// Call _BEFORE_ NewFrame() |
||||||
|
bool UpdateRebuild() |
||||||
|
{ |
||||||
|
if (!WantRebuild) |
||||||
|
return false; |
||||||
|
ImGuiIO& io = ImGui::GetIO(); |
||||||
|
for (int n = 0; n < io.Fonts->Fonts.Size; n++) |
||||||
|
{ |
||||||
|
io.Fonts->Fonts[n]->ConfigData->RasterizerMultiply = FontsMultiply; |
||||||
|
io.Fonts->Fonts[n]->ConfigData->RasterizerFlags = (BuildMode == FontBuildMode_FreeType) ? FontsFlags : 0x00; |
||||||
|
} |
||||||
|
if (BuildMode == FontBuildMode_FreeType) |
||||||
|
ImGuiFreeType::BuildFontAtlas(io.Fonts, FontsFlags); |
||||||
|
else if (BuildMode == FontBuildMode_Stb) |
||||||
|
io.Fonts->Build(); |
||||||
|
WantRebuild = false; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
// Call to draw interface |
||||||
|
void ShowFreetypeOptionsWindow() |
||||||
|
{ |
||||||
|
ImGui::Begin("FreeType Options"); |
||||||
|
ImGui::ShowFontSelector("Fonts"); |
||||||
|
WantRebuild |= ImGui::RadioButton("FreeType", (int*)&BuildMode, FontBuildMode_FreeType); |
||||||
|
ImGui::SameLine(); |
||||||
|
WantRebuild |= ImGui::RadioButton("Stb (Default)", (int*)&BuildMode, FontBuildMode_Stb); |
||||||
|
WantRebuild |= ImGui::DragFloat("Multiply", &FontsMultiply, 0.001f, 0.0f, 2.0f); |
||||||
|
if (BuildMode == FontBuildMode_FreeType) |
||||||
|
{ |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("NoHinting", &FontsFlags, ImGuiFreeType::NoHinting); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("NoAutoHint", &FontsFlags, ImGuiFreeType::NoAutoHint); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("ForceAutoHint", &FontsFlags, ImGuiFreeType::ForceAutoHint); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("LightHinting", &FontsFlags, ImGuiFreeType::LightHinting); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("MonoHinting", &FontsFlags, ImGuiFreeType::MonoHinting); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("Bold", &FontsFlags, ImGuiFreeType::Bold); |
||||||
|
WantRebuild |= ImGui::CheckboxFlags("Oblique", &FontsFlags, ImGuiFreeType::Oblique); |
||||||
|
} |
||||||
|
ImGui::End(); |
||||||
|
} |
||||||
|
}; |
||||||
|
``` |
||||||
|
|
||||||
|
**Known issues** |
||||||
|
- Output texture has excessive resolution (lots of vertical waste) |
||||||
|
- FreeType's memory allocator is not overridden. |
||||||
|
|
||||||
|
**Obligatory comparison screenshots** |
||||||
|
|
||||||
|
Using Windows built-in segoeui.ttf font. Open in new browser tabs, view at 1080p+. |
||||||
|
|
||||||
|
 |
||||||
|
|
Loading…
Reference in New Issue