mirror of
https://github.com/ocornut/imgui.git
synced 2025-11-10 12:35:25 +00:00
Fonts: use TexGlyphPadding. Fixed packing issues. Removed old code.
This commit is contained in:
@@ -3582,7 +3582,6 @@ void ImFontAtlasBuildRepackTexture(ImFontAtlas* atlas, int w, int h)
|
|||||||
|
|
||||||
// FIXME-NEWATLAS-TESTS: Test calling RepackTexture with size too small to fits existing rects.
|
// FIXME-NEWATLAS-TESTS: Test calling RepackTexture with size too small to fits existing rects.
|
||||||
|
|
||||||
#if 1
|
|
||||||
// Repack + copy pixels
|
// Repack + copy pixels
|
||||||
// FIXME-NEWATLAS-V2: Repacking in batch would be beneficial to packing heuristic.
|
// FIXME-NEWATLAS-V2: Repacking in batch would be beneficial to packing heuristic.
|
||||||
ImFontAtlasPackInit(atlas);
|
ImFontAtlasPackInit(atlas);
|
||||||
@@ -3623,27 +3622,6 @@ void ImFontAtlasBuildRepackTexture(ImFontAtlas* atlas, int w, int h)
|
|||||||
ImFontAtlasBuildUpdateLinesTexData(atlas, false);
|
ImFontAtlasBuildUpdateLinesTexData(atlas, false);
|
||||||
ImFontAtlasBuildUpdateBasicTexData(atlas, false);
|
ImFontAtlasBuildUpdateBasicTexData(atlas, false);
|
||||||
|
|
||||||
#else
|
|
||||||
// Copy previous pixels
|
|
||||||
ImFontAtlasTextureCopyBlock(atlas, old_tex, 0, 0, new_tex, 0, 0, ImMin(old_tex->Width, new_tex->Width), ImMin(old_tex->Height, new_tex->Height));
|
|
||||||
|
|
||||||
// Scale UV coordinates
|
|
||||||
// FIXME-NEWATLAS: Probably lossy?
|
|
||||||
ImVec2 uv_scale((float)old_tex->Width / new_tex->Width, (float)old_tex->Height / new_tex->Height);
|
|
||||||
for (ImFont* font : atlas->Fonts)
|
|
||||||
for (ImFontGlyph& glyph : font->Glyphs)
|
|
||||||
{
|
|
||||||
glyph.U0 *= uv_scale.x;
|
|
||||||
glyph.U1 *= uv_scale.x;
|
|
||||||
glyph.V0 *= uv_scale.y;
|
|
||||||
glyph.V1 *= uv_scale.y;
|
|
||||||
}
|
|
||||||
ImVec4 uv_scale4(uv_scale.x, uv_scale.y, uv_scale.x, uv_scale.y);
|
|
||||||
atlas->TexUvWhitePixel *= uv_scale;
|
|
||||||
for (ImVec4& uv : atlas->TexUvLines)
|
|
||||||
uv = uv * uv_scale4;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
builder->LockDisableResize = false;
|
builder->LockDisableResize = false;
|
||||||
ImFontAtlasUpdateDrawListsSharedData(atlas);
|
ImFontAtlasUpdateDrawListsSharedData(atlas);
|
||||||
}
|
}
|
||||||
@@ -3666,8 +3644,9 @@ void ImFontAtlasBuildGrowTexture(ImFontAtlas* atlas, int old_tex_w, int old_tex_
|
|||||||
int new_tex_h = (old_tex_h < old_tex_w) ? old_tex_h * 2 : old_tex_h;
|
int new_tex_h = (old_tex_h < old_tex_w) ? old_tex_h * 2 : old_tex_h;
|
||||||
|
|
||||||
// Handle minimum size first (for pathologically large packed rects)
|
// Handle minimum size first (for pathologically large packed rects)
|
||||||
new_tex_w = ImMax(new_tex_w, ImUpperPowerOfTwo(builder->MaxRectSize.x + builder->PackPadding));
|
const int pack_padding = atlas->TexGlyphPadding;
|
||||||
new_tex_h = ImMax(new_tex_h, ImUpperPowerOfTwo(builder->MaxRectSize.y + builder->PackPadding));
|
new_tex_w = ImMax(new_tex_w, ImUpperPowerOfTwo(builder->MaxRectSize.x + pack_padding));
|
||||||
|
new_tex_h = ImMax(new_tex_h, ImUpperPowerOfTwo(builder->MaxRectSize.y + pack_padding));
|
||||||
|
|
||||||
ImFontAtlasBuildRepackTexture(atlas, new_tex_w, new_tex_h);
|
ImFontAtlasBuildRepackTexture(atlas, new_tex_w, new_tex_h);
|
||||||
}
|
}
|
||||||
@@ -3717,10 +3696,7 @@ void ImFontAtlasBuildInit(ImFontAtlas* atlas)
|
|||||||
|
|
||||||
const bool builder_is_new = (builder == NULL);
|
const bool builder_is_new = (builder == NULL);
|
||||||
if (builder_is_new)
|
if (builder_is_new)
|
||||||
{
|
|
||||||
builder = atlas->Builder = IM_NEW(ImFontAtlasBuilder)();
|
builder = atlas->Builder = IM_NEW(ImFontAtlasBuilder)();
|
||||||
builder->PackPadding = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImFontAtlasPackInit(atlas);
|
ImFontAtlasPackInit(atlas);
|
||||||
|
|
||||||
@@ -3762,11 +3738,12 @@ void ImFontAtlasPackInit(ImFontAtlas* atlas)
|
|||||||
|
|
||||||
// FIXME-NEWATLAS-V2: Expose other glyph padding settings for custom alteration (e.g. drop shadows). See #7962
|
// FIXME-NEWATLAS-V2: Expose other glyph padding settings for custom alteration (e.g. drop shadows). See #7962
|
||||||
// FIXME-NEWATLAS-V2: Experiment with number of nodes. 2024-11-05: Seems to be quite fine to reduce this.
|
// FIXME-NEWATLAS-V2: Experiment with number of nodes. 2024-11-05: Seems to be quite fine to reduce this.
|
||||||
int pack_node_count = tex->Width - builder->PackPadding;
|
//int pack_padding = atlas->TexGlyphPadding;
|
||||||
|
int pack_node_count = tex->Width;
|
||||||
//pack_node_count *= atlas->_PackNodesFactor;
|
//pack_node_count *= atlas->_PackNodesFactor;
|
||||||
builder->PackNodes.resize(pack_node_count);
|
builder->PackNodes.resize(pack_node_count);
|
||||||
IM_STATIC_ASSERT(sizeof(stbrp_context) <= sizeof(stbrp_context_opaque));
|
IM_STATIC_ASSERT(sizeof(stbrp_context) <= sizeof(stbrp_context_opaque));
|
||||||
stbrp_init_target((stbrp_context*)(void*)&builder->PackContext, tex->Width - builder->PackPadding, tex->Height - builder->PackPadding, builder->PackNodes.Data, builder->PackNodes.Size);
|
stbrp_init_target((stbrp_context*)(void*)&builder->PackContext, tex->Width, tex->Height, builder->PackNodes.Data, builder->PackNodes.Size);
|
||||||
atlas->_PackedSurface = atlas->_PackedRects = 0;
|
atlas->_PackedSurface = atlas->_PackedRects = 0;
|
||||||
builder->MaxRectSize = ImVec2i(0, 0);
|
builder->MaxRectSize = ImVec2i(0, 0);
|
||||||
builder->MaxRectBounds = ImVec2i(0, 0);
|
builder->MaxRectBounds = ImVec2i(0, 0);
|
||||||
@@ -3779,6 +3756,7 @@ ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h)
|
|||||||
IM_ASSERT(h > 0 && h <= 0xFFFF);
|
IM_ASSERT(h > 0 && h <= 0xFFFF);
|
||||||
|
|
||||||
ImFontAtlasBuilder* builder = (ImFontAtlasBuilder*)atlas->Builder;
|
ImFontAtlasBuilder* builder = (ImFontAtlasBuilder*)atlas->Builder;
|
||||||
|
const int pack_padding = atlas->TexGlyphPadding;
|
||||||
builder->MaxRectSize.x = ImMax(builder->MaxRectSize.x, w);
|
builder->MaxRectSize.x = ImMax(builder->MaxRectSize.x, w);
|
||||||
builder->MaxRectSize.y = ImMax(builder->MaxRectSize.y, h);
|
builder->MaxRectSize.y = ImMax(builder->MaxRectSize.y, h);
|
||||||
|
|
||||||
@@ -3788,11 +3766,11 @@ ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h)
|
|||||||
{
|
{
|
||||||
// Try packing
|
// Try packing
|
||||||
stbrp_rect pack_r = {};
|
stbrp_rect pack_r = {};
|
||||||
pack_r.w = r.w + builder->PackPadding;
|
pack_r.w = w + pack_padding;
|
||||||
pack_r.h = r.h + builder->PackPadding;
|
pack_r.h = h + pack_padding;
|
||||||
stbrp_pack_rects((stbrp_context*)(void*)&builder->PackContext, &pack_r, 1);
|
stbrp_pack_rects((stbrp_context*)(void*)&builder->PackContext, &pack_r, 1);
|
||||||
r.x = (unsigned short)(pack_r.x + builder->PackPadding);
|
r.x = (unsigned short)pack_r.x;
|
||||||
r.y = (unsigned short)(pack_r.y + builder->PackPadding);
|
r.y = (unsigned short)pack_r.y;
|
||||||
if (pack_r.was_packed)
|
if (pack_r.was_packed)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -3809,9 +3787,9 @@ ImFontAtlasRectId ImFontAtlasPackAddRect(ImFontAtlas* atlas, int w, int h)
|
|||||||
ImFontAtlasBuildGrowTexture(atlas);
|
ImFontAtlasBuildGrowTexture(atlas);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder->MaxRectBounds.x = ImMax(builder->MaxRectBounds.x, r.x + r.w);
|
builder->MaxRectBounds.x = ImMax(builder->MaxRectBounds.x, r.x + r.w + pack_padding);
|
||||||
builder->MaxRectBounds.y = ImMax(builder->MaxRectBounds.y, r.y + r.h);
|
builder->MaxRectBounds.y = ImMax(builder->MaxRectBounds.y, r.y + r.h + pack_padding);
|
||||||
atlas->_PackedSurface += w * h;
|
atlas->_PackedSurface += (w + pack_padding) * (h + pack_padding);
|
||||||
atlas->_PackedRects++;
|
atlas->_PackedRects++;
|
||||||
|
|
||||||
builder->Rects.push_back(r);
|
builder->Rects.push_back(r);
|
||||||
@@ -3986,7 +3964,6 @@ static bool ImGui_ImplStbTrueType_FontAddGlyph(ImFontAtlas* atlas, ImFont* font,
|
|||||||
if (glyph_index == 0)
|
if (glyph_index == 0)
|
||||||
return false; // Not found
|
return false; // Not found
|
||||||
|
|
||||||
// FIXME-NEWATLAS: Handling of atlas->TexGlyphPadding?
|
|
||||||
const float scale_for_layout = bd_font_data->ScaleForLayout; // ~ (font units to pixels)
|
const float scale_for_layout = bd_font_data->ScaleForLayout; // ~ (font units to pixels)
|
||||||
const float scale_for_raster_x = bd_font_data->ScaleForRasterX; // ~ (font units to pixels) * RasterizationDensity * OversampleH
|
const float scale_for_raster_x = bd_font_data->ScaleForRasterX; // ~ (font units to pixels) * RasterizationDensity * OversampleH
|
||||||
const float scale_for_raster_y = bd_font_data->ScaleForRasterY; // ~ (font units to pixels) * RasterizationDensity * OversampleV
|
const float scale_for_raster_y = bd_font_data->ScaleForRasterY; // ~ (font units to pixels) * RasterizationDensity * OversampleV
|
||||||
|
|||||||
@@ -3654,10 +3654,9 @@ struct ImFontAtlasBuilder
|
|||||||
{
|
{
|
||||||
stbrp_context_opaque PackContext; // Actually 'stbrp_context' but we don't want to define this in the header file.
|
stbrp_context_opaque PackContext; // Actually 'stbrp_context' but we don't want to define this in the header file.
|
||||||
ImVector<stbrp_node> PackNodes;
|
ImVector<stbrp_node> PackNodes;
|
||||||
int PackPadding; // Generally 1 to avoid bilinear filtering issues.
|
|
||||||
ImVector<ImFontAtlasRect> Rects;
|
ImVector<ImFontAtlasRect> Rects;
|
||||||
ImVector<unsigned char> TempBuffer; // Misc scratch buffer
|
ImVector<unsigned char> TempBuffer; // Misc scratch buffer
|
||||||
ImVec2i MaxRectSize; // Largest rectangle to pack (defacto used as a "minimum texture size")
|
ImVec2i MaxRectSize; // Largest rectangle to pack (de-facto used as a "minimum texture size")
|
||||||
ImVec2i MaxRectBounds; // Bottom-right most used pixels
|
ImVec2i MaxRectBounds; // Bottom-right most used pixels
|
||||||
bool LockDisableResize; // Disable resizing texture
|
bool LockDisableResize; // Disable resizing texture
|
||||||
bool PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.
|
bool PreloadedAllGlyphsRanges; // Set when missing ImGuiBackendFlags_RendererHasTextures features forces atlas to preload everything.
|
||||||
|
|||||||
Reference in New Issue
Block a user