|
|
@@ -1,4 +1,4 @@
|
|
|
-// dear imgui, v1.71 WIP
|
|
|
+// dear imgui, v1.74 WIP
|
|
|
// (drawing and font code)
|
|
|
|
|
|
/*
|
|
|
@@ -72,13 +72,12 @@ Index of this file:
|
|
|
#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
|
|
|
#endif
|
|
|
#elif defined(__GNUC__)
|
|
|
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
|
|
|
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
|
|
|
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
|
|
|
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
|
|
|
#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer
|
|
|
-#if __GNUC__ >= 8
|
|
|
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
|
|
-#endif
|
|
|
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
|
|
|
#endif
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
@@ -263,7 +262,7 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst)
|
|
|
colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f);
|
|
|
colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f);
|
|
|
colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f);
|
|
|
- colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);
|
|
|
+ colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f);
|
|
|
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f);
|
|
|
colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f);
|
|
|
colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.16f);
|
|
|
@@ -321,7 +320,7 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
|
|
|
colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f);
|
|
|
colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
|
|
|
colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
|
|
|
- colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
|
|
|
+ colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f);
|
|
|
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f);
|
|
|
colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f);
|
|
|
colors[ImGuiCol_ResizeGrip] = ImVec4(0.80f, 0.80f, 0.80f, 0.56f);
|
|
|
@@ -371,7 +370,7 @@ void ImDrawList::Clear()
|
|
|
CmdBuffer.resize(0);
|
|
|
IdxBuffer.resize(0);
|
|
|
VtxBuffer.resize(0);
|
|
|
- Flags = _Data->InitialFlags;
|
|
|
+ Flags = _Data ? _Data->InitialFlags : ImDrawListFlags_None;
|
|
|
_VtxCurrentOffset = 0;
|
|
|
_VtxCurrentIdx = 0;
|
|
|
_VtxWritePtr = NULL;
|
|
|
@@ -398,7 +397,7 @@ void ImDrawList::ClearFreeMemory()
|
|
|
|
|
|
ImDrawList* ImDrawList::CloneOutput() const
|
|
|
{
|
|
|
- ImDrawList* dst = IM_NEW(ImDrawList(NULL));
|
|
|
+ ImDrawList* dst = IM_NEW(ImDrawList(_Data));
|
|
|
dst->CmdBuffer = CmdBuffer;
|
|
|
dst->IdxBuffer = IdxBuffer;
|
|
|
dst->VtxBuffer = VtxBuffer;
|
|
|
@@ -867,26 +866,26 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12)
|
|
|
+void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12)
|
|
|
{
|
|
|
if (radius == 0.0f || a_min_of_12 > a_max_of_12)
|
|
|
{
|
|
|
- _Path.push_back(centre);
|
|
|
+ _Path.push_back(center);
|
|
|
return;
|
|
|
}
|
|
|
_Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1));
|
|
|
for (int a = a_min_of_12; a <= a_max_of_12; a++)
|
|
|
{
|
|
|
const ImVec2& c = _Data->CircleVtx12[a % IM_ARRAYSIZE(_Data->CircleVtx12)];
|
|
|
- _Path.push_back(ImVec2(centre.x + c.x * radius, centre.y + c.y * radius));
|
|
|
+ _Path.push_back(ImVec2(center.x + c.x * radius, center.y + c.y * radius));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments)
|
|
|
+void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments)
|
|
|
{
|
|
|
if (radius == 0.0f)
|
|
|
{
|
|
|
- _Path.push_back(centre);
|
|
|
+ _Path.push_back(center);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -896,7 +895,7 @@ void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, floa
|
|
|
for (int i = 0; i <= num_segments; i++)
|
|
|
{
|
|
|
const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);
|
|
|
- _Path.push_back(ImVec2(centre.x + ImCos(a) * radius, centre.y + ImSin(a) * radius));
|
|
|
+ _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -950,7 +949,7 @@ void ImDrawList::PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImV
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int rounding_corners)
|
|
|
+void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawCornerFlags rounding_corners)
|
|
|
{
|
|
|
rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((rounding_corners & ImDrawCornerFlags_Top) == ImDrawCornerFlags_Top) || ((rounding_corners & ImDrawCornerFlags_Bot) == ImDrawCornerFlags_Bot) ? 0.5f : 1.0f ) - 1.0f);
|
|
|
rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((rounding_corners & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((rounding_corners & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f ) - 1.0f);
|
|
|
@@ -975,44 +974,46 @@ void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness)
|
|
|
+void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
- PathLineTo(a + ImVec2(0.5f,0.5f));
|
|
|
- PathLineTo(b + ImVec2(0.5f,0.5f));
|
|
|
+ PathLineTo(p1 + ImVec2(0.5f, 0.5f));
|
|
|
+ PathLineTo(p2 + ImVec2(0.5f, 0.5f));
|
|
|
PathStroke(col, false, thickness);
|
|
|
}
|
|
|
|
|
|
-// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly.
|
|
|
-void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags, float thickness)
|
|
|
+// p_min = upper-left, p_max = lower-right
|
|
|
+// Note we don't render 1 pixels sized rectangles properly.
|
|
|
+void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners, float thickness)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
if (Flags & ImDrawListFlags_AntiAliasedLines)
|
|
|
- PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.50f,0.50f), rounding, rounding_corners_flags);
|
|
|
+ PathRect(p_min + ImVec2(0.50f,0.50f), p_max - ImVec2(0.50f,0.50f), rounding, rounding_corners);
|
|
|
else
|
|
|
- PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.49f,0.49f), rounding, rounding_corners_flags); // Better looking lower-right corner and rounded non-AA shapes.
|
|
|
+ PathRect(p_min + ImVec2(0.50f,0.50f), p_max - ImVec2(0.49f,0.49f), rounding, rounding_corners); // Better looking lower-right corner and rounded non-AA shapes.
|
|
|
PathStroke(col, true, thickness);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags)
|
|
|
+void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
if (rounding > 0.0f)
|
|
|
{
|
|
|
- PathRect(a, b, rounding, rounding_corners_flags);
|
|
|
+ PathRect(p_min, p_max, rounding, rounding_corners);
|
|
|
PathFillConvex(col);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
PrimReserve(6, 4);
|
|
|
- PrimRect(a, b, col);
|
|
|
+ PrimRect(p_min, p_max, col);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left)
|
|
|
+// p_min = upper-left, p_max = lower-right
|
|
|
+void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left)
|
|
|
{
|
|
|
if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
@@ -1021,77 +1022,77 @@ void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32
|
|
|
PrimReserve(6, 4);
|
|
|
PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2));
|
|
|
PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+3));
|
|
|
- PrimWriteVtx(a, uv, col_upr_left);
|
|
|
- PrimWriteVtx(ImVec2(c.x, a.y), uv, col_upr_right);
|
|
|
- PrimWriteVtx(c, uv, col_bot_right);
|
|
|
- PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left);
|
|
|
+ PrimWriteVtx(p_min, uv, col_upr_left);
|
|
|
+ PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right);
|
|
|
+ PrimWriteVtx(p_max, uv, col_bot_right);
|
|
|
+ PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness)
|
|
|
+void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
|
|
|
- PathLineTo(a);
|
|
|
- PathLineTo(b);
|
|
|
- PathLineTo(c);
|
|
|
- PathLineTo(d);
|
|
|
+ PathLineTo(p1);
|
|
|
+ PathLineTo(p2);
|
|
|
+ PathLineTo(p3);
|
|
|
+ PathLineTo(p4);
|
|
|
PathStroke(col, true, thickness);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col)
|
|
|
+void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
|
|
|
- PathLineTo(a);
|
|
|
- PathLineTo(b);
|
|
|
- PathLineTo(c);
|
|
|
- PathLineTo(d);
|
|
|
+ PathLineTo(p1);
|
|
|
+ PathLineTo(p2);
|
|
|
+ PathLineTo(p3);
|
|
|
+ PathLineTo(p4);
|
|
|
PathFillConvex(col);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness)
|
|
|
+void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
|
|
|
- PathLineTo(a);
|
|
|
- PathLineTo(b);
|
|
|
- PathLineTo(c);
|
|
|
+ PathLineTo(p1);
|
|
|
+ PathLineTo(p2);
|
|
|
+ PathLineTo(p3);
|
|
|
PathStroke(col, true, thickness);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
|
|
|
+void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
|
|
|
- PathLineTo(a);
|
|
|
- PathLineTo(b);
|
|
|
- PathLineTo(c);
|
|
|
+ PathLineTo(p1);
|
|
|
+ PathLineTo(p2);
|
|
|
+ PathLineTo(p3);
|
|
|
PathFillConvex(col);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness)
|
|
|
+void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2)
|
|
|
return;
|
|
|
|
|
|
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
|
|
- const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
|
|
- PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments - 1);
|
|
|
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
|
|
|
+ PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1);
|
|
|
PathStroke(col, true, thickness);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)
|
|
|
+void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2)
|
|
|
return;
|
|
|
|
|
|
// Because we are filling a closed shape we remove 1 from the count of segments/points
|
|
|
- const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
|
|
|
- PathArcTo(centre, radius, 0.0f, a_max, num_segments - 1);
|
|
|
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
|
|
|
+ PathArcTo(center, radius, 0.0f, a_max, num_segments - 1);
|
|
|
PathFillConvex(col);
|
|
|
}
|
|
|
|
|
|
@@ -1139,7 +1140,7 @@ void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, c
|
|
|
AddText(NULL, 0.0f, pos, col, text_begin, text_end);
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col)
|
|
|
+void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
@@ -1149,13 +1150,13 @@ void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const Im
|
|
|
PushTextureID(user_texture_id);
|
|
|
|
|
|
PrimReserve(6, 4);
|
|
|
- PrimRectUV(a, b, uv_a, uv_b, col);
|
|
|
+ PrimRectUV(p_min, p_max, uv_min, uv_max, col);
|
|
|
|
|
|
if (push_texture_id)
|
|
|
PopTextureID();
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col)
|
|
|
+void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
@@ -1165,20 +1166,20 @@ void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, cons
|
|
|
PushTextureID(user_texture_id);
|
|
|
|
|
|
PrimReserve(6, 4);
|
|
|
- PrimQuadUV(a, b, c, d, uv_a, uv_b, uv_c, uv_d, col);
|
|
|
+ PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col);
|
|
|
|
|
|
if (push_texture_id)
|
|
|
PopTextureID();
|
|
|
}
|
|
|
|
|
|
-void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners)
|
|
|
+void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners)
|
|
|
{
|
|
|
if ((col & IM_COL32_A_MASK) == 0)
|
|
|
return;
|
|
|
|
|
|
if (rounding <= 0.0f || (rounding_corners & ImDrawCornerFlags_All) == 0)
|
|
|
{
|
|
|
- AddImage(user_texture_id, a, b, uv_a, uv_b, col);
|
|
|
+ AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -1187,10 +1188,10 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, c
|
|
|
PushTextureID(user_texture_id);
|
|
|
|
|
|
int vert_start_idx = VtxBuffer.Size;
|
|
|
- PathRect(a, b, rounding, rounding_corners);
|
|
|
+ PathRect(p_min, p_max, rounding, rounding_corners);
|
|
|
PathFillConvex(col);
|
|
|
int vert_end_idx = VtxBuffer.Size;
|
|
|
- ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, a, b, uv_a, uv_b, true);
|
|
|
+ ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true);
|
|
|
|
|
|
if (push_texture_id)
|
|
|
PopTextureID();
|
|
|
@@ -1207,10 +1208,10 @@ void ImDrawListSplitter::ClearFreeMemory()
|
|
|
{
|
|
|
for (int i = 0; i < _Channels.Size; i++)
|
|
|
{
|
|
|
- if (i == _Current)
|
|
|
+ if (i == _Current)
|
|
|
memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again
|
|
|
- _Channels[i].CmdBuffer.clear();
|
|
|
- _Channels[i].IdxBuffer.clear();
|
|
|
+ _Channels[i]._CmdBuffer.clear();
|
|
|
+ _Channels[i]._IdxBuffer.clear();
|
|
|
}
|
|
|
_Current = 0;
|
|
|
_Count = 1;
|
|
|
@@ -1237,22 +1238,22 @@ void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- _Channels[i].CmdBuffer.resize(0);
|
|
|
- _Channels[i].IdxBuffer.resize(0);
|
|
|
+ _Channels[i]._CmdBuffer.resize(0);
|
|
|
+ _Channels[i]._IdxBuffer.resize(0);
|
|
|
}
|
|
|
- if (_Channels[i].CmdBuffer.Size == 0)
|
|
|
+ if (_Channels[i]._CmdBuffer.Size == 0)
|
|
|
{
|
|
|
ImDrawCmd draw_cmd;
|
|
|
draw_cmd.ClipRect = draw_list->_ClipRectStack.back();
|
|
|
draw_cmd.TextureId = draw_list->_TextureIdStack.back();
|
|
|
- _Channels[i].CmdBuffer.push_back(draw_cmd);
|
|
|
+ _Channels[i]._CmdBuffer.push_back(draw_cmd);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static inline bool CanMergeDrawCommands(ImDrawCmd* a, ImDrawCmd* b)
|
|
|
{
|
|
|
- return memcmp(&a->ClipRect, &b->ClipRect, sizeof(a->ClipRect)) == 0 && a->TextureId == b->TextureId && !a->UserCallback && !b->UserCallback;
|
|
|
+ return memcmp(&a->ClipRect, &b->ClipRect, sizeof(a->ClipRect)) == 0 && a->TextureId == b->TextureId && a->VtxOffset == b->VtxOffset && !a->UserCallback && !b->UserCallback;
|
|
|
}
|
|
|
|
|
|
void ImDrawListSplitter::Merge(ImDrawList* draw_list)
|
|
|
@@ -1268,27 +1269,28 @@ void ImDrawListSplitter::Merge(ImDrawList* draw_list)
|
|
|
// Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command.
|
|
|
int new_cmd_buffer_count = 0;
|
|
|
int new_idx_buffer_count = 0;
|
|
|
- ImDrawCmd* last_cmd = (_Count > 0 && _Channels[0].CmdBuffer.Size > 0) ? &_Channels[0].CmdBuffer.back() : NULL;
|
|
|
+ ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL;
|
|
|
int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0;
|
|
|
for (int i = 1; i < _Count; i++)
|
|
|
{
|
|
|
ImDrawChannel& ch = _Channels[i];
|
|
|
- if (ch.CmdBuffer.Size && ch.CmdBuffer.back().ElemCount == 0)
|
|
|
- ch.CmdBuffer.pop_back();
|
|
|
- else if (ch.CmdBuffer.Size > 0 && last_cmd != NULL && CanMergeDrawCommands(last_cmd, &ch.CmdBuffer[0]))
|
|
|
+ if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0)
|
|
|
+ ch._CmdBuffer.pop_back();
|
|
|
+ if (ch._CmdBuffer.Size > 0 && last_cmd != NULL && CanMergeDrawCommands(last_cmd, &ch._CmdBuffer[0]))
|
|
|
{
|
|
|
// Merge previous channel last draw command with current channel first draw command if matching.
|
|
|
- last_cmd->ElemCount += ch.CmdBuffer[0].ElemCount;
|
|
|
- ch.CmdBuffer.erase(ch.CmdBuffer.Data);
|
|
|
+ last_cmd->ElemCount += ch._CmdBuffer[0].ElemCount;
|
|
|
+ idx_offset += ch._CmdBuffer[0].ElemCount;
|
|
|
+ ch._CmdBuffer.erase(ch._CmdBuffer.Data);
|
|
|
}
|
|
|
- if (ch.CmdBuffer.Size > 0)
|
|
|
- last_cmd = &ch.CmdBuffer.back();
|
|
|
- new_cmd_buffer_count += ch.CmdBuffer.Size;
|
|
|
- new_idx_buffer_count += ch.IdxBuffer.Size;
|
|
|
- for (int cmd_n = 0; cmd_n < ch.CmdBuffer.Size; cmd_n++)
|
|
|
+ if (ch._CmdBuffer.Size > 0)
|
|
|
+ last_cmd = &ch._CmdBuffer.back();
|
|
|
+ new_cmd_buffer_count += ch._CmdBuffer.Size;
|
|
|
+ new_idx_buffer_count += ch._IdxBuffer.Size;
|
|
|
+ for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++)
|
|
|
{
|
|
|
- ch.CmdBuffer.Data[cmd_n].IdxOffset = idx_offset;
|
|
|
- idx_offset += ch.CmdBuffer.Data[cmd_n].ElemCount;
|
|
|
+ ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset;
|
|
|
+ idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount;
|
|
|
}
|
|
|
}
|
|
|
draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count);
|
|
|
@@ -1300,25 +1302,26 @@ void ImDrawListSplitter::Merge(ImDrawList* draw_list)
|
|
|
for (int i = 1; i < _Count; i++)
|
|
|
{
|
|
|
ImDrawChannel& ch = _Channels[i];
|
|
|
- if (int sz = ch.CmdBuffer.Size) { memcpy(cmd_write, ch.CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }
|
|
|
- if (int sz = ch.IdxBuffer.Size) { memcpy(idx_write, ch.IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; }
|
|
|
+ if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }
|
|
|
+ if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; }
|
|
|
}
|
|
|
draw_list->_IdxWritePtr = idx_write;
|
|
|
draw_list->UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call.
|
|
|
+ draw_list->UpdateTextureID();
|
|
|
_Count = 1;
|
|
|
}
|
|
|
|
|
|
void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx)
|
|
|
{
|
|
|
- IM_ASSERT(idx < _Count);
|
|
|
- if (_Current == idx)
|
|
|
+ IM_ASSERT(idx >= 0 && idx < _Count);
|
|
|
+ if (_Current == idx)
|
|
|
return;
|
|
|
// Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap()
|
|
|
- memcpy(&_Channels.Data[_Current].CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer));
|
|
|
- memcpy(&_Channels.Data[_Current].IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer));
|
|
|
+ memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer));
|
|
|
+ memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer));
|
|
|
_Current = idx;
|
|
|
- memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx].CmdBuffer, sizeof(draw_list->CmdBuffer));
|
|
|
- memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx].IdxBuffer, sizeof(draw_list->IdxBuffer));
|
|
|
+ memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer));
|
|
|
+ memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer));
|
|
|
draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size;
|
|
|
}
|
|
|
|
|
|
@@ -1430,6 +1433,7 @@ ImFontConfig::ImFontConfig()
|
|
|
MergeMode = false;
|
|
|
RasterizerFlags = 0x00;
|
|
|
RasterizerMultiply = 1.0f;
|
|
|
+ EllipsisChar = (ImWchar)-1;
|
|
|
memset(Name, 0, sizeof(Name));
|
|
|
DstFont = NULL;
|
|
|
}
|
|
|
@@ -1439,7 +1443,7 @@ ImFontConfig::ImFontConfig()
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
// A work of art lies ahead! (. = white layer, X = black layer, others are blank)
|
|
|
-// The white texels on the top left are the ones we'll use everywhere in ImGui to render filled shapes.
|
|
|
+// The white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes.
|
|
|
const int FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF = 108;
|
|
|
const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27;
|
|
|
const unsigned int FONT_ATLAS_DEFAULT_TEX_DATA_ID = 0x80000000;
|
|
|
@@ -1622,6 +1626,9 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
|
|
|
memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);
|
|
|
}
|
|
|
|
|
|
+ if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1)
|
|
|
+ new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar;
|
|
|
+
|
|
|
// Invalidate texture
|
|
|
ClearTexData();
|
|
|
return new_font_cfg.DstFont;
|
|
|
@@ -1656,6 +1663,7 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)
|
|
|
font_cfg.SizePixels = 13.0f * 1.0f;
|
|
|
if (font_cfg.Name[0] == '\0')
|
|
|
ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels);
|
|
|
+ font_cfg.EllipsisChar = (ImWchar)0x0085;
|
|
|
|
|
|
const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();
|
|
|
const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault();
|
|
|
@@ -1726,7 +1734,7 @@ int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height)
|
|
|
IM_ASSERT(id >= 0x10000);
|
|
|
IM_ASSERT(width > 0 && width <= 0xFFFF);
|
|
|
IM_ASSERT(height > 0 && height <= 0xFFFF);
|
|
|
- CustomRect r;
|
|
|
+ ImFontAtlasCustomRect r;
|
|
|
r.ID = id;
|
|
|
r.Width = (unsigned short)width;
|
|
|
r.Height = (unsigned short)height;
|
|
|
@@ -1739,7 +1747,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int
|
|
|
IM_ASSERT(font != NULL);
|
|
|
IM_ASSERT(width > 0 && width <= 0xFFFF);
|
|
|
IM_ASSERT(height > 0 && height <= 0xFFFF);
|
|
|
- CustomRect r;
|
|
|
+ ImFontAtlasCustomRect r;
|
|
|
r.ID = id;
|
|
|
r.Width = (unsigned short)width;
|
|
|
r.Height = (unsigned short)height;
|
|
|
@@ -1750,7 +1758,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int
|
|
|
return CustomRects.Size - 1; // Return index
|
|
|
}
|
|
|
|
|
|
-void ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max)
|
|
|
+void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const
|
|
|
{
|
|
|
IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates
|
|
|
IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed
|
|
|
@@ -1766,7 +1774,7 @@ bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* ou
|
|
|
return false;
|
|
|
|
|
|
IM_ASSERT(CustomRectIds[0] != -1);
|
|
|
- ImFontAtlas::CustomRect& r = CustomRects[CustomRectIds[0]];
|
|
|
+ ImFontAtlasCustomRect& r = CustomRects[CustomRectIds[0]];
|
|
|
IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID);
|
|
|
ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r.X, (float)r.Y);
|
|
|
ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1];
|
|
|
@@ -2067,7 +2075,7 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|
|
const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1));
|
|
|
ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent);
|
|
|
const float font_off_x = cfg.GlyphOffset.x;
|
|
|
- const float font_off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f);
|
|
|
+ const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent);
|
|
|
|
|
|
for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
|
|
|
{
|
|
|
@@ -2078,7 +2086,7 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|
|
const float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX);
|
|
|
float char_off_x = font_off_x;
|
|
|
if (char_advance_x_org != char_advance_x_mod)
|
|
|
- char_off_x += cfg.PixelSnapH ? (float)(int)((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
|
|
|
+ char_off_x += cfg.PixelSnapH ? ImFloor((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
|
|
|
|
|
|
// Register glyph
|
|
|
stbtt_aligned_quad q;
|
|
|
@@ -2125,7 +2133,7 @@ void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opa
|
|
|
stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque;
|
|
|
IM_ASSERT(pack_context != NULL);
|
|
|
|
|
|
- ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects;
|
|
|
+ ImVector<ImFontAtlasCustomRect>& user_rects = atlas->CustomRects;
|
|
|
IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.
|
|
|
|
|
|
ImVector<stbrp_rect> pack_rects;
|
|
|
@@ -2151,7 +2159,7 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)
|
|
|
{
|
|
|
IM_ASSERT(atlas->CustomRectIds[0] >= 0);
|
|
|
IM_ASSERT(atlas->TexPixelsAlpha8 != NULL);
|
|
|
- ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]];
|
|
|
+ ImFontAtlasCustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]];
|
|
|
IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID);
|
|
|
IM_ASSERT(r.IsPacked());
|
|
|
|
|
|
@@ -2186,7 +2194,7 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
|
|
|
// Register custom rectangle glyphs
|
|
|
for (int i = 0; i < atlas->CustomRects.Size; i++)
|
|
|
{
|
|
|
- const ImFontAtlas::CustomRect& r = atlas->CustomRects[i];
|
|
|
+ const ImFontAtlasCustomRect& r = atlas->CustomRects[i];
|
|
|
if (r.Font == NULL || r.ID > 0x10000)
|
|
|
continue;
|
|
|
|
|
|
@@ -2200,6 +2208,23 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
|
|
|
for (int i = 0; i < atlas->Fonts.Size; i++)
|
|
|
if (atlas->Fonts[i]->DirtyLookupTables)
|
|
|
atlas->Fonts[i]->BuildLookupTable();
|
|
|
+
|
|
|
+ // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
|
|
|
+ // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
|
|
|
+ // FIXME: Also note that 0x2026 is currently seldomly included in our font ranges. Because of this we are more likely to use three individual dots.
|
|
|
+ for (int i = 0; i < atlas->Fonts.size(); i++)
|
|
|
+ {
|
|
|
+ ImFont* font = atlas->Fonts[i];
|
|
|
+ if (font->EllipsisChar != (ImWchar)-1)
|
|
|
+ continue;
|
|
|
+ const ImWchar ellipsis_variants[] = { (ImWchar)0x2026, (ImWchar)0x0085 };
|
|
|
+ for (int j = 0; j < IM_ARRAYSIZE(ellipsis_variants); j++)
|
|
|
+ if (font->FindGlyphNoFallback(ellipsis_variants[j]) != NULL) // Verify glyph exists
|
|
|
+ {
|
|
|
+ font->EllipsisChar = ellipsis_variants[j];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Retrieve list of range (2 int per range, values are inclusive)
|
|
|
@@ -2469,6 +2494,7 @@ ImFont::ImFont()
|
|
|
FontSize = 0.0f;
|
|
|
FallbackAdvanceX = 0.0f;
|
|
|
FallbackChar = (ImWchar)'?';
|
|
|
+ EllipsisChar = (ImWchar)-1;
|
|
|
DisplayOffset = ImVec2(0.0f, 0.0f);
|
|
|
FallbackGlyph = NULL;
|
|
|
ContainerAtlas = NULL;
|
|
|
@@ -2571,7 +2597,7 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1,
|
|
|
glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x; // Bake spacing into AdvanceX
|
|
|
|
|
|
if (ConfigData->PixelSnapH)
|
|
|
- glyph.AdvanceX = (float)(int)(glyph.AdvanceX + 0.5f);
|
|
|
+ glyph.AdvanceX = IM_ROUND(glyph.AdvanceX);
|
|
|
|
|
|
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
|
|
|
DirtyLookupTables = true;
|
|
|
@@ -2698,7 +2724,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
|
|
|
}
|
|
|
|
|
|
// We ignore blank width at the end of the line (they can be skipped)
|
|
|
- if (line_width + word_width >= wrap_width)
|
|
|
+ if (line_width + word_width > wrap_width)
|
|
|
{
|
|
|
// Words that cannot possibly fit within an entire line will be cut anywhere.
|
|
|
if (word_width < wrap_width)
|
|
|
@@ -2813,8 +2839,8 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
|
|
|
if (const ImFontGlyph* glyph = FindGlyph(c))
|
|
|
{
|
|
|
float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f;
|
|
|
- pos.x = (float)(int)pos.x + DisplayOffset.x;
|
|
|
- pos.y = (float)(int)pos.y + DisplayOffset.y;
|
|
|
+ pos.x = IM_FLOOR(pos.x + DisplayOffset.x);
|
|
|
+ pos.y = IM_FLOOR(pos.y + DisplayOffset.y);
|
|
|
draw_list->PrimReserve(6, 4);
|
|
|
draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col);
|
|
|
}
|
|
|
@@ -2823,11 +2849,11 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
|
|
|
void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const
|
|
|
{
|
|
|
if (!text_end)
|
|
|
- text_end = text_begin + strlen(text_begin); // ImGui functions generally already provides a valid text_end, so this is merely to handle direct calls.
|
|
|
+ text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls.
|
|
|
|
|
|
// Align to be pixel perfect
|
|
|
- pos.x = (float)(int)pos.x + DisplayOffset.x;
|
|
|
- pos.y = (float)(int)pos.y + DisplayOffset.y;
|
|
|
+ pos.x = IM_FLOOR(pos.x + DisplayOffset.x);
|
|
|
+ pos.y = IM_FLOOR(pos.y + DisplayOffset.y);
|
|
|
float x = pos.x;
|
|
|
float y = pos.y;
|
|
|
if (y > clip_rect.w)
|
|
|
@@ -3018,42 +3044,26 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
|
|
|
// - RenderArrowPointingAt()
|
|
|
// - RenderRectFilledRangeH()
|
|
|
// - RenderRectFilledWithHole()
|
|
|
-// - RenderPixelEllipsis()
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-void ImGui::RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor)
|
|
|
+void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
|
|
|
{
|
|
|
if (mouse_cursor == ImGuiMouseCursor_None)
|
|
|
return;
|
|
|
IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
|
|
|
|
|
|
- const ImU32 col_shadow = IM_COL32(0, 0, 0, 48);
|
|
|
- const ImU32 col_border = IM_COL32(0, 0, 0, 255); // Black
|
|
|
- const ImU32 col_fill = IM_COL32(255, 255, 255, 255); // White
|
|
|
-
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
- ImFontAtlas* font_atlas = g.IO.Fonts;
|
|
|
+ ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas;
|
|
|
ImVec2 offset, size, uv[4];
|
|
|
if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
|
|
|
{
|
|
|
pos -= offset;
|
|
|
const ImTextureID tex_id = font_atlas->TexID;
|
|
|
-
|
|
|
- // We need to account for the possibility of the mouse cursor straddling multiple viewports...
|
|
|
- for (int viewport_n = 0; viewport_n < g.Viewports.Size; viewport_n++)
|
|
|
- {
|
|
|
- ImGuiViewportP* viewport = g.Viewports[viewport_n];
|
|
|
- if (!viewport->GetRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale)))
|
|
|
- continue;
|
|
|
-
|
|
|
- ImDrawList* draw_list = GetForegroundDrawList(viewport);
|
|
|
- draw_list->PushTextureID(tex_id);
|
|
|
- draw_list->AddImage(tex_id, pos + ImVec2(1,0)*scale, pos + ImVec2(1,0)*scale + size*scale, uv[2], uv[3], col_shadow);
|
|
|
- draw_list->AddImage(tex_id, pos + ImVec2(2,0)*scale, pos + ImVec2(2,0)*scale + size*scale, uv[2], uv[3], col_shadow);
|
|
|
- draw_list->AddImage(tex_id, pos, pos + size*scale, uv[2], uv[3], col_border);
|
|
|
- draw_list->AddImage(tex_id, pos, pos + size*scale, uv[0], uv[1], col_fill);
|
|
|
- draw_list->PopTextureID();
|
|
|
- }
|
|
|
+ draw_list->PushTextureID(tex_id);
|
|
|
+ draw_list->AddImage(tex_id, pos + ImVec2(1, 0)*scale, pos + ImVec2(1, 0)*scale + size*scale, uv[2], uv[3], col_shadow);
|
|
|
+ draw_list->AddImage(tex_id, pos + ImVec2(2, 0)*scale, pos + ImVec2(2, 0)*scale + size*scale, uv[2], uv[3], col_shadow);
|
|
|
+ draw_list->AddImage(tex_id, pos, pos + size*scale, uv[2], uv[3], col_border);
|
|
|
+ draw_list->AddImage(tex_id, pos, pos + size*scale, uv[0], uv[1], col_fill);
|
|
|
+ draw_list->PopTextureID();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -3165,18 +3175,6 @@ void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, ImRect outer, ImRect
|
|
|
if (fill_R && fill_D) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Max.y), ImVec2(outer.Max.x, outer.Max.y), col, rounding, ImDrawCornerFlags_BotRight);
|
|
|
}
|
|
|
|
|
|
-// FIXME: Rendering an ellipsis "..." is a surprisingly tricky problem for us... we cannot rely on font glyph having it,
|
|
|
-// and regular dot are typically too wide. If we render a dot/shape ourselves it comes with the risk that it wouldn't match
|
|
|
-// the boldness or positioning of what the font uses...
|
|
|
-void ImGui::RenderPixelEllipsis(ImDrawList* draw_list, ImVec2 pos, int count, ImU32 col)
|
|
|
-{
|
|
|
- ImFont* font = draw_list->_Data->Font;
|
|
|
- const float font_scale = draw_list->_Data->FontSize / font->FontSize;
|
|
|
- pos.y += (float)(int)(font->DisplayOffset.y + font->Ascent * font_scale + 0.5f - 1.0f);
|
|
|
- for (int dot_n = 0; dot_n < count; dot_n++)
|
|
|
- draw_list->AddRectFilled(ImVec2(pos.x + dot_n * 2.0f, pos.y), ImVec2(pos.x + dot_n * 2.0f + 1.0f, pos.y + 1.0f), col);
|
|
|
-}
|
|
|
-
|
|
|
//-----------------------------------------------------------------------------
|
|
|
// [SECTION] Decompression code
|
|
|
//-----------------------------------------------------------------------------
|
|
|
@@ -3237,9 +3235,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns
|
|
|
{
|
|
|
const unsigned long ADLER_MOD = 65521;
|
|
|
unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;
|
|
|
- unsigned long blocklen, i;
|
|
|
+ unsigned long blocklen = buflen % 5552;
|
|
|
|
|
|
- blocklen = buflen % 5552;
|
|
|
+ unsigned long i;
|
|
|
while (buflen) {
|
|
|
for (i=0; i + 7 < blocklen; i += 8) {
|
|
|
s1 += buffer[0], s2 += s1;
|
|
|
@@ -3266,10 +3264,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns
|
|
|
|
|
|
static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/)
|
|
|
{
|
|
|
- unsigned int olen;
|
|
|
if (stb__in4(0) != 0x57bC0000) return 0;
|
|
|
if (stb__in4(4) != 0) return 0; // error! stream is > 4GB
|
|
|
- olen = stb_decompress_length(i);
|
|
|
+ const unsigned int olen = stb_decompress_length(i);
|
|
|
stb__barrier_in_b = i;
|
|
|
stb__barrier_out_e = output + olen;
|
|
|
stb__barrier_out_b = output;
|