mirror of
https://github.com/ocornut/imgui.git
synced 2026-11-06 06:25:54 +01:00
DrawList: minor render optimizations.
- Use inline array + AddPolyline/AddConvexPolyFilled for triangle and quad - do less computation for detecting small shape rendering - add IM_UNLIKELY for very unlikely branches
This commit is contained in:
parent
7ec1bc17fd
commit
b484a90846
128
imgui_draw.cpp
128
imgui_draw.cpp
@ -2500,7 +2500,7 @@ void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, fl
|
||||
|
||||
ImDrawFlags stroke_pos = _GetStrokePos(flags, ImDrawFlags_StrokeInside);
|
||||
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy)
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy) IM_UNLIKELY
|
||||
{
|
||||
if (Flags & ImDrawListFlags_AntiAliasedLines)
|
||||
PathRect(ImVec2(p_min.x + 0.50f, p_min.y + 0.50f), ImVec2(p_max.x - 0.50f, p_max.y - 0.50f), rounding, flags);
|
||||
@ -2532,7 +2532,7 @@ void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, fl
|
||||
|
||||
const float width = outer_max.x - outer_min.x;
|
||||
const float height = outer_max.y - outer_min.y;
|
||||
if (ImMin(width, height) < (thickness + _FringeScale) * 2.0f)
|
||||
if (ImMin(width, height) < (thickness + _FringeScale) * 2.0f) IM_UNLIKELY
|
||||
{
|
||||
// Rectangle has collapsed into filled rectangle.
|
||||
AddRectFilled(outer_min, outer_max, col, outer_rounding, flags);
|
||||
@ -2680,26 +2680,28 @@ void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 c
|
||||
if ((col & IM_COL32_A_MASK) == 0)
|
||||
return;
|
||||
|
||||
ImVec2 b_min = p_min;
|
||||
ImVec2 b_max = p_max;
|
||||
const float width = b_max.x - b_min.x;
|
||||
const float height = b_max.y - b_min.y;
|
||||
float width = p_max.x - p_min.x;
|
||||
float height = p_max.y - p_min.y;
|
||||
const float min_dim = ImMin(width, height);
|
||||
|
||||
const float inv_fringe_scale = 1.0f / _FringeScale;
|
||||
const float screen_width = width * inv_fringe_scale;
|
||||
const float screen_height = height * inv_fringe_scale;
|
||||
|
||||
if (ImMin(screen_width, screen_height) < 1.0f / 255.0f)
|
||||
// The rect is smaller than pixel in one dimension.
|
||||
if (min_dim < _FringeScale) IM_UNLIKELY
|
||||
{
|
||||
if (min_dim < (1.0f / 255.0f) * _FringeScale)
|
||||
return;
|
||||
if (width < _FringeScale)
|
||||
{
|
||||
col = ImAlphaMultiply(col, width / _FringeScale);
|
||||
width = _FringeScale;
|
||||
}
|
||||
if (height < _FringeScale)
|
||||
{
|
||||
col = ImAlphaMultiply(col, height / _FringeScale);
|
||||
height = _FringeScale;
|
||||
}
|
||||
const ImVec2 points[4] = { p_min, ImVec2(p_min.x + width, p_min.y), ImVec2(p_min.x + width, p_min.y + height), ImVec2(p_min.x, p_max.y + height) };
|
||||
AddConvexPolyFilled(points, 4, col, ImDrawFlags_MiterOnly);
|
||||
return;
|
||||
if (screen_width < 1.0f)
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_width);
|
||||
b_max.x = b_min.x + _FringeScale;
|
||||
}
|
||||
if (screen_height < 1.0f)
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_height);
|
||||
b_max.y = b_min.y + _FringeScale;
|
||||
}
|
||||
|
||||
if ((flags & ImDrawFlags_RoundCornersMask_) == 0)
|
||||
@ -2777,11 +2779,8 @@ void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, c
|
||||
|
||||
ImDrawFlags stroke_pos = g_LEGACY_STROKES ? ImDrawFlags_StrokeLegacy : _GetStrokePos(flags, ImDrawFlags_StrokeInside);
|
||||
flags = (flags & ~ImDrawFlags_StrokeMask_) | stroke_pos;
|
||||
PathLineTo(p1);
|
||||
PathLineTo(p2);
|
||||
PathLineTo(p3);
|
||||
PathLineTo(p4);
|
||||
PathStroke(col, thickness, flags | ImDrawFlags_Closed);
|
||||
const ImVec2 points[4] = { p1, p2, p3, p4 };
|
||||
AddPolyline(points, 4, col, thickness, flags | ImDrawFlags_Closed);
|
||||
}
|
||||
|
||||
void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col)
|
||||
@ -2789,11 +2788,8 @@ void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2&
|
||||
if ((col & IM_COL32_A_MASK) == 0)
|
||||
return;
|
||||
|
||||
PathLineTo(p1);
|
||||
PathLineTo(p2);
|
||||
PathLineTo(p3);
|
||||
PathLineTo(p4);
|
||||
PathFillConvex(col);
|
||||
const ImVec2 points[4] = { p1, p2, p3, p4 };
|
||||
AddConvexPolyFilled(points, 4, col);
|
||||
}
|
||||
|
||||
void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, ImDrawFlags flags)
|
||||
@ -2803,10 +2799,9 @@ void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p
|
||||
|
||||
ImDrawFlags stroke_pos = g_LEGACY_STROKES ? ImDrawFlags_StrokeLegacy : _GetStrokePos(flags, ImDrawFlags_StrokeInside);
|
||||
flags = (flags & ~ImDrawFlags_StrokeMask_) | stroke_pos;
|
||||
PathLineTo(p1);
|
||||
PathLineTo(p2);
|
||||
PathLineTo(p3);
|
||||
PathStroke(col, thickness, flags | ImDrawFlags_Closed);
|
||||
|
||||
const ImVec2 points[3] = { p1, p2, p3 };
|
||||
AddPolyline(points, 3, col, thickness, flags | ImDrawFlags_Closed);
|
||||
}
|
||||
|
||||
void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col)
|
||||
@ -2814,10 +2809,8 @@ void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImV
|
||||
if ((col & IM_COL32_A_MASK) == 0)
|
||||
return;
|
||||
|
||||
PathLineTo(p1);
|
||||
PathLineTo(p2);
|
||||
PathLineTo(p3);
|
||||
PathFillConvex(col);
|
||||
const ImVec2 points[3] = { p1, p2, p3 };
|
||||
AddConvexPolyFilled(points, 3, col);
|
||||
}
|
||||
|
||||
void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness, ImDrawFlags flags)
|
||||
@ -2826,7 +2819,7 @@ void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int nu
|
||||
return;
|
||||
|
||||
ImDrawFlags stroke_pos = _GetStrokePos(flags, ImDrawFlags_StrokeInside);
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy)
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy) IM_UNLIKELY
|
||||
{
|
||||
radius -= 0.5f;
|
||||
stroke_pos = ImDrawFlags_StrokeCenter;
|
||||
@ -2843,7 +2836,7 @@ void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int nu
|
||||
outer_radius = radius;
|
||||
else if (stroke_pos == ImDrawFlags_StrokeOutside)
|
||||
outer_radius = radius + thickness;
|
||||
if (outer_radius < (thickness + _FringeScale))
|
||||
if (outer_radius < (thickness + _FringeScale)) IM_UNLIKELY
|
||||
{
|
||||
// The circle has collapsed into a filled circle.
|
||||
AddCircleFilled(center, outer_radius, col, num_segments);
|
||||
@ -2875,12 +2868,12 @@ void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col,
|
||||
if ((col & IM_COL32_A_MASK) == 0)
|
||||
return;
|
||||
|
||||
float screen_diameter = radius * 2.0f / _FringeScale;
|
||||
if (screen_diameter < 1.0f / 255.0f)
|
||||
return;
|
||||
if (screen_diameter < 1.0f)
|
||||
const float diameter = radius * 2.0f;
|
||||
if (diameter < _FringeScale) IM_UNLIKELY
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_diameter);
|
||||
if (diameter < (1.0f / 255.0f) * _FringeScale)
|
||||
return;
|
||||
col = ImAlphaMultiply(col, diameter / _FringeScale);
|
||||
radius = _FringeScale * 0.5f;
|
||||
}
|
||||
|
||||
@ -2910,7 +2903,7 @@ void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_
|
||||
return;
|
||||
|
||||
ImDrawFlags stroke_pos = _GetStrokePos(flags, ImDrawFlags_StrokeInside);
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy)
|
||||
if (g_LEGACY_STROKES || stroke_pos == ImDrawFlags_StrokeLegacy) IM_UNLIKELY
|
||||
{
|
||||
radius -= 0.5f;
|
||||
stroke_pos = ImDrawFlags_StrokeCenter;
|
||||
@ -2930,7 +2923,7 @@ void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_
|
||||
outer_radius = radius;
|
||||
else if (stroke_pos == ImDrawFlags_StrokeOutside)
|
||||
outer_radius = radius + miter_thickness;
|
||||
if (outer_radius < (miter_thickness + _FringeScale))
|
||||
if (outer_radius < (miter_thickness + _FringeScale)) IM_UNLIKELY
|
||||
{
|
||||
// The polygon has collapsed into a filled polygon.
|
||||
AddNgonFilled(center, outer_radius, col, num_segments);
|
||||
@ -2949,12 +2942,12 @@ void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, in
|
||||
if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2)
|
||||
return;
|
||||
|
||||
float screen_diameter = radius * 2.0f / _FringeScale;
|
||||
if (screen_diameter < 1.0f / 255.0f)
|
||||
return;
|
||||
if (screen_diameter < 1.0f)
|
||||
const float diameter = radius * 2.0f;
|
||||
if (diameter < _FringeScale) IM_UNLIKELY
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_diameter);
|
||||
if (diameter < (1.0f / 255.0f) * _FringeScale)
|
||||
return;
|
||||
col = ImAlphaMultiply(col, diameter / _FringeScale);
|
||||
radius = _FringeScale * 0.5f;
|
||||
}
|
||||
|
||||
@ -2996,22 +2989,25 @@ void ImDrawList::AddEllipseFilled(const ImVec2& center, const ImVec2& radius, Im
|
||||
return;
|
||||
|
||||
ImVec2 rad = radius;
|
||||
float diameter_x = rad.x * 2.0f;
|
||||
float diameter_y = rad.y * 2.0f;
|
||||
const float min_dim = ImMin(diameter_x, diameter_y);
|
||||
|
||||
const float inv_fringe_scale = 1.0f / _FringeScale;
|
||||
float screen_diameter_x = rad.x * 2.0f * inv_fringe_scale;
|
||||
float screen_diameter_y = rad.y * 2.0f * inv_fringe_scale;
|
||||
if (screen_diameter_x < 1.0f / 255.0f || screen_diameter_y < 1.0f / 255.0f)
|
||||
return;
|
||||
|
||||
if (screen_diameter_x < 1.0f)
|
||||
// The ellipse is smaller than pixel in one dimension.
|
||||
if (min_dim < _FringeScale) IM_UNLIKELY
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_diameter_x);
|
||||
rad.x = _FringeScale * 0.5f;
|
||||
}
|
||||
if (screen_diameter_y < 1.0f)
|
||||
{
|
||||
col = ImAlphaMultiply(col, screen_diameter_y);
|
||||
rad.y = _FringeScale * 0.5f;
|
||||
if (min_dim < (1.0f / 255.0f) * _FringeScale)
|
||||
return;
|
||||
if (diameter_x < _FringeScale)
|
||||
{
|
||||
col = ImAlphaMultiply(col, diameter_x / _FringeScale);
|
||||
rad.x = _FringeScale * 0.5f;
|
||||
}
|
||||
if (diameter_y < _FringeScale)
|
||||
{
|
||||
col = ImAlphaMultiply(col, diameter_y / _FringeScale);
|
||||
rad.y = _FringeScale * 0.5f;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_segments <= 0)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user