From 25a492f3307f646a34cc4c159ab846e83003cff6 Mon Sep 17 00:00:00 2001 From: ocornut Date: Fri, 29 Mar 2024 19:09:55 +0900 Subject: [PATCH] ProgressBar: Fixed passing fraction==NaN from leading to a crash. (#7451) --- docs/CHANGELOG.txt | 1 + imgui_widgets.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 74a201a6a..bc5822f99 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -70,6 +70,7 @@ Other changes: frames would erroneously close the window. While it is technically a popup issue it would generally manifest when fast moving the mouse bottom to top in a sub-menu. (#7325, #7287, #7063) +- ProgressBar: Fixed passing fraction==NaN from leading to a crash. (#7451) - Style: Added ImGuiStyleVar_TabBorderSize, ImGuiStyleVar_TableAngledHeadersAngle for consistency. (#7411) [@cfillion] - DrawList: Added AddConcavePolyFilled(), PathFillConcave() concave filling. (#760) [@thedmd] diff --git a/imgui_widgets.cpp b/imgui_widgets.cpp index d83a080f5..f1ffbf0f5 100644 --- a/imgui_widgets.cpp +++ b/imgui_widgets.cpp @@ -1288,12 +1288,15 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over if (!ItemAdd(bb, 0)) return; - // Render + // Out of courtesy we accept a NaN fraction without crashing fraction = ImSaturate(fraction); + const float fraction_not_nan = (fraction == fraction) ? fraction : 0.0f; + + // Render RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); - const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); - RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); + const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction_not_nan), bb.Max.y); + RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction_not_nan, style.FrameRounding); // Default displaying the fraction as percentage string, but user can override it char overlay_buf[32];