|
@@ -2374,8 +2374,8 @@ ImFontConfig::ImFontConfig()
|
|
|
{
|
|
|
memset(this, 0, sizeof(*this));
|
|
|
FontDataOwnedByAtlas = true;
|
|
|
- OversampleH = 2;
|
|
|
- OversampleV = 1;
|
|
|
+ OversampleH = 0; // Auto == 1 or 2 depending on size
|
|
|
+ OversampleV = 0; // Auto == 1
|
|
|
GlyphMaxAdvanceX = FLT_MAX;
|
|
|
RasterizerMultiply = 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(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
|
|
|
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);
|
|
|
+ IM_ASSERT(font_cfg->RasterizerDensity > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
|
|
|
|
|
// Create new font
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
+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)
|
|
|
{
|
|
|
IM_ASSERT(atlas->ConfigData.Size > 0);
|
|
@@ -2985,15 +2991,19 @@ static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|
|
buf_rects_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];
|
|
|
+ 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.first_unicode_codepoint_in_range = 0;
|
|
|
src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data;
|
|
|
src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size;
|
|
|
src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars;
|
|
|
- src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH;
|
|
|
- src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV;
|
|
|
+ src_tmp.PackRange.h_oversample = (unsigned char)oversample_h;
|
|
|
+ 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)
|
|
|
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;
|
|
|
const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]);
|
|
|
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);
|
|
|
- src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + pack_padding + cfg.OversampleH - 1);
|
|
|
- src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + pack_padding + cfg.OversampleV - 1);
|
|
|
+ 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 + oversample_h - 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;
|
|
|
}
|
|
|
}
|