mirror of
https://github.com/ocornut/imgui.git
synced 2025-02-08 23:19:40 +01:00
Fonts: OversampleH/OversampleV value defaults to 0 for automatic selection.
This commit is contained in:
parent
4211fdc70b
commit
8a1613a382
@ -76,11 +76,15 @@ Other changes:
|
|||||||
styles as the current look is not right (but ImGuiCol_TabSelectedOverline stays the same).
|
styles as the current look is not right (but ImGuiCol_TabSelectedOverline stays the same).
|
||||||
- Debug Tools: Tweaked font preview.
|
- Debug Tools: Tweaked font preview.
|
||||||
- ImDrawList: texture baked storage for thick line reduced from ~64x64 to ~32x32. (#3245)
|
- ImDrawList: texture baked storage for thick line reduced from ~64x64 to ~32x32. (#3245)
|
||||||
- ImFontAtlas: made calling ClearFonts() call ClearInputData(), as calling
|
- Fonts: IndexLookup[] table hold 16-bit values even in ImWchar32 mode,
|
||||||
one without the other is never correct. (#8174, #6556, #6336, #4723)
|
|
||||||
- ImFont: IndexLookup[] table hold 16-bit values even in ImWchar32 mode,
|
|
||||||
as it accounts for number of glyphs in same font. This is favorable to
|
as it accounts for number of glyphs in same font. This is favorable to
|
||||||
CalcTextSize() calls touching less memory.
|
CalcTextSize() calls touching less memory.
|
||||||
|
- Fonts: OversampleH/OversampleV defaults to 0 for automatic selection.
|
||||||
|
- OversampleH == 0 --> use 1 or 2 depending on font size and use of PixelSnapH.
|
||||||
|
- OversampleV == 0 --> always use 1.
|
||||||
|
This also
|
||||||
|
- ImFontAtlas: made calling ClearFonts() call ClearInputData(), as calling
|
||||||
|
one without the other is never correct. (#8174, #6556, #6336, #4723)
|
||||||
- Examples: DirectX12: Reduced number of frame in flight from 3 to 2 in
|
- Examples: DirectX12: Reduced number of frame in flight from 3 to 2 in
|
||||||
provided example, to reduce latency.
|
provided example, to reduce latency.
|
||||||
- Examples: Vulkan: better handle VK_SUBOPTIMAL_KHR being returned by
|
- Examples: Vulkan: better handle VK_SUBOPTIMAL_KHR being returned by
|
||||||
|
@ -110,8 +110,6 @@ ImGui::PopFont();
|
|||||||
**For advanced options create a ImFontConfig structure and pass it to the AddFont() function (it will be copied internally):**
|
**For advanced options create a ImFontConfig structure and pass it to the AddFont() function (it will be copied internally):**
|
||||||
```cpp
|
```cpp
|
||||||
ImFontConfig config;
|
ImFontConfig config;
|
||||||
config.OversampleH = 2;
|
|
||||||
config.OversampleV = 1;
|
|
||||||
config.GlyphExtraSpacing.x = 1.0f;
|
config.GlyphExtraSpacing.x = 1.0f;
|
||||||
ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
|
ImFont* font = io.Fonts->AddFontFromFileTTF("font.ttf", size_pixels, &config);
|
||||||
```
|
```
|
||||||
|
10
imgui.cpp
10
imgui.cpp
@ -16184,9 +16184,13 @@ void ImGui::DebugNodeFont(ImFont* font)
|
|||||||
Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt);
|
Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt);
|
||||||
for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
|
for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
|
||||||
if (font->ConfigData)
|
if (font->ConfigData)
|
||||||
if (const ImFontConfig* cfg = &font->ConfigData[config_i])
|
{
|
||||||
BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
|
const ImFontConfig* cfg = &font->ConfigData[config_i];
|
||||||
config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y);
|
int oversample_h, oversample_v;
|
||||||
|
ImFontAtlasBuildGetOversampleFactors(cfg, &oversample_h, &oversample_v);
|
||||||
|
BulletText("Input %d: \'%s\', Oversample: (%d=>%d,%d=>%d), PixelSnapH: %d, Offset: (%.1f,%.1f)",
|
||||||
|
config_i, cfg->Name, cfg->OversampleH, oversample_h, cfg->OversampleV, oversample_v, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y);
|
||||||
|
}
|
||||||
|
|
||||||
// Display all glyphs of the fonts in separate pages of 256 characters
|
// Display all glyphs of the fonts in separate pages of 256 characters
|
||||||
{
|
{
|
||||||
|
4
imgui.h
4
imgui.h
@ -3254,8 +3254,8 @@ struct ImFontConfig
|
|||||||
bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
|
bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
|
||||||
bool PixelSnapH; // false // Align every glyph AdvanceX to pixel boundaries. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
|
bool PixelSnapH; // false // Align every glyph AdvanceX to pixel boundaries. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
|
||||||
int FontNo; // 0 // Index of font within TTF/OTF file
|
int FontNo; // 0 // Index of font within TTF/OTF file
|
||||||
int OversampleH; // 2 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal. You can reduce this to 1 for large glyphs save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
|
int OversampleH; // 0 (2) // Rasterize at higher quality for sub-pixel positioning. 0 == auto == 1 or 2 depending on size. Note the difference between 2 and 3 is minimal. You can reduce this to 1 for large glyphs save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
|
||||||
int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis.
|
int OversampleV; // 0 (1) // Rasterize at higher quality for sub-pixel positioning. 0 == auto == 1. This is not really useful as we don't use sub-pixel positions on the Y axis.
|
||||||
float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height).
|
float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height).
|
||||||
ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs when rendered: essentially add to glyph->AdvanceX. Only X axis is supported for now.
|
ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs when rendered: essentially add to glyph->AdvanceX. Only X axis is supported for now.
|
||||||
ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input.
|
ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input.
|
||||||
|
@ -2374,8 +2374,8 @@ ImFontConfig::ImFontConfig()
|
|||||||
{
|
{
|
||||||
memset(this, 0, sizeof(*this));
|
memset(this, 0, sizeof(*this));
|
||||||
FontDataOwnedByAtlas = true;
|
FontDataOwnedByAtlas = true;
|
||||||
OversampleH = 2;
|
OversampleH = 0; // Auto == 1 or 2 depending on size
|
||||||
OversampleV = 1;
|
OversampleV = 0; // Auto == 1
|
||||||
GlyphMaxAdvanceX = FLT_MAX;
|
GlyphMaxAdvanceX = FLT_MAX;
|
||||||
RasterizerMultiply = 1.0f;
|
RasterizerMultiply = 1.0f;
|
||||||
RasterizerDensity = 1.0f;
|
RasterizerDensity = 1.0f;
|
||||||
@ -2573,8 +2573,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
|
|||||||
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
|
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
|
||||||
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
|
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
|
||||||
IM_ASSERT(font_cfg->SizePixels > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
IM_ASSERT(font_cfg->SizePixels > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
||||||
IM_ASSERT(font_cfg->OversampleH > 0 && font_cfg->OversampleV > 0 && "Is ImFontConfig struct correctly initialized?");
|
IM_ASSERT(font_cfg->RasterizerDensity > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
||||||
IM_ASSERT(font_cfg->RasterizerDensity > 0.0f);
|
|
||||||
|
|
||||||
// Create new font
|
// Create new font
|
||||||
if (!font_cfg->MergeMode)
|
if (!font_cfg->MergeMode)
|
||||||
@ -2858,6 +2857,13 @@ static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector<int>*
|
|||||||
out->push_back((int)(((it - it_begin) << 5) + bit_n));
|
out->push_back((int)(((it - it_begin) << 5) + bit_n));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImFontAtlasBuildGetOversampleFactors(const ImFontConfig* cfg, int* out_oversample_h, int* out_oversample_v)
|
||||||
|
{
|
||||||
|
// Automatically disable horizontal oversampling over size 32
|
||||||
|
*out_oversample_h = (cfg->OversampleH != 0) ? cfg->OversampleH : (cfg->SizePixels * cfg->RasterizerDensity > 32.0f || cfg->PixelSnapH) ? 1 : 2;
|
||||||
|
*out_oversample_v = (cfg->OversampleV != 0) ? cfg->OversampleV : 1;
|
||||||
|
}
|
||||||
|
|
||||||
static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
||||||
{
|
{
|
||||||
IM_ASSERT(atlas->ConfigData.Size > 0);
|
IM_ASSERT(atlas->ConfigData.Size > 0);
|
||||||
@ -2985,15 +2991,19 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|||||||
buf_rects_out_n += src_tmp.GlyphsCount;
|
buf_rects_out_n += src_tmp.GlyphsCount;
|
||||||
buf_packedchars_out_n += src_tmp.GlyphsCount;
|
buf_packedchars_out_n += src_tmp.GlyphsCount;
|
||||||
|
|
||||||
// Convert our ranges in the format stb_truetype wants
|
// Automatic selection of oversampling parameters
|
||||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||||
|
int oversample_h, oversample_v;
|
||||||
|
ImFontAtlasBuildGetOversampleFactors(&cfg, &oversample_h, &oversample_v);
|
||||||
|
|
||||||
|
// Convert our ranges in the format stb_truetype wants
|
||||||
src_tmp.PackRange.font_size = cfg.SizePixels * cfg.RasterizerDensity;
|
src_tmp.PackRange.font_size = cfg.SizePixels * cfg.RasterizerDensity;
|
||||||
src_tmp.PackRange.first_unicode_codepoint_in_range = 0;
|
src_tmp.PackRange.first_unicode_codepoint_in_range = 0;
|
||||||
src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data;
|
src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data;
|
||||||
src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size;
|
src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size;
|
||||||
src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars;
|
src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars;
|
||||||
src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH;
|
src_tmp.PackRange.h_oversample = (unsigned char)oversample_h;
|
||||||
src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV;
|
src_tmp.PackRange.v_oversample = (unsigned char)oversample_v;
|
||||||
|
|
||||||
// Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects)
|
// Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects)
|
||||||
const float scale = (cfg.SizePixels > 0.0f) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels * cfg.RasterizerDensity) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels * cfg.RasterizerDensity);
|
const float scale = (cfg.SizePixels > 0.0f) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels * cfg.RasterizerDensity) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels * cfg.RasterizerDensity);
|
||||||
@ -3002,9 +3012,9 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|||||||
int x0, y0, x1, y1;
|
int x0, y0, x1, y1;
|
||||||
const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]);
|
const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]);
|
||||||
IM_ASSERT(glyph_index_in_font != 0);
|
IM_ASSERT(glyph_index_in_font != 0);
|
||||||
stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1);
|
stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * oversample_h, scale * oversample_v, 0, 0, &x0, &y0, &x1, &y1);
|
||||||
src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + pack_padding + cfg.OversampleH - 1);
|
src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + pack_padding + oversample_h - 1);
|
||||||
src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + pack_padding + cfg.OversampleV - 1);
|
src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + pack_padding + oversample_v - 1);
|
||||||
total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h;
|
total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3571,6 +3571,7 @@ IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas,
|
|||||||
IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
|
IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value);
|
||||||
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
|
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
|
||||||
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
|
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
|
||||||
|
IMGUI_API void ImFontAtlasBuildGetOversampleFactors(const ImFontConfig* cfg, int* out_oversample_h, int* out_oversample_v);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// [SECTION] Test Engine specific hooks (imgui_test_engine)
|
// [SECTION] Test Engine specific hooks (imgui_test_engine)
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
// - For correct results you need to be using sRGB and convert to linear space in the pixel shader output.
|
// - For correct results you need to be using sRGB and convert to linear space in the pixel shader output.
|
||||||
// - The default dear imgui styles will be impacted by this change (alpha values will need tweaking).
|
// - The default dear imgui styles will be impacted by this change (alpha values will need tweaking).
|
||||||
|
|
||||||
// FIXME: cfg.OversampleH, OversampleV are not supported (but perhaps not so necessary with this rasterizer).
|
// FIXME: cfg.OversampleH, OversampleV are not supported, but generally not necessary with this rasterizer because Hinting makes everything look better.
|
||||||
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#ifndef IMGUI_DISABLE
|
#ifndef IMGUI_DISABLE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user