Texture-based round corners: Minor tweaks

This commit is contained in:
omar 2019-11-27 11:45:32 +01:00 committed by ocornut
parent 65d04ae51e
commit 7defd2e965
2 changed files with 11 additions and 17 deletions

View File

@ -444,6 +444,7 @@ static void TestTextureBasedRender()
ImGui::Separator();
ImGui::Text("Style");
ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 3.0f, "%.0f");
ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 100.0f, "%.0f");
ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 100.0f, "%.0f");

View File

@ -1410,6 +1410,7 @@ void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float th
// flags should contains a mask indicating which corners should be drawn rounded
// Returns true if the rectangle was drawn, false for some reason it couldn't
// be (in which case the caller should try again with the regular path drawing API)
// We are using the textures generated by ImFontAtlasBuildRenderRoundCornersTexData()
inline bool AddRoundCornerRect(ImDrawList* draw_list, const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, ImDrawFlags flags, bool fill)
{
#if 1
@ -1685,13 +1686,8 @@ void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, fl
// Try to use fast path if we can
if (rounding > 0)
{
if (AddRoundCornerRect(this, p_min, p_max, col, rounding, flags, /* fill */ false))
{
// Fast path handled this
return;
}
}
if (Flags & ImDrawListFlags_AntiAliasedLines)
PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.50f, 0.50f), rounding, flags);
@ -1720,14 +1716,10 @@ void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 c
{
// Try fast path first
if (AddRoundCornerRect(this, p_min, p_max, col, rounding, flags, /* fill */ true))
{
return;
}
else
{
PathRect(p_min, p_max, rounding, flags);
PathFillConvex(col);
}
PathRect(p_min, p_max, rounding, flags);
PathFillConvex(col);
}
}
@ -1803,8 +1795,7 @@ inline bool AddRoundCornerCircle(ImDrawList* draw_list, const ImVec2& center, fl
IM_ASSERT(tex_id == draw_list->_TextureIdStack.back()); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font.
const int rad = (int)radius;
if ((rad < 1) || // Radius 0 will cause issues with the UV lookup below
(rad > data->Font->ContainerAtlas->RoundCornersMaxSize))
if (rad < 1 || rad > data->Font->ContainerAtlas->RoundCornersMaxSize) // Radius 0 will cause issues with the UV lookup below
return false; // We can't handle this
// Debug command to force this render path to only execute when shift is held
@ -1836,7 +1827,6 @@ inline bool AddRoundCornerCircle(ImDrawList* draw_list, const ImVec2& center, fl
// Some useful constants for our calculations
const float half_sqrt_two = 0.70710678f; // sqrtf(2.0f) * 0.5f
const float sqrt_two_minus_one = 0.41421356f; // sqrt(2.0f) - 1.0f
const float width_offset_parametric = line_width / rad; // Line width in our parametric coordinate space
const int num_verts = fill ? 9 : 16; // Number of vertices we are going to write
@ -3719,7 +3709,11 @@ static void ImFontAtlasBuildRegisterRoundCornersCustomRects(ImFontAtlas* atlas)
const int pad = FONT_ATLAS_ROUNDED_CORNER_TEX_PADDING;
const int max = atlas->RoundCornersMaxSize;
for (int n = 0; n < max; n++)
atlas->RoundCornersRectIds.push_back(atlas->AddCustomRectRegular(n + 1 + pad * 2, n + 1 + FONT_ATLAS_ROUNDED_CORNER_TEX_CENTER_PADDING + pad * 2));
{
const int width = n + 1 + pad * 2;
const int height = n + 1 + FONT_ATLAS_ROUNDED_CORNER_TEX_CENTER_PADDING + pad * 2;
atlas->RoundCornersRectIds.push_back(atlas->AddCustomRectRegular(width, height));
}
}
// Generate the actual pixel data for rounded corners in the atlas
@ -3772,7 +3766,6 @@ static void ImFontAtlasBuildRenderRoundCornersTexData(ImFontAtlas* atlas)
}
const float dist = ImSqrt((float)(cx*cx+cy*cy)) - (float)(radius - (filled ? 0 : stroke_width));
float alpha = 0.0f;
if (filled)
{