Skip to content

Commit 9f66c24

Browse files
committed
WIP - Fonts: misc tidying up.
1 parent a741aa2 commit 9f66c24

File tree

1 file changed

+33
-39
lines changed

1 file changed

+33
-39
lines changed

imgui_draw.cpp

+33-39
Original file line numberDiff line numberDiff line change
@@ -3457,11 +3457,10 @@ void ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, in
34573457

34583458
static void ImFontAtlasBuildUpdateBasicTexData(ImFontAtlas* atlas, bool add_and_draw)
34593459
{
3460-
ImVec2i pack_size = (atlas->Flags & ImFontAtlasFlags_NoMouseCursors) ? ImVec2i(2, 2) : ImVec2i(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H);
3461-
34623460
// Pack and store identifier so we can refresh UV coordinates on texture resize.
34633461
// FIXME-NEWATLAS: User/custom rects where user code wants to store UV coordinates will need to do the same thing.
34643462
ImFontAtlasBuilder* builder = atlas->Builder;
3463+
ImVec2i pack_size = (atlas->Flags & ImFontAtlasFlags_NoMouseCursors) ? ImVec2i(2, 2) : ImVec2i(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H);
34653464

34663465
if (add_and_draw)
34673466
builder->PackIdMouseCursors = ImFontAtlasPackAddRect(atlas, pack_size.x, pack_size.y);
@@ -3486,8 +3485,10 @@ static void ImFontAtlasBuildUpdateBasicTexData(ImFontAtlas* atlas, bool add_and_
34863485
ImFontAtlasBuildRenderBitmapFromString(atlas, x_for_white, r.y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.');
34873486
ImFontAtlasBuildRenderBitmapFromString(atlas, x_for_black, r.y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X');
34883487
}
3488+
ImFontAtlasTextureBlockQueueUpload(atlas, atlas->TexData, r.x, r.y, r.w, r.h);
34893489
}
3490-
ImFontAtlasTextureBlockQueueUpload(atlas, atlas->TexData, r.x, r.y, r.w, r.h);
3490+
3491+
// Refresh UV coordinates
34913492
atlas->TexUvWhitePixel = ImVec2((r.x + 0.5f) * atlas->TexUvScale.x, (r.y + 0.5f) * atlas->TexUvScale.y);
34923493
}
34933494

@@ -3496,71 +3497,64 @@ static void ImFontAtlasBuildUpdateLinesTexData(ImFontAtlas* atlas, bool add_and_
34963497
if (atlas->Flags & ImFontAtlasFlags_NoBakedLines)
34973498
return;
34983499

3499-
ImVec2i pack_size = ImVec2i(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1);
3500-
35013500
// Pack and store identifier so we can refresh UV coordinates on texture resize.
3501+
ImTextureData* tex = atlas->TexData;
35023502
ImFontAtlasBuilder* builder = atlas->Builder;
3503+
ImVec2i pack_size = ImVec2i(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1);
35033504
if (add_and_draw)
35043505
builder->PackIdLinesTexData = ImFontAtlasPackAddRect(atlas, pack_size.x, pack_size.y);
35053506
if (builder->PackIdLinesTexData == ImFontAtlasRectId_Invalid)
35063507
return;
3508+
35073509
ImFontAtlasRect r;
35083510
atlas->GetCustomRect(builder->PackIdLinesTexData, &r);
35093511

35103512
// Register texture region for thick lines
35113513
// The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row
35123514
// This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them
3513-
ImTextureData* tex = atlas->TexData;
35143515
for (int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row
35153516
{
35163517
// Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle
3517-
int y = n;
3518-
int line_width = n;
3519-
int pad_left = (r.w - line_width) / 2;
3520-
int pad_right = r.w - (pad_left + line_width);
3518+
const int y = n;
3519+
const int line_width = n;
3520+
const int pad_left = (r.w - line_width) / 2;
3521+
const int pad_right = r.w - (pad_left + line_width);
3522+
IM_ASSERT(pad_left + line_width + pad_right == r.w && y < r.h); // Make sure we're inside the texture bounds before we start writing pixels
35213523

35223524
// Write each slice
3523-
IM_ASSERT(pad_left + line_width + pad_right == r.w && y < r.h); // Make sure we're inside the texture bounds before we start writing pixels
3524-
if (add_and_draw)
3525+
if (add_and_draw && tex->Format == ImTextureFormat_Alpha8)
35253526
{
3526-
switch (tex->Format)
3527-
{
3528-
case ImTextureFormat_Alpha8:
3529-
{
3530-
ImU8* write_ptr = (ImU8*)tex->GetPixelsAt(r.x, r.y + y);
3531-
for (int i = 0; i < pad_left; i++)
3532-
*(write_ptr + i) = 0x00;
3527+
ImU8* write_ptr = (ImU8*)tex->GetPixelsAt(r.x, r.y + y);
3528+
for (int i = 0; i < pad_left; i++)
3529+
*(write_ptr + i) = 0x00;
35333530

3534-
for (int i = 0; i < line_width; i++)
3535-
*(write_ptr + pad_left + i) = 0xFF;
3531+
for (int i = 0; i < line_width; i++)
3532+
*(write_ptr + pad_left + i) = 0xFF;
35363533

3537-
for (int i = 0; i < pad_right; i++)
3538-
*(write_ptr + pad_left + line_width + i) = 0x00;
3539-
break;
3540-
}
3541-
case ImTextureFormat_RGBA32:
3542-
{
3543-
ImU32* write_ptr = (ImU32*)(void*)tex->GetPixelsAt(r.x, r.y + y);
3544-
for (int i = 0; i < pad_left; i++)
3545-
*(write_ptr + i) = IM_COL32(255, 255, 255, 0);
3534+
for (int i = 0; i < pad_right; i++)
3535+
*(write_ptr + pad_left + line_width + i) = 0x00;
3536+
}
3537+
else if (add_and_draw && tex->Format == ImTextureFormat_RGBA32)
3538+
{
3539+
ImU32* write_ptr = (ImU32*)(void*)tex->GetPixelsAt(r.x, r.y + y);
3540+
for (int i = 0; i < pad_left; i++)
3541+
*(write_ptr + i) = IM_COL32(255, 255, 255, 0);
35463542

3547-
for (int i = 0; i < line_width; i++)
3548-
*(write_ptr + pad_left + i) = IM_COL32_WHITE;
3543+
for (int i = 0; i < line_width; i++)
3544+
*(write_ptr + pad_left + i) = IM_COL32_WHITE;
35493545

3550-
for (int i = 0; i < pad_right; i++)
3551-
*(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0);
3552-
break;
3553-
}
3554-
}
3546+
for (int i = 0; i < pad_right; i++)
3547+
*(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0);
35553548
}
35563549

3557-
// Calculate UVs for this line
3550+
// Refresh UV coordinates
35583551
ImVec2 uv0 = ImVec2((float)(r.x + pad_left - 1), (float)(r.y + y)) * atlas->TexUvScale;
35593552
ImVec2 uv1 = ImVec2((float)(r.x + pad_left + line_width + 1), (float)(r.y + y + 1)) * atlas->TexUvScale;
35603553
float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts
35613554
atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v);
35623555
}
3563-
ImFontAtlasTextureBlockQueueUpload(atlas, tex, r.x, r.y, r.w, r.h);
3556+
if (add_and_draw)
3557+
ImFontAtlasTextureBlockQueueUpload(atlas, tex, r.x, r.y, r.w, r.h);
35643558
}
35653559

35663560
//-----------------------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)