@@ -3457,11 +3457,10 @@ void ImFontAtlasBuildRenderBitmapFromString(ImFontAtlas* atlas, int x, int y, in
3457
3457
3458
3458
static void ImFontAtlasBuildUpdateBasicTexData (ImFontAtlas* atlas, bool add_and_draw)
3459
3459
{
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
-
3462
3460
// Pack and store identifier so we can refresh UV coordinates on texture resize.
3463
3461
// FIXME-NEWATLAS: User/custom rects where user code wants to store UV coordinates will need to do the same thing.
3464
3462
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);
3465
3464
3466
3465
if (add_and_draw)
3467
3466
builder->PackIdMouseCursors = ImFontAtlasPackAddRect (atlas, pack_size.x , pack_size.y );
@@ -3486,8 +3485,10 @@ static void ImFontAtlasBuildUpdateBasicTexData(ImFontAtlas* atlas, bool add_and_
3486
3485
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, ' .' );
3487
3486
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' );
3488
3487
}
3488
+ ImFontAtlasTextureBlockQueueUpload (atlas, atlas->TexData , r.x , r.y , r.w , r.h );
3489
3489
}
3490
- ImFontAtlasTextureBlockQueueUpload (atlas, atlas->TexData , r.x , r.y , r.w , r.h );
3490
+
3491
+ // Refresh UV coordinates
3491
3492
atlas->TexUvWhitePixel = ImVec2 ((r.x + 0 .5f ) * atlas->TexUvScale .x , (r.y + 0 .5f ) * atlas->TexUvScale .y );
3492
3493
}
3493
3494
@@ -3496,71 +3497,64 @@ static void ImFontAtlasBuildUpdateLinesTexData(ImFontAtlas* atlas, bool add_and_
3496
3497
if (atlas->Flags & ImFontAtlasFlags_NoBakedLines)
3497
3498
return ;
3498
3499
3499
- ImVec2i pack_size = ImVec2i (IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2 , IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1 );
3500
-
3501
3500
// Pack and store identifier so we can refresh UV coordinates on texture resize.
3501
+ ImTextureData* tex = atlas->TexData ;
3502
3502
ImFontAtlasBuilder* builder = atlas->Builder ;
3503
+ ImVec2i pack_size = ImVec2i (IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2 , IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1 );
3503
3504
if (add_and_draw)
3504
3505
builder->PackIdLinesTexData = ImFontAtlasPackAddRect (atlas, pack_size.x , pack_size.y );
3505
3506
if (builder->PackIdLinesTexData == ImFontAtlasRectId_Invalid)
3506
3507
return ;
3508
+
3507
3509
ImFontAtlasRect r;
3508
3510
atlas->GetCustomRect (builder->PackIdLinesTexData , &r);
3509
3511
3510
3512
// Register texture region for thick lines
3511
3513
// 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
3512
3514
// 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 ;
3514
3515
for (int n = 0 ; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1 ; n++) // +1 because of the zero-width row
3515
3516
{
3516
3517
// 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
3521
3523
3522
3524
// 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)
3525
3526
{
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 ;
3533
3530
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 ;
3536
3533
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 );
3546
3542
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;
3549
3545
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 );
3555
3548
}
3556
3549
3557
- // Calculate UVs for this line
3550
+ // Refresh UV coordinates
3558
3551
ImVec2 uv0 = ImVec2 ((float )(r.x + pad_left - 1 ), (float )(r.y + y)) * atlas->TexUvScale ;
3559
3552
ImVec2 uv1 = ImVec2 ((float )(r.x + pad_left + line_width + 1 ), (float )(r.y + y + 1 )) * atlas->TexUvScale ;
3560
3553
float half_v = (uv0.y + uv1.y ) * 0 .5f ; // Calculate a constant V in the middle of the row to avoid sampling artifacts
3561
3554
atlas->TexUvLines [n] = ImVec4 (uv0.x , half_v, uv1.x , half_v);
3562
3555
}
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 );
3564
3558
}
3565
3559
3566
3560
// -----------------------------------------------------------------------------------------------------------------------------
0 commit comments