mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Fixed ImFontConfig::GlyphExtraSpacing and ImFontConfig::PixelSnapH settings being pulled from the merged/target font settings when merging fonts, instead of being pulled from the source font settings.
This commit is contained in:
parent
76ddacd2a1
commit
5d87941451
@ -47,6 +47,9 @@ Other Changes:
|
|||||||
clipping, more than 16 KB characters are visible in the same low-level ImDrawList::RenderText
|
clipping, more than 16 KB characters are visible in the same low-level ImDrawList::RenderText
|
||||||
call. ImGui-level functions such as TextUnformatted() are not affected. This is quite rare
|
call. ImGui-level functions such as TextUnformatted() are not affected. This is quite rare
|
||||||
but it will be addressed later). (#3349)
|
but it will be addressed later). (#3349)
|
||||||
|
- Fonts: Fixed ImFontConfig::GlyphExtraSpacing and ImFontConfig::PixelSnapH settings being pulled
|
||||||
|
from the merged/target font settings when merging fonts, instead of being pulled from the source
|
||||||
|
font settings.
|
||||||
- ImDrawList: Thick anti-aliased strokes (> 1.0f) with integer thickness now use a texture-based
|
- ImDrawList: Thick anti-aliased strokes (> 1.0f) with integer thickness now use a texture-based
|
||||||
path, reducing the amount of vertices/indices and CPU/GPU usage. (#3245) [@Shironekoben]
|
path, reducing the amount of vertices/indices and CPU/GPU usage. (#3245) [@Shironekoben]
|
||||||
- This change will facilitate the wider use of thick borders in future style changes.
|
- This change will facilitate the wider use of thick borders in future style changes.
|
||||||
|
2
imgui.h
2
imgui.h
@ -2386,7 +2386,7 @@ struct ImFont
|
|||||||
IMGUI_API void BuildLookupTable();
|
IMGUI_API void BuildLookupTable();
|
||||||
IMGUI_API void ClearOutputData();
|
IMGUI_API void ClearOutputData();
|
||||||
IMGUI_API void GrowIndex(int new_size);
|
IMGUI_API void GrowIndex(int new_size);
|
||||||
IMGUI_API void AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
|
IMGUI_API void AddGlyph(ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
|
||||||
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
|
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
|
||||||
IMGUI_API void SetGlyphVisible(ImWchar c, bool visible);
|
IMGUI_API void SetGlyphVisible(ImWchar c, bool visible);
|
||||||
IMGUI_API void SetFallbackChar(ImWchar c);
|
IMGUI_API void SetFallbackChar(ImWchar c);
|
||||||
|
@ -2285,8 +2285,11 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|||||||
if (src_tmp.GlyphsCount == 0)
|
if (src_tmp.GlyphsCount == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// When merging fonts with MergeMode=true:
|
||||||
|
// - We can have multiple input fonts writing into a same destination font.
|
||||||
|
// - dst_font->ConfigData is != from cfg which is our source configuration.
|
||||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||||
ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true)
|
ImFont* dst_font = cfg.DstFont;
|
||||||
|
|
||||||
const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels);
|
const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels);
|
||||||
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
|
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
|
||||||
@ -2300,20 +2303,13 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|||||||
|
|
||||||
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
|
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
|
||||||
{
|
{
|
||||||
|
// Register glyph
|
||||||
const int codepoint = src_tmp.GlyphsList[glyph_i];
|
const int codepoint = src_tmp.GlyphsList[glyph_i];
|
||||||
const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i];
|
const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i];
|
||||||
|
|
||||||
const float char_advance_x_org = pc.xadvance;
|
|
||||||
const float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX);
|
|
||||||
float char_off_x = font_off_x;
|
|
||||||
if (char_advance_x_org != char_advance_x_mod)
|
|
||||||
char_off_x += cfg.PixelSnapH ? ImFloor((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
|
|
||||||
|
|
||||||
// Register glyph
|
|
||||||
stbtt_aligned_quad q;
|
stbtt_aligned_quad q;
|
||||||
float dummy_x = 0.0f, dummy_y = 0.0f;
|
float dummy_x = 0.0f, dummy_y = 0.0f;
|
||||||
stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &dummy_x, &dummy_y, &q, 0);
|
stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &dummy_x, &dummy_y, &q, 0);
|
||||||
dst_font->AddGlyph((ImWchar)codepoint, q.x0 + char_off_x, q.y0 + font_off_y, q.x1 + char_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, char_advance_x_mod);
|
dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2468,10 +2464,11 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
|
|||||||
if (r->Font == NULL || r->GlyphID == 0)
|
if (r->Font == NULL || r->GlyphID == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH
|
||||||
IM_ASSERT(r->Font->ContainerAtlas == atlas);
|
IM_ASSERT(r->Font->ContainerAtlas == atlas);
|
||||||
ImVec2 uv0, uv1;
|
ImVec2 uv0, uv1;
|
||||||
atlas->CalcCustomRectUV(r, &uv0, &uv1);
|
atlas->CalcCustomRectUV(r, &uv0, &uv1);
|
||||||
r->Font->AddGlyph((ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX);
|
r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build all fonts lookup tables
|
// Build all fonts lookup tables
|
||||||
@ -2881,8 +2878,29 @@ void ImFont::GrowIndex(int new_size)
|
|||||||
|
|
||||||
// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero.
|
// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero.
|
||||||
// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis).
|
// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis).
|
||||||
void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x)
|
// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font.
|
||||||
|
void ImFont::AddGlyph(ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x)
|
||||||
{
|
{
|
||||||
|
if (cfg != NULL)
|
||||||
|
{
|
||||||
|
// Clamp & recenter if needed
|
||||||
|
const float advance_x_original = advance_x;
|
||||||
|
advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX);
|
||||||
|
if (advance_x != advance_x_original)
|
||||||
|
{
|
||||||
|
float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f;
|
||||||
|
x0 += char_off_x;
|
||||||
|
x1 += char_off_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Snap to pixel
|
||||||
|
if (cfg->PixelSnapH)
|
||||||
|
advance_x = IM_ROUND(advance_x);
|
||||||
|
|
||||||
|
// Bake spacing
|
||||||
|
advance_x += cfg->GlyphExtraSpacing.x;
|
||||||
|
}
|
||||||
|
|
||||||
Glyphs.resize(Glyphs.Size + 1);
|
Glyphs.resize(Glyphs.Size + 1);
|
||||||
ImFontGlyph& glyph = Glyphs.back();
|
ImFontGlyph& glyph = Glyphs.back();
|
||||||
glyph.Codepoint = (unsigned int)codepoint;
|
glyph.Codepoint = (unsigned int)codepoint;
|
||||||
@ -2895,14 +2913,13 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1,
|
|||||||
glyph.V0 = v0;
|
glyph.V0 = v0;
|
||||||
glyph.U1 = u1;
|
glyph.U1 = u1;
|
||||||
glyph.V1 = v1;
|
glyph.V1 = v1;
|
||||||
glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x; // Bake spacing into AdvanceX
|
glyph.AdvanceX = advance_x;
|
||||||
|
|
||||||
if (ConfigData->PixelSnapH)
|
|
||||||
glyph.AdvanceX = IM_ROUND(glyph.AdvanceX);
|
|
||||||
|
|
||||||
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
|
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
|
||||||
|
// We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling.
|
||||||
|
float pad = ContainerAtlas->TexGlyphPadding + 0.99f;
|
||||||
DirtyLookupTables = true;
|
DirtyLookupTables = true;
|
||||||
MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + 1.99f);
|
MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + pad) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
|
void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
|
||||||
|
@ -544,8 +544,11 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns
|
|||||||
if (src_tmp.GlyphsCount == 0)
|
if (src_tmp.GlyphsCount == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// When merging fonts with MergeMode=true:
|
||||||
|
// - We can have multiple input fonts writing into a same destination font.
|
||||||
|
// - dst_font->ConfigData is != from cfg which is our source configuration.
|
||||||
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
ImFontConfig& cfg = atlas->ConfigData[src_i];
|
||||||
ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true)
|
ImFont* dst_font = cfg.DstFont;
|
||||||
|
|
||||||
const float ascent = src_tmp.Font.Info.Ascender;
|
const float ascent = src_tmp.Font.Info.Ascender;
|
||||||
const float descent = src_tmp.Font.Info.Descender;
|
const float descent = src_tmp.Font.Info.Descender;
|
||||||
@ -576,14 +579,8 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns
|
|||||||
for (int y = info.Height; y > 0; y--, blit_dst += blit_dst_stride, blit_src += blit_src_stride)
|
for (int y = info.Height; y > 0; y--, blit_dst += blit_dst_stride, blit_src += blit_src_stride)
|
||||||
memcpy(blit_dst, blit_src, blit_src_stride);
|
memcpy(blit_dst, blit_src, blit_src_stride);
|
||||||
|
|
||||||
float char_advance_x_org = info.AdvanceX;
|
|
||||||
float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX);
|
|
||||||
float char_off_x = font_off_x;
|
|
||||||
if (char_advance_x_org != char_advance_x_mod)
|
|
||||||
char_off_x += cfg.PixelSnapH ? IM_FLOOR((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
|
|
||||||
|
|
||||||
// Register glyph
|
// Register glyph
|
||||||
float x0 = info.OffsetX + char_off_x;
|
float x0 = info.OffsetX + font_off_x;
|
||||||
float y0 = info.OffsetY + font_off_y;
|
float y0 = info.OffsetY + font_off_y;
|
||||||
float x1 = x0 + info.Width;
|
float x1 = x0 + info.Width;
|
||||||
float y1 = y0 + info.Height;
|
float y1 = y0 + info.Height;
|
||||||
@ -591,7 +588,7 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns
|
|||||||
float v0 = (ty) / (float)atlas->TexHeight;
|
float v0 = (ty) / (float)atlas->TexHeight;
|
||||||
float u1 = (tx + info.Width) / (float)atlas->TexWidth;
|
float u1 = (tx + info.Width) / (float)atlas->TexWidth;
|
||||||
float v1 = (ty + info.Height) / (float)atlas->TexHeight;
|
float v1 = (ty + info.Height) / (float)atlas->TexHeight;
|
||||||
dst_font->AddGlyph((ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, char_advance_x_mod);
|
dst_font->AddGlyph(&cfg, (ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, info.AdvanceX);
|
||||||
}
|
}
|
||||||
|
|
||||||
src_tmp.Rects = NULL;
|
src_tmp.Rects = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user